diff --git a/enginecustom/imgui.ini b/enginecustom/imgui.ini index 6de8ef6..5b525d9 100644 --- a/enginecustom/imgui.ini +++ b/enginecustom/imgui.ini @@ -22,15 +22,15 @@ DockId=0x00000009,0 [Window][Objects] Pos=0,19 -Size=251,774 +Size=15,22 Collapsed=0 -DockId=0x0000000B,1 +DockId=0x0000000B,0 [Window][Terrain] Pos=0,19 -Size=251,774 +Size=15,22 Collapsed=0 -DockId=0x0000000B,0 +DockId=0x0000000B,1 [Window][Log Window] Pos=0,630 diff --git a/enginecustom/src/inc/system/imguiManager.h b/enginecustom/src/inc/system/imguiManager.h index 50a254b..b5c62ef 100644 --- a/enginecustom/src/inc/system/imguiManager.h +++ b/enginecustom/src/inc/system/imguiManager.h @@ -39,6 +39,12 @@ struct ComponentEntry { std::function addFunc; }; +struct CachedEntity +{ + std::string name; + int id; +}; + class imguiManager { public: @@ -175,6 +181,10 @@ private: // --------------------------------------------- // // ----------------- Functions ----------------- // // --------------------------------------------- // + /** + * Update the cached entity list if there is a new, delete or rename entity + */ + void UpdateCachedEntitiesIfNeeded(); // --------------------------------------------- // // ----------------- Variables ----------------- // @@ -232,6 +242,8 @@ private: std::string version_driver_; ecs::EntityID m_selected_entity_id = 0; // ID of the currently selected entity + std::vector cachedEntities_; + bool entityListDirty = true; int BUILD_VERSION_VER = -1; }; diff --git a/enginecustom/src/src/system/imguiManager.cpp b/enginecustom/src/src/system/imguiManager.cpp index c3b95fb..274c52b 100644 --- a/enginecustom/src/src/system/imguiManager.cpp +++ b/enginecustom/src/src/system/imguiManager.cpp @@ -502,6 +502,8 @@ void imguiManager::WidgetAddObject() // Remplacer les antislashs par des slashs std::replace(relativePath.begin(), relativePath.end(), L'\\', L'/'); app_->add_kobject(relativePath); + // set entities list as dirty + entityListDirty = true; } } @@ -596,32 +598,26 @@ void imguiManager::WidgetObjectWindow() // Remplacer les antislashs par des slashs std::replace(relativePath.begin(), relativePath.end(), L'\\', L'/'); app_->add_kobject(relativePath); + // set list as dirty since new entity has been added to the scene + entityListDirty = true; } } } S_LINE TEXT_V("Number of cubes: %d", entity_manager_->GetEntityCount()) SEP - - auto entities = entity_manager_->GetAllEntities(); + + UpdateCachedEntitiesIfNeeded(); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing,ImVec2(4,2)); - for (auto& entity : entities) + for (auto& cachedEntitie : cachedEntities_) { - auto identity = entity->GetComponent(); - if (identity) + bool isSelected = (cachedEntitie.id == m_selected_entity_id); + if (SEL(cachedEntitie.name.c_str(), isSelected)) { - std::string name = identity->GetName(); - if (name.empty()) name = "Entity #" + std::to_string(identity->GetId()); - // avoid same label by adding the ID at the end - name += "##" + std::to_string(identity->GetId()); - bool isSelected = (entity->GetID() == m_selected_entity_id); - if (SEL(name.c_str(), isSelected)) - { - m_selected_entity_id = entity->GetID(); - show_inspector_window_ = true; - } + m_selected_entity_id = cachedEntitie.id; + show_inspector_window_ = true; } } @@ -668,6 +664,7 @@ void imguiManager::WidgetInspectorWindow() entity_manager_->DestroyEntity(m_selected_entity_id); m_selected_entity_id = -1; show_inspector_window_ = false; + entityListDirty = true; } S_LINE @@ -1223,3 +1220,19 @@ void imguiManager::WidgetRenderStats() END } +void imguiManager::UpdateCachedEntitiesIfNeeded() { + if (!entityListDirty) return; + cachedEntities_.clear(); + auto entities = entity_manager_->GetAllEntities(); + for (auto& entity : entities) { + auto identity = entity->GetComponent(); + if (identity) { + std::string name = identity->GetName(); + auto id = identity->GetId(); + if (name.empty()) + name = "Entity " + std::to_string(identity->GetId()); + cachedEntities_.push_back({name,id}); + } + } + entityListDirty = false; +} \ No newline at end of file diff --git a/x64/Debug/config.txt b/x64/Debug/config.txt index 2ebee15..77c665a 100644 --- a/x64/Debug/config.txt +++ b/x64/Debug/config.txt @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b46f4a4e6dbada13398ff80f6056ead533d97b6485ba905f470333eb247ea4ee +oid sha256:844d37e56d8020360b0ba0507c8c450508001232980e7d0792367356ec4b1f55 size 9 diff --git a/x64/Release/config.txt b/x64/Release/config.txt index 2ebee15..77c665a 100644 --- a/x64/Release/config.txt +++ b/x64/Release/config.txt @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b46f4a4e6dbada13398ff80f6056ead533d97b6485ba905f470333eb247ea4ee +oid sha256:844d37e56d8020360b0ba0507c8c450508001232980e7d0792367356ec4b1f55 size 9