TazGraph Project v0.1.0
Loading...
Searching...
No Matches
GECSEntityTypes.h
1#pragma once
2
3#include "GECSManager.h"
4#include "../Components.h"
5
6
7class Empty : public EmptyEntity {
8
9public:
10
11 Empty(Manager& mManager) : EmptyEntity(mManager) {
12
13 }
14
15 void addGroup(Group mGroup) override {
16 Entity::addGroup(mGroup);
17 manager.AddToGroup(this, mGroup);
18 }
19
20 virtual ~Empty() {
21
22 }
23
24 void update(float deltaTime)
25 {
26 //cellUpdate();
27
28 Entity::update(deltaTime);
29 }
30
31 void cellUpdate() override {
32 if (this->ownerCell) {
33 Cell* newCell = manager.grid->getCell(*this, manager.grid->getGridLevel());
34 if (newCell != this->ownerCell) {
35 // Need to shift the entity
36 removeEntity();
37 manager.grid->addEmpty(this, newCell);
38 }
39 }
40 }
41
42
43
44 void imgui_print() override {
45 glm::vec2 position = this->GetComponent<TransformComponent>().getPosition(); // Make sure Entity class has a getPosition method
46 ImGui::Text("Position: (%.2f, %.2f)", position.x, position.y);
47 }
48
49 void destroy() {
50 Entity::destroy();
51 manager.aboutTo_updateActiveEntities(); // cant have it at destroy in baseclass
52 // may need to also update Visible Entities
53 }
54};
55
56class Node: public NodeEntity {
57private:
58
59
60 std::vector<std::string> messageLog;
61public:
62
63 Node(Manager& mManager) : NodeEntity(mManager) {
64
65
66 }
67
68 void addGroup(Group mGroup) override {
69 Entity::addGroup(mGroup);
70 manager.AddToGroup(this, mGroup);
71 }
72
73 virtual ~Node() {
74
75 }
76
77 void update(float deltaTime)
78 {
79 //cellUpdate();
80
81 Entity::update(deltaTime);
82 }
83
84 void updatePorts(float deltaTime) override {
85 // first set the new position of port based on parent size
86 // then set its bodyPosition through the transformComponent
87
88 TransformComponent* tr = &GetComponent<TransformComponent>();
89
90 glm::vec3 m_position = glm::vec3(-tr->size.x / 2, 0.0f, 0.0f);
91
92 if (children["leftPort"]) {
93 children["leftPort"]->GetComponent<TransformComponent>().position = m_position;
94 children["leftPort"]->update(deltaTime);
95 }
96
97 m_position = glm::vec3(tr->size.x / 2, 0.0f, 0.0f);
98
99 if (children["rightPort"]) {
100 children["rightPort"]->GetComponent<TransformComponent>().position = m_position;
101 children["rightPort"]->update(deltaTime);
102 }
103
104 m_position = glm::vec3(0.0f, -tr->size.y / 2.0f, 0.0f);
105
106 if (children["topPort"]) {
107 children["topPort"]->GetComponent<TransformComponent>().position = m_position;
108 children["topPort"]->update(deltaTime);
109 }
110
111 m_position = glm::vec3(0.0f, tr->size.y / 2.0f, 0.0f);
112
113 if (children["bottomPort"]) {
114 children["bottomPort"]->GetComponent<TransformComponent>().position = m_position;
115 children["bottomPort"]->update(deltaTime);
116 }
117 }
118
119 void cellUpdate() override{
120 if (this->ownerCell) {
121 updatePorts(0.0f);
122 //this->GetComponent<TransformComponent>().update(0.0f);
123 Cell* newCell = manager.grid->getCell(*this, manager.grid->getGridLevel());
124 if (newCell != this->ownerCell) {
125 std::scoped_lock lock(manager.movedNodesMutex);
126 removeEntity();
127 manager.grid->addNode(this, newCell);
128
129 manager.movedNodes.push_back(this);
130 }
131 for (auto& link : inLinks) {
132 link->updateArrowHeads();
133 }
134 for (auto& link : outLinks) {
135 link->updateArrowHeads();
136 }
137 }
138 }
139
140 void addMessage(std::string mMessage) override{
141 messageLog.push_back(mMessage);
142 }
143
144 void imgui_print() override {
145 glm::vec2 position = this->GetComponent<TransformComponent>().getPosition(); // Make sure Entity class has a getPosition method
146 ImGui::Text("Position: (%.2f, %.2f)", position.x, position.y);
147
148
149 if (ImGui::BeginTable("GroupsTable", 1, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
150 ImGui::TableSetupColumn("Message Log", ImGuiTableColumnFlags_WidthStretch);
151
152 ImGui::TableHeadersRow();
153 for (auto str : messageLog) {
154 ImGui::TableNextRow();
155 ImGui::TableSetColumnIndex(0);
156 ImGui::Text("%s", str.c_str());
157 }
158 }
159 ImGui::EndTable();
160
161
162 }
163
164 void imgui_display() override {
165 ImGui::Text("Display Info Here Node");
166 }
167
168 void destroy() {
169 Entity::destroy();
170 manager.aboutTo_updateActiveEntities();
171 }
172
173 void addPorts() {
174 TransformComponent* tr = &GetComponent<TransformComponent>();
175
176 auto& leftPort = getManager()->addEntityNoId<Empty>();
177 glm::vec3 m_position = glm::vec3(-tr->size.x / 2, 0.0f, 0.0f);
178 leftPort.addComponent<TransformComponent>(m_position, glm::vec3(0), 1.0f);
179 children["leftPort"] = &leftPort;
180 children["leftPort"]->setParentEntity(this);
181 children["leftPort"]->GetComponent<TransformComponent>().bodyCenter = tr->bodyCenter + m_position;
182
183 auto& rightPort = getManager()->addEntityNoId<Empty>();
184 m_position = glm::vec3(tr->size.x / 2 , 0.0f, 0.0f);
185 rightPort.addComponent<TransformComponent>(m_position, glm::vec3(0), 1.0f);
186 children["rightPort"] = &rightPort;
187 children["rightPort"]->setParentEntity(this);
188 children["rightPort"]->GetComponent<TransformComponent>().bodyCenter = tr->bodyCenter + m_position;
189
190 // Initialize top port
191 auto& topPort = getManager()->addEntityNoId<Empty>();
192 m_position = glm::vec3(0.0f, -tr->size.y / 2.0f, 0.0f);
193 topPort.addComponent<TransformComponent>(m_position, glm::vec3(0), 1.0f);
194 children["topPort"] = &topPort;
195 children["topPort"]->setParentEntity(this);
196 children["topPort"]->GetComponent<TransformComponent>().bodyCenter = tr->bodyCenter + m_position;
197
198 // Initialize bottom port
199 auto& bottomPort = getManager()->addEntityNoId<Empty>();
200 m_position = glm::vec3(0.0f, tr->size.y / 2.0f, 0.0f);
201 bottomPort.addComponent<TransformComponent>(m_position, glm::vec3(0), 1.0f);
202 children["bottomPort"] = &bottomPort;
203 children["bottomPort"]->setParentEntity(this);
204 children["bottomPort"]->GetComponent<TransformComponent>().bodyCenter = tr->bodyCenter + m_position;
205
206 }
207
208 void removePorts() {
209 for (auto portName : { "leftPort", "rightPort", "topPort", "bottomPort" }) {
210 if (children[portName]) {
211 children.erase(portName);
212 }
213 }
214 }
215};
216
217
218class Link : public LinkEntity {
219private:
220
221
222
223public:
224
225
226 Color color = {};
227
228 Link(Manager& mManager) : LinkEntity(mManager) {
229 }
230
231 Link(Manager& mManager, unsigned int mfromId, unsigned int mtoId)
232 : LinkEntity(mManager, mfromId, mtoId)
233 {
234 from = dynamic_cast<NodeEntity*>(mManager.getEntityFromId(fromId));
235 from->addOutLink(this);
236 to = dynamic_cast<NodeEntity*>(mManager.getEntityFromId(toId));
237 to->addInLink(this);
238 }
239
240 Link(Manager& mManager, Entity* mfrom, Entity* mto)
241 : LinkEntity(mManager,
242 dynamic_cast<NodeEntity*>(mfrom), // it is node but cant see it due to getParentEntity
243 dynamic_cast<NodeEntity*>(mto))
244 {
245 fromId = from->getId();
246 toId = to->getId();
247 }
248
249 Link(Manager& mManager, NodeEntity* mfrom, NodeEntity* mto)
250 : LinkEntity(mManager,
251 mfrom,
252 mto)
253 {
254 fromId = from->getId();
255 toId = to->getId();
256 }
257
258 void addGroup(Group mGroup) override {
259 Entity::addGroup(mGroup);
260 manager.AddLinkToGroup(this, mGroup);
261 }
262
263 virtual ~Link() {
264
265 }
266
267 void update(float deltaTime) override
268 {
269 Entity::update(deltaTime);
270
271
272 }
273
274 void cellUpdate() override {
275 // if cell(or position) of fromNode or cell(or position) of toNode is different than
276 // the saved cells in ownerCells then update it
277 if (!ownerCells.empty()) {
278 auto level = manager.grid->getGridLevel();
279 const auto& fromCell = manager.grid->getCell(*getFromNode(), level);
280 const auto& toCell = manager.grid->getCell(*getToNode(), level);
281
282 const auto& ownerFront = ownerCells.front();
283 const auto& ownerBack = ownerCells.back();
284
285 if (fromCell != ownerFront
286 || toCell != ownerBack)
287 {
288 removeFromCells();
289
290 manager.grid->addLink(this, manager.grid->getGridLevel());
291 }
292 }
293
294 }
295
296 void updateArrowHeads() override {
297 if (children["ArrowHead"]) {
298 TransformComponent* tr = &children["ArrowHead"]->GetComponent<TransformComponent>();
299
300 children["ArrowHead"]->update(0.0f);
301
302 // set position of arrowHead
303 TransformComponent* ch_tr = &to->children[toPort]->GetComponent<TransformComponent>();
304
305 TransformComponent* toPortTR = ch_tr;
306 TransformComponent* fromPortTR = &from->children[fromPort]->GetComponent<TransformComponent>();
307
308 glm::vec3 direction = toPortTR->getCenterTransform() - fromPortTR->getCenterTransform();
309
310 glm::vec3 unitDirection = glm::normalize(direction);
311 float offset = 10.0f;
312
313 glm::vec3 arrowHeadPos = toPortTR->getCenterTransform() - unitDirection * offset;
314
315 // Calculate the angle in radians, and convert it to degrees
316 float angleRadians = -atan2(direction.y, direction.x);
317 float angleDegrees = glm::degrees(angleRadians);
318
319 glm::ivec3 arrowSize(10, 20, 0);
320 glm::vec3 farrowSize(10.0f, 20.0f, 0.0f);
321
322 glm::vec3 newArrowHeadPosition = arrowHeadPos - (farrowSize / 2.0f);
323 children["ArrowHead"]->GetComponent<TransformComponent>().position = newArrowHeadPosition;
324
325 children["ArrowHead"]->GetComponent<TransformComponent>().setRotation(glm::vec3(0.0f, 0.0f, angleRadians + glm::half_pi<float>()));
326 }
327 }
328
329 void updateLinkToPorts() override{
330 TransformComponent* toTR = &to->GetComponent<TransformComponent>();
331 TransformComponent* fromTR = &from->GetComponent<TransformComponent>();
332
333 fromPort = getBestPortForConnection(fromTR->getCenterTransform(), toTR->getCenterTransform());
334 toPort = getBestPortForConnection(toTR->getCenterTransform(), fromTR->getCenterTransform());
335 }
336
337 void addArrowHead() override {
338 TransformComponent* toTR = &to->GetComponent<TransformComponent>();
339 TransformComponent* fromTR = &from->GetComponent<TransformComponent>();
340
341 fromPort = getBestPortForConnection(fromTR->getCenterTransform(), toTR->getCenterTransform());
342 toPort = getBestPortForConnection(toTR->getCenterTransform(), fromTR->getCenterTransform());
343
344 TransformComponent* toPortTR = &to->children[toPort]->GetComponent<TransformComponent>();
345 TransformComponent* fromPortTR = &from->children[fromPort]->GetComponent<TransformComponent>();
346
347 glm::vec3 direction = toPortTR->getCenterTransform() - fromPortTR->getCenterTransform();
348
349 glm::vec3 unitDirection = glm::normalize(direction);
350 float offset = 10.0f;
351
352 glm::vec3 arrowHeadPos = toPortTR->getCenterTransform() - unitDirection * offset;
353
354 auto& temp_arrowHead = getManager()->addEntityNoId<Empty>();
355
356 // Calculate the angle in radians, and convert it to degrees
357 float angleRadians = -atan2(direction.y, direction.x);
358 float angleDegrees = glm::degrees(angleRadians);
359
360 glm::vec3 farrowSize(10.0f, 20.0f, 0.0f);
361
362 temp_arrowHead.addComponent<TransformComponent>(arrowHeadPos - (farrowSize /2.0f), farrowSize, 1);
363 temp_arrowHead.addComponent<Triangle_w_Color>();
364 temp_arrowHead.GetComponent<Triangle_w_Color>().color = Color(0, 0, 0, 255);
365
366 temp_arrowHead.GetComponent<TransformComponent>().setRotation(glm::vec3(0.0f, 0.0f, angleRadians + glm::half_pi<float>()));
367
368 temp_arrowHead.addGroup(Manager::groupArrowHeads_0);
369
370 temp_arrowHead.setParentEntity(this);
371
372 manager.grid->addEmpty(&temp_arrowHead, manager.grid->getGridLevel());
373
374 children["ArrowHead"] = &temp_arrowHead;
375 }
376
377 void removeArrowHead() override {
378 std::string portName = "ArrowHead";
379 if (children[portName]) {
380 children[portName]->removeFromCell();
381 children[portName]->destroy();
382 children.erase(portName);
383 }
384 }
385
386 void updateLinkToNodes() override {
387 fromPort = "";
388 toPort = "";
389 }
390
391 std::string getBestPortForConnection(const glm::vec3& fromPos, const glm::vec3& toPos) {
392 // Simple logic to determine the port based on relative position
393 float deltaX = toPos.x - fromPos.x;
394 float deltaY = toPos.y - fromPos.y;
395
396 if (abs(deltaX) > abs(deltaY)) { // Horizontal distance is greater
397 return deltaX > 0 ? "rightPort" : "leftPort";
398 }
399 else { // Vertical distance is greater
400 return deltaY > 0 ? "bottomPort" : "topPort";
401 }
402 }
403
404
405
406
407 void imgui_print() override {
408 glm::vec2 fromNodePosition = this->getFromNode()->GetComponent<TransformComponent>().getCenterTransform();
409 glm::vec2 toNodePosition = this->getToNode()->GetComponent<TransformComponent>().getCenterTransform();
410
411 ImGui::Text("From Node Position: (%.2f, %.2f)", fromNodePosition.x, fromNodePosition.y);
412 ImGui::Text("To Node Position: (%.2f, %.2f)", toNodePosition.x, toNodePosition.y);
413
414 ImGui::Text("Bounding boxes of intercepted cells:");
415
416 for (auto cell : ownerCells) {
417 ImGui::Text("- %.2f , %.2f , %.2f", cell->boundingBox_origin.x, cell->boundingBox_origin.y, cell->boundingBox_origin.z);
418 }
419 }
420
421 void imgui_display() override {
422 ImGui::Text("Display Info Here Link");
423 }
424
425 void destroy() {
426 Entity::destroy();
427
428 if (children["ArrowHead"]) {
429 children["ArrowHead"]->destroy();
430 }
431
432 manager.aboutTo_updateActiveEntities();
433 }
434
435};
Definition GECSEntity.h:7
Definition GECSEntityTypes.h:7
Definition GECS.h:140
Definition GECSEntity.h:90
Definition GECSManager.h:14
Definition GECSEntity.h:43
Definition GECSEntityTypes.h:56
Definition TransformComponent.h:6
Definition Triangle_w_Color.h:6
Definition CellEntity.h:5
Definition Vertex.h:47