Files
khaotic-engine-Reborn/enginecustom/src/inc/system/imguiManager.h
CatChow0 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

251 lines
6.2 KiB
C++
Raw Blame History

#pragma once
#ifndef _IMGUI_MANAGER_H_
#define _IMGUI_MANAGER_H_
#include "Logger.h"
#include "sceneManager.h"
#include "fps_limiter.h"
#include "macro.h"
#include <imgui.h>
#include <imgui_impl_dx11.h>
#include <imgui_impl_win32.h>
#include <windows.h>
#include <deque>
#include <functional>
#include "render_texture_class.h"
#include "scene_manager.h"
#include "ecs/entity_manager.h"
#include "version.h"
class application_class;
class stats;
/**
* Struct to hold widget entries for ImGui.
* This struct contains a pointer to a boolean that determines if the widget should be shown,
* and a function that will be called when the widget is rendered.
*/
struct widget_entry
{
bool* show;
std::function<void()> func;
};
struct ComponentEntry {
const char* name;
std::function<void()> addFunc;
};
struct CachedEntity
{
std::string name;
ecs::EntityID id;
};
class imguiManager
{
public:
/**
* Constructor for imguiManager class.
* Initializes the ImGui manager with default values.
*/
imguiManager();
~imguiManager();
/**
* Load the build version from a configuration file.
* The configuration file should contain a line with the build version in the format "VER=XXX...".
* If the line is not found, it will be added with a version of 0.
* The build version will be incremented by 1 each time this function is called.
* @param filepath The path to the configuration file.
* @return True if the build version was loaded successfully, otherwise false.
*/
bool IncrementBuildVersionInConfig(const std::string& filepath);
/**
* Initializes the ImGui manager.
* @param hwnd Handle to the window where ImGui will be rendered.
* @param device Pointer to the Direct3D 11 device.
* @param deviceContext Pointer to the Direct3D 11 device context.
* @return True if initialization was successful, otherwise false.
*/
bool Initialize(HWND hwnd, ID3D11Device* device, ID3D11DeviceContext* deviceContext);
/**
* Shuts down the ImGui manager.
*/
void Shutdown();
/**
* Renders the ImGui interface.
*/
void Render();
/**
* Starts a new ImGui frame.
*/
void NewFrame();
/**
* Sets up the ImGui dockspace.
* This function creates a dockspace for the ImGui interface.
*/
void SetupDockspace();
// Widgets
/**
* Creates a slider widget to control the speed of the demo spinning cube.
* @param speed
*/
void WidgetSpeedSlider(float* speed);
/**
* Creates a button widget.
*/
void WidgetButton();
/**
* Shows the FPS in a widget.
*/
void WidgetFPS();
/**
* Create a widget to add a button wich will add an object to the scene.
*/
void WidgetAddObject();
/**
* create a window to display the object list and allow to add objects to the scene.
*/
void WidgetObjectWindow();
/**
* Create a window to display the terrain generation options.
*/
void WidgetTerrainWindow();
/**
* Create a window to display the light settings.
*/
void WidgetLightWindow();
/**
* Create a window to display the Engine settings.
*/
void WidgetEngineSettingsWindow();
/**
* Create a window to display the scene.
* This window isn't used anymore.
*/
void WidgetRenderWindow(ImVec2 availableSize);
/**
* Create a window to display the log messages from the Logger.
*/
void WidgetLogWindow();
/**
* Create a window to display the stats of the engine.
* This includes FPS, draw calls, triangle count, etc.
* As well as the GPU, CPU information and RAM information.
*/
void WidgetRenderStats();
/**
* Function to render the ImGui widgets.
* This function use the struct widget_entry to render the widgets that are registered.
* @return True if the ImGui widgets were rendered successfully, otherwise false.
*/
bool ImGuiWidgetRenderer();
/**
* Create a window to display the inspector.
* This window shows the components of the selected entity and allows to edit them.
*/
void WidgetInspectorWindow();
/**
* set the Old scene window size.
* @param size
*/
void SetWindowSize(ImVec2 size) { windowSize = size; }
/**
* Get the current window size.
* @return The current window size as an ImVec2.
*/
ImVec2 GetWindowSize() const { return windowSize; }
/**
* Set the application class pointer for the ImGui manager.
* @param app
*/
void SetApp(std::shared_ptr<application_class> app) { app_ = app; }
// Shader toggles
bool m_EnableCelShading;
private:
// --------------------------------------------- //
// ----------------- Functions ----------------- //
// --------------------------------------------- //
/**
* Update the cached entity list if there is a new, delete or rename entity
*/
void UpdateCachedEntitiesIfNeeded();
// --------------------------------------------- //
// ----------------- Variables ----------------- //
// --------------------------------------------- //
std::vector<widget_entry> widgets_;
std::shared_ptr<application_class> app_;
scene_manager* scene_manager_;
stats* stats_;
ecs::EntityManager* entity_manager_;
std::shared_ptr<ecs::Entity> sky_entity_shared_ptr_;
bool showObjectWindow;
bool showTerrainWindow;
bool showLightWindow;
bool showOldSceneWindow;
bool showEngineSettingsWindow;
bool showLogWindow;
bool showStatsWindow;
bool show_inspector_window_;
int m_SideCount = 0;
static const int FRAME_HISTORY_COUNT = 3600; // 1min secondes <20> 60 FPS
float m_frameTimeHistory[FRAME_HISTORY_COUNT] = {};
int m_frameTimeHistoryIndex = 0;
bool m_isPhyiscsEnabled = false;
bool m_isGravityEnabled = false;
ImGuiIO* io;
ID3D11Device* m_device;
ID3D11DeviceContext* m_deviceContext;
ImVec2 windowSize;
render_texture_class* m_renderTexture;
const std::deque<Logger::LogEntry>& logBuffer = Logger::Get().GetLogBuffer();
int current_fps_, min_fps_, max_fps_, draw_calls_, visible_triangle_count_;
float current_frame_time_, min_frame_time_, max_frame_time_ ;
std::shared_ptr<int> total_vertex_count_;
std::shared_ptr<int> total_triangle_count_;
// gpu information
char card_name_[128];
int video_memory_ = 0;
// cpu information
std::string cpu_name_;
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;
};
#endif