60 std::vector<std::string> messageLog;
68 void addGroup(Group mGroup)
override {
69 Entity::addGroup(mGroup);
70 manager.AddToGroup(
this, mGroup);
77 void update(
float deltaTime)
81 Entity::update(deltaTime);
84 void updatePorts(
float deltaTime)
override {
90 glm::vec3 m_position = glm::vec3(-tr->size.x / 2, 0.0f, 0.0f);
92 if (children[
"leftPort"]) {
94 children[
"leftPort"]->update(deltaTime);
97 m_position = glm::vec3(tr->size.x / 2, 0.0f, 0.0f);
99 if (children[
"rightPort"]) {
101 children[
"rightPort"]->update(deltaTime);
104 m_position = glm::vec3(0.0f, -tr->size.y / 2.0f, 0.0f);
106 if (children[
"topPort"]) {
108 children[
"topPort"]->update(deltaTime);
111 m_position = glm::vec3(0.0f, tr->size.y / 2.0f, 0.0f);
113 if (children[
"bottomPort"]) {
115 children[
"bottomPort"]->update(deltaTime);
119 void cellUpdate()
override{
120 if (this->ownerCell) {
123 Cell* newCell = manager.grid->getCell(*
this, manager.grid->getGridLevel());
124 if (newCell != this->ownerCell) {
125 std::scoped_lock lock(manager.movedNodesMutex);
127 manager.grid->addNode(
this, newCell);
129 manager.movedNodes.push_back(
this);
131 for (
auto& link : inLinks) {
132 link->updateArrowHeads();
134 for (
auto& link : outLinks) {
135 link->updateArrowHeads();
140 void addMessage(std::string mMessage)
override{
141 messageLog.push_back(mMessage);
144 void imgui_print()
override {
145 glm::vec2 position = this->GetComponent<TransformComponent>().getPosition();
146 ImGui::Text(
"Position: (%.2f, %.2f)", position.x, position.y);
149 if (ImGui::BeginTable(
"GroupsTable", 1, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
150 ImGui::TableSetupColumn(
"Message Log", ImGuiTableColumnFlags_WidthStretch);
152 ImGui::TableHeadersRow();
153 for (
auto str : messageLog) {
154 ImGui::TableNextRow();
155 ImGui::TableSetColumnIndex(0);
156 ImGui::Text(
"%s", str.c_str());
164 void imgui_display()
override {
165 ImGui::Text(
"Display Info Here Node");
170 manager.aboutTo_updateActiveEntities();
176 auto& leftPort = getManager()->addEntityNoId<
Empty>();
177 glm::vec3 m_position = glm::vec3(-tr->size.x / 2, 0.0f, 0.0f);
179 children[
"leftPort"] = &leftPort;
180 children[
"leftPort"]->setParentEntity(
this);
181 children[
"leftPort"]->GetComponent<
TransformComponent>().bodyCenter = tr->bodyCenter + m_position;
183 auto& rightPort = getManager()->addEntityNoId<
Empty>();
184 m_position = glm::vec3(tr->size.x / 2 , 0.0f, 0.0f);
186 children[
"rightPort"] = &rightPort;
187 children[
"rightPort"]->setParentEntity(
this);
188 children[
"rightPort"]->GetComponent<
TransformComponent>().bodyCenter = tr->bodyCenter + m_position;
191 auto& topPort = getManager()->addEntityNoId<
Empty>();
192 m_position = glm::vec3(0.0f, -tr->size.y / 2.0f, 0.0f);
194 children[
"topPort"] = &topPort;
195 children[
"topPort"]->setParentEntity(
this);
196 children[
"topPort"]->GetComponent<
TransformComponent>().bodyCenter = tr->bodyCenter + m_position;
199 auto& bottomPort = getManager()->addEntityNoId<
Empty>();
200 m_position = glm::vec3(0.0f, tr->size.y / 2.0f, 0.0f);
202 children[
"bottomPort"] = &bottomPort;
203 children[
"bottomPort"]->setParentEntity(
this);
204 children[
"bottomPort"]->GetComponent<
TransformComponent>().bodyCenter = tr->bodyCenter + m_position;
209 for (
auto portName : {
"leftPort",
"rightPort",
"topPort",
"bottomPort" }) {
210 if (children[portName]) {
211 children.erase(portName);
231 Link(
Manager& mManager,
unsigned int mfromId,
unsigned int mtoId)
234 from =
dynamic_cast<NodeEntity*
>(mManager.getEntityFromId(fromId));
235 from->addOutLink(
this);
236 to =
dynamic_cast<NodeEntity*
>(mManager.getEntityFromId(toId));
245 fromId = from->getId();
254 fromId = from->getId();
258 void addGroup(Group mGroup)
override {
259 Entity::addGroup(mGroup);
260 manager.AddLinkToGroup(
this, mGroup);
267 void update(
float deltaTime)
override
269 Entity::update(deltaTime);
274 void cellUpdate()
override {
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);
282 const auto& ownerFront = ownerCells.front();
283 const auto& ownerBack = ownerCells.back();
285 if (fromCell != ownerFront
286 || toCell != ownerBack)
290 manager.grid->addLink(
this, manager.grid->getGridLevel());
296 void updateArrowHeads()
override {
297 if (children[
"ArrowHead"]) {
300 children[
"ArrowHead"]->update(0.0f);
308 glm::vec3 direction = toPortTR->getCenterTransform() - fromPortTR->getCenterTransform();
310 glm::vec3 unitDirection = glm::normalize(direction);
311 float offset = 10.0f;
313 glm::vec3 arrowHeadPos = toPortTR->getCenterTransform() - unitDirection * offset;
316 float angleRadians = -atan2(direction.y, direction.x);
317 float angleDegrees = glm::degrees(angleRadians);
319 glm::ivec3 arrowSize(10, 20, 0);
320 glm::vec3 farrowSize(10.0f, 20.0f, 0.0f);
322 glm::vec3 newArrowHeadPosition = arrowHeadPos - (farrowSize / 2.0f);
323 children[
"ArrowHead"]->GetComponent<
TransformComponent>().position = newArrowHeadPosition;
325 children[
"ArrowHead"]->GetComponent<
TransformComponent>().setRotation(glm::vec3(0.0f, 0.0f, angleRadians + glm::half_pi<float>()));
329 void updateLinkToPorts()
override{
333 fromPort = getBestPortForConnection(fromTR->getCenterTransform(), toTR->getCenterTransform());
334 toPort = getBestPortForConnection(toTR->getCenterTransform(), fromTR->getCenterTransform());
337 void addArrowHead()
override {
341 fromPort = getBestPortForConnection(fromTR->getCenterTransform(), toTR->getCenterTransform());
342 toPort = getBestPortForConnection(toTR->getCenterTransform(), fromTR->getCenterTransform());
347 glm::vec3 direction = toPortTR->getCenterTransform() - fromPortTR->getCenterTransform();
349 glm::vec3 unitDirection = glm::normalize(direction);
350 float offset = 10.0f;
352 glm::vec3 arrowHeadPos = toPortTR->getCenterTransform() - unitDirection * offset;
354 auto& temp_arrowHead = getManager()->addEntityNoId<
Empty>();
357 float angleRadians = -atan2(direction.y, direction.x);
358 float angleDegrees = glm::degrees(angleRadians);
360 glm::vec3 farrowSize(10.0f, 20.0f, 0.0f);
362 temp_arrowHead.addComponent<
TransformComponent>(arrowHeadPos - (farrowSize /2.0f), farrowSize, 1);
366 temp_arrowHead.GetComponent<
TransformComponent>().setRotation(glm::vec3(0.0f, 0.0f, angleRadians + glm::half_pi<float>()));
368 temp_arrowHead.addGroup(Manager::groupArrowHeads_0);
370 temp_arrowHead.setParentEntity(
this);
372 manager.grid->addEmpty(&temp_arrowHead, manager.grid->getGridLevel());
374 children[
"ArrowHead"] = &temp_arrowHead;
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);
386 void updateLinkToNodes()
override {
391 std::string getBestPortForConnection(
const glm::vec3& fromPos,
const glm::vec3& toPos) {
393 float deltaX = toPos.x - fromPos.x;
394 float deltaY = toPos.y - fromPos.y;
396 if (abs(deltaX) > abs(deltaY)) {
397 return deltaX > 0 ?
"rightPort" :
"leftPort";
400 return deltaY > 0 ?
"bottomPort" :
"topPort";
407 void imgui_print()
override {
408 glm::vec2 fromNodePosition = this->getFromNode()->GetComponent<
TransformComponent>().getCenterTransform();
409 glm::vec2 toNodePosition = this->getToNode()->GetComponent<
TransformComponent>().getCenterTransform();
411 ImGui::Text(
"From Node Position: (%.2f, %.2f)", fromNodePosition.x, fromNodePosition.y);
412 ImGui::Text(
"To Node Position: (%.2f, %.2f)", toNodePosition.x, toNodePosition.y);
414 ImGui::Text(
"Bounding boxes of intercepted cells:");
416 for (
auto cell : ownerCells) {
417 ImGui::Text(
"- %.2f , %.2f , %.2f", cell->boundingBox_origin.x, cell->boundingBox_origin.y, cell->boundingBox_origin.z);
421 void imgui_display()
override {
422 ImGui::Text(
"Display Info Here Link");
428 if (children[
"ArrowHead"]) {
429 children[
"ArrowHead"]->destroy();
432 manager.aboutTo_updateActiveEntities();