2 Commits

Author SHA1 Message Date
2e33adf4a9 Minor - Améliore la gestion des entités ImGui - V14.9.0
Optimizes entity management in ImGui by deferring updates to the entity list until necessary.

Changes include:
- Sets the entity list as dirty upon adding or deleting entities to ensure the list is only updated when needed
- Changes the type of entity ID stored in CachedEntity
- Adjusts ImGui window size
2025-10-24 17:47:54 +02:00
c67a805bd7 Minor - Améliore la gestion des entités ImGui - V14.8.0
Optimizes entity list updates in the ImGui interface by caching entity names and IDs.

This reduces unnecessary string operations during rendering and improves performance, especially when dealing with a large number of entities.

The initial ImGui window size has also been reduced for performance reasons.
2025-10-24 12:00:26 +02:00
5 changed files with 46 additions and 21 deletions

View File

@@ -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

View File

@@ -39,6 +39,12 @@ struct ComponentEntry {
std::function<void()> 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<CachedEntity> cachedEntities_;
bool entityListDirty = true;
int BUILD_VERSION_VER = -1;
};

View File

@@ -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<ecs::IdentityComponent>();
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<ecs::IdentityComponent>();
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;
}

BIN
x64/Debug/config.txt (Stored with Git LFS)

Binary file not shown.

BIN
x64/Release/config.txt (Stored with Git LFS)

Binary file not shown.