From 8ebc96a9f1ec3f18423aba6a2f9aea0bbaa93fb4 Mon Sep 17 00:00:00 2001 From: Pierre Delaunay Date: Fri, 15 Mar 2024 22:18:53 -0400 Subject: [PATCH] ECS attempt --- src/tide/ast_input.cpp | 35 ++++++++++++++++++++------------- src/tide/ast_render.cpp | 22 +++++++++++++-------- src/tide/ast_render.h | 31 ++++++++++++++++++----------- src/tide/ast_render_visitor.cpp | 4 ++-- 4 files changed, 57 insertions(+), 35 deletions(-) diff --git a/src/tide/ast_input.cpp b/src/tide/ast_input.cpp index 4abf8bbb..3dc03ac6 100644 --- a/src/tide/ast_input.cpp +++ b/src/tide/ast_input.cpp @@ -51,6 +51,10 @@ void ASTEditor::input(float dt) { renderer.drawings.clear(); renderer.groups.clear(); renderer.edit_order.clear(); + for(auto entity: renderer.entities) { + entity.destruct(); + } + renderer.entities.clear(); renderer.cursor = renderer.start; // renderer.run(module); }; @@ -77,24 +81,24 @@ void ASTEditor::input(float dt) { // this->input_buffer.pop_back(); if (this->index >= 0 && !renderer.edit_order.empty()) { int idx = renderer.edit_order[this->index]; - Group& group = renderer.groups[idx]; + Group* group = renderer.groups[idx].get_mut(); - if (group.backspace) { - group.backspace(); + if (group->backspace) { + group->backspace(); } } }); if (this->index >= 0 && !renderer.edit_order.empty()) { int idx = renderer.edit_order[this->index]; - Group& group = renderer.groups[idx]; + Group* group = renderer.groups[idx].get_mut(); if (io.InputQueueCharacters.Size > 0) { for (int n = 0; n < io.InputQueueCharacters.Size; n++) { unsigned int c = (unsigned int)io.InputQueueCharacters[n]; // input_buffer.push_back(c); - if (group.input) { - group.input(c); + if (group->input) { + group->input(c); } } io.InputQueueCharacters.resize(0); @@ -137,7 +141,8 @@ void ASTEditor::test() { }; ImDrawList* drawlist = ImGui::GetWindowDrawList(); - for (Group& group: renderer.groups) { + // for (Group* group: renderer.groups) + { // drawlist->AddRect(group.rectangle.Min, group.rectangle.Max, ImColor(255, 255, 255), 0, 0, // 1); @@ -146,15 +151,17 @@ void ASTEditor::test() { Group* body = nullptr; Group* expr = nullptr; int i = 0; - for (Group& group: renderer.groups) { - if (group.rectangle.Contains(pos)) { - if (group.body != nullptr) { - body = &group; + for (auto entity: renderer.groups) { + Group* group = entity.get_mut(); + + if (group->rectangle.Contains(pos)) { + if (group->body != nullptr) { + body = group; break; } if (expr == nullptr) { - expr = &group; + expr = group; if (ImGui::IsMouseClicked(ImGuiMouseButton_Left)) { index = expr->edit_id; @@ -318,7 +325,7 @@ void ASTEditor::draw(float dt) { drawlist->AddRectFilled(pos, pos + size, ImColor(0, 0, 0), 0, 0); } - Group* group = &renderer.groups[k]; + Group* group = renderer.groups[k].get_mut(); ImGui::SetCursorPos(pos); ImGui::Text("Group %3d (%3d:%2d) -> (%3d:%2d)", group->id, @@ -342,7 +349,7 @@ void ASTEditor::draw(float dt) { if (renderer.edit_order.size() > 0) { int idx = renderer.edit_order[clamp(index, 0, int(renderer.edit_order.size()) - 1)]; if (idx >= 0) { - Group* selected = &renderer.groups[clamp(idx, 0, int(renderer.groups.size()) - 1)]; + Group* selected = renderer.groups[clamp(idx, 0, int(renderer.groups.size()) - 1)].get_mut(); drawlist->AddRect( selected->rectangle.Min, selected->rectangle.Max, ImColor(255, 0, 0), 0, 0, 1); diff --git a/src/tide/ast_render.cpp b/src/tide/ast_render.cpp index 4a63f1d9..7bd33657 100644 --- a/src/tide/ast_render.cpp +++ b/src/tide/ast_render.cpp @@ -66,11 +66,17 @@ void Drawing::input() { } Drawing* ASTRender::new_drawing() { - Drawing& drawing = drawings.emplace_back(); - drawing.id = drawings.size(); - drawing.style = style; - drawing.node = stack[stack.size() - 1]; - return &drawing; + flecs::entity entity = get_ecs().entity().add(); + entities.push_back(entity); + + Drawing* drawing = entity.get_mut(); + drawings.push_back(entity); + + drawing->id = drawings.size(); + drawing->style = style; + drawing->node = stack[stack.size() - 1]; + + return drawing; } Drawing* ASTRender::text(const char* name, ImColor color) { @@ -91,9 +97,9 @@ Drawing* ASTRender::text(const char* name, ImColor color) { } void ASTRender::draw() { - for (auto& drawing: drawings) { - drawing.input(); - drawing.draw(); + for (flecs::entity& entity: drawings) { + entity.get_mut()->input(); + entity.get_mut()->draw(); } } diff --git a/src/tide/ast_render.h b/src/tide/ast_render.h index a80a3905..23424eff 100644 --- a/src/tide/ast_render.h +++ b/src/tide/ast_render.h @@ -135,18 +135,27 @@ struct ASTRender: public BaseVisitor { int _indent = 0; bool _redraw = false; - flecs::world ecs; - Array drawings; - Array groups; - Array stack; - Array edit_order; + + flecs::world& get_ecs() { + static flecs::world ecs; + return ecs; + } + Array drawings; + Array groups; + Array stack; + Array edit_order; + Array entities; Group* new_group() { - Group& grp = groups.emplace_back(); - grp.id = int(groups.size()); + flecs::entity entity = get_ecs().entity() + .add(); + + entities.push_back(entity); - flecs::entity newgrp = ecs.entity(grp.id); - return &grp; + Group* grp = entity.get_mut(); + groups.push_back(entity); + grp->id = int(groups.size()); + return grp; } Drawing* new_drawing(); @@ -187,11 +196,11 @@ struct ASTRender: public BaseVisitor { Group* group = new_group(); group->node = node; int new_count = int(drawings.size()); - group->rectangle = drawings[old_count].rectangle; + group->rectangle = drawings[old_count].get_mut()->rectangle; group->edit_id = edit_entry; for (int i = old_count; i < new_count; i++) { - group->rectangle.Add(drawings[i].rectangle); + group->rectangle.Add(drawings[i].get_mut()->rectangle); } edit_order[edit_entry] = group->id - 1; diff --git a/src/tide/ast_render_visitor.cpp b/src/tide/ast_render_visitor.cpp index de4732e6..667bdc6a 100644 --- a/src/tide/ast_render_visitor.cpp +++ b/src/tide/ast_render_visitor.cpp @@ -91,9 +91,9 @@ LY_ReturnType ASTRender::render_body(Array & body, int depth, bool pr my_group->body = &body; my_group->edit_id = edit_entry; int new_count = drawings.size(); - my_group->rectangle = drawings[old_count].rectangle; + my_group->rectangle = drawings[old_count].get_mut()->rectangle; for (int i = old_count; i < new_count; i++) { - my_group->rectangle.Add(drawings[i].rectangle); + my_group->rectangle.Add(drawings[i].get_mut()->rectangle); } edit_order[edit_entry] = my_group->id - 1;