18 int negativeEntityId = -1;
19 std::vector<std::unique_ptr<Entity>> entities;
21 std::array<std::vector<EmptyEntity*>, maxGroups> groupedEmptyEntities;
22 std::array<std::vector<NodeEntity*>, maxGroups> groupedNodeEntities;
23 std::array<std::vector<LinkEntity*>, maxGroups> groupedLinkEntities;
27 std::array<std::vector<EmptyEntity*>, maxGroups> visible_groupedEmptyEntities;
28 std::array<std::vector<NodeEntity*>, maxGroups> visible_groupedNodeEntities;
29 std::array<std::vector<LinkEntity*>, maxGroups> visible_groupedLinkEntities;
31 bool _update_active_entities =
false;
34 std::vector<NodeEntity*> movedNodes;
35 std::mutex movedNodesMutex;
37 bool arrowheadsEnabled =
false;
38 bool last_arrowheadsEnabled =
false;
40 bool updateInnerPathLinks =
false;
42 std::unordered_map<std::string, std::vector<std::string>> componentNames;
44 std::unique_ptr<Grid> grid;
50 void setThreader(
Threader& mthreader) {
51 _threader = &mthreader;
58 if (_threader && !_threader->t_queue.shuttingDown) {
81 for (
auto& e : movedNodes) {
82 updateInnerPathLinks =
true;
83 for (
auto& link : e->getInLinks()) {
86 for (
auto& link : e->getOutLinks()) {
91 _threader->parallel(movedNodes.size(), [&](
int start,
int end) {
92 for (
int i = start; i < end; i++) {
93 for (
auto& link : movedNodes[i]->getInLinks()) {
94 link->updateConnectedPorts();
99 _threader->parallel(movedNodes.size(), [&](
int start,
int end) {
100 for (
int i = start; i < end; i++) {
101 for (
auto& link : movedNodes[i]->getOutLinks()) {
102 link->updateConnectedPorts();
110 _threader->parallel(grid->visible_emptyEntities.size(), [&](
int start,
int end) {
111 for (
int i = start; i < end; i++) {
112 if (grid->visible_emptyEntities[i] && grid->visible_emptyEntities[i]->isActive()) {
113 grid->visible_emptyEntities[i]->update(deltaTime);
119 _threader->parallel(grid->visible_nodes.size(), [&](
int start,
int end) {
120 for (
int i = start; i < end; i++) {
121 if (grid->visible_nodes[i] && grid->visible_nodes[i]->isActive()) {
122 grid->visible_nodes[i]->update(deltaTime);
129 _threader->parallel(grid->visible_links.size(), [&](
int start,
int end) {
131 for (
int i = start; i < end; i++) {
132 if (grid->visible_links[i] && grid->visible_links[i]->isActive()) {
133 grid->visible_links[i]->update(deltaTime);
145 for (
auto& e : movedNodes) {
146 for (
auto& link : e->getInLinks()) {
149 for (
auto& link : e->getOutLinks()) {
154 for (
auto& e : movedNodes) {
155 for (
auto& link : e->getInLinks()) {
156 link->updateConnectedPorts();
160 for (
auto& e : movedNodes) {
161 for (
auto& link : e->getOutLinks()) {
162 link->updateConnectedPorts();
168 for (
auto& e : grid->visible_emptyEntities) {
169 if (!e || !e->isActive())
continue;
171 e->update(deltaTime);
174 if (arrowheadsEnabled) {
175 for (
auto& e : grid->visible_nodes) {
176 if (!e || !e->isActive())
continue;
178 e->update(deltaTime);
184 for (
auto& e : grid->visible_links) {
185 if (!e || !e->isActive())
continue;
187 e->update(deltaTime);
193 void updateFully(
float deltaTime = 1.0f)
196 for (
auto& e : entities) {
197 if (!e || !e->isActive())
continue;
199 e->update(deltaTime);
203 void refresh(
ICamera* camera =
nullptr)
206 if (grid && (camera->hasChanged() || grid->gridLevelChanged())) {
207 bool interceptedCellsChanged = grid->setIntersectedCameraCells(*camera);
209 if (interceptedCellsChanged) {
210 aboutTo_updateActiveEntities();
212 camera->refreshCamera();
215 if (_update_active_entities) {
216 _update_active_entities =
false;
218 updateActiveEntities();
219 updateVisibleEntities();
224 void aboutTo_updateActiveEntities() {
225 _update_active_entities =
true;
228 void updateActiveEntities();
230 void updateVisibleEntities();
232 void AddToGroup(
EmptyEntity* mEntity, Group mGroup)
234 groupedEmptyEntities[mGroup].emplace_back(mEntity);
237 void AddToGroup(
NodeEntity* mEntity, Group mGroup)
239 groupedNodeEntities[mGroup].emplace_back(mEntity);
242 void AddLinkToGroup(
LinkEntity* mEntity, Group mGroup)
244 groupedLinkEntities[mGroup].emplace_back(mEntity);
247 const std::vector<std::unique_ptr<Entity>>& getEntities()
const {
251 template <
typename T>
252 std::vector<T*> getVisible() {
253 if constexpr (std::is_same_v<T, EmptyEntity>) {
254 return grid->visible_emptyEntities;
256 else if constexpr (std::is_same_v<T, NodeEntity>) {
257 return grid->visible_nodes;
259 else if constexpr (std::is_same_v<T, LinkEntity>) {
260 return grid->visible_links;
263 static_assert(
sizeof(T) == 0,
"Unsupported entity type.");
267 template <
typename T>
268 std::vector<T*>& getVisibleGroup(Group mGroup) {
269 if constexpr (std::is_same_v<T, EmptyEntity>) {
270 return visible_groupedEmptyEntities[mGroup];
272 else if constexpr (std::is_same_v<T, NodeEntity>) {
273 return visible_groupedNodeEntities[mGroup];
275 else if constexpr (std::is_same_v<T, LinkEntity>) {
276 return visible_groupedLinkEntities[mGroup];
279 static_assert(
sizeof(T) == 0,
"Unsupported entity type.");
283 template <
typename T>
284 std::vector<T*>& getGroup(Group mGroup) {
285 if constexpr (std::is_same_v<T, EmptyEntity>) {
286 return groupedEmptyEntities[mGroup];
288 else if constexpr (std::is_same_v<T, NodeEntity>) {
289 return groupedNodeEntities[mGroup];
291 else if constexpr (std::is_same_v<T, LinkEntity>) {
292 return groupedLinkEntities[mGroup];
295 static_assert(
sizeof(T) == 0,
"Unsupported entity type.");
299 template <
typename T,
typename... TArgs>
300 T& addEntityNoId(TArgs&&... mArgs)
302 T* e(
new T(*
this, std::forward<TArgs>(mArgs)...));
303 e->setId(negativeEntityId--);
304 std::unique_ptr<T> uPtr{ e };
305 entities.emplace_back(std::move(uPtr));
310 template <
typename T,
typename... TArgs>
311 T& addEntity(TArgs&&... mArgs)
313 T* e(
new T(*
this, std::forward<TArgs>(mArgs)...));
314 e->setId(lastEntityId++);
315 std::unique_ptr<T> uPtr{ e };
316 entities.emplace_back(std::move(uPtr));
321 void resetEntityId() {
325 Entity* getEntityFromId(
unsigned int mId) {
326 for (
auto& entity : entities) {
327 if (entity->getId() == mId && entity->isActive()) {
334 void clearAllEntities() {
335 for (
auto& group : groupedNodeEntities) {
338 for (
auto& group : groupedLinkEntities) {
344 void removeAllEntites() {
345 for (std::size_t group = Manager::groupBackgroundLayer; group != Manager::buttonLabels; group++) {
346 removeAllEntitiesFromGroup(group);
347 removeAllEntitiesFromLinkGroup(group);
351 void removeAllEntitiesFromGroup(Group mGroup) {
352 auto& entitiesInGroup = groupedNodeEntities[mGroup];
354 for (
Entity* entity : entitiesInGroup) {
359 void removeAllEntitiesFromEmptyGroup(Group mGroup) {
360 auto& entitiesInGroup = groupedEmptyEntities[mGroup];
362 for (
Entity* entity : entitiesInGroup) {
367 void removeAllEntitiesFromLinkGroup(Group mGroup) {
368 auto& entitiesInGroup = groupedLinkEntities[mGroup];
370 for (
Entity* entity : entitiesInGroup) {
375 std::vector<Entity*> adjacentEntities(
Entity* mainEntity, Group group) {
376 std::vector<Entity*> nearbyEntities;
378 auto adjacentCells = grid->getAdjacentCells(*mainEntity, grid->getGridLevel());
380 for (
Cell* adjCell : adjacentCells) {
381 for (
auto& neighbor : adjCell->nodes) {
382 if (neighbor->hasGroup(group) && (neighbor != mainEntity) ) {
383 nearbyEntities.push_back(neighbor);
388 return nearbyEntities;
391 enum groupLabels : std::size_t
394 groupBackgroundLayer,
408 groupPathLinksHolder,
432 const std::unordered_map<Group, std::string> groupNames = {
433 {groupBackgroundLayer,
"groupBackgroundLayer" },
434 {panelBackground,
"panelBackground"},
437 { groupLinks_0,
"groupLinks_0" },
438 {groupGroupLinks_0,
"groupGroupLinks_0"},
439 {groupGroupLinks_1,
"groupGroupLinks_1"},
441 {groupPathLinks_0,
"groupPathLinks_0"},
442 {groupPathLinks_1,
"groupPathLinks_1"},
443 {groupPathLinks_2,
"groupPathLinks_2"},
445 {groupPathInnerLinks,
"groupPathInnerLinks"},
447 {groupPathLinksHolder,
"groupPathLinksHolder"},
449 {groupArrowHeads_0,
"groupArrowHeads_0"},
451 { groupNodes_0,
"groupNodes_0" },
452 { groupGroupNodes_0,
"groupGroupNodes_0"},
453 { groupGroupNodes_1,
"groupGroupNodes_1"},
455 { groupMinimapNodes,
"groupMinimapNodes" },
457 { groupEmpties,
"groupEmpties" },
458 { groupSphereEmpties,
"groupSphereEmpties" },
460 { groupColliders,
"groupColliders" },
461 { groupRenderSprites,
"groupRenderSprites" },
462 { groupPorts,
"groupPorts" },
463 { groupPortSlots,
"groupPortSlots" },
466 { buttonLabels,
"buttonLabels" },
469 std::string getGroupName(Group mGroup)
const;
471 void scanComponentNames(
const std::string& folderPath);
473 void setComponentNames();