#pragma once #include "Common.h" #include "Scene.h" #include "McRFPy_API.h" #include "IndexTexture.h" #include "Timer.h" #include "PyCallable.h" #include "McRogueFaceConfig.h" #include "HeadlessRenderer.h" #include class GameEngine { std::unique_ptr window; std::unique_ptr headless_renderer; sf::RenderTarget* render_target; sf::Font font; std::map scenes; bool running = true; bool paused = false; int currentFrame = 0; sf::View visible; sf::Clock clock; float frameTime; std::string window_title; bool headless = false; McRogueFaceConfig config; bool cleaned_up = false; void testTimers(); public: sf::Clock runtime; //std::map timers; std::map> timers; std::string scene; // Profiling metrics struct ProfilingMetrics { float frameTime = 0.0f; // Current frame time in milliseconds float avgFrameTime = 0.0f; // Average frame time over last N frames int fps = 0; // Frames per second int drawCalls = 0; // Draw calls per frame int uiElements = 0; // Number of UI elements rendered int visibleElements = 0; // Number of visible elements // Frame time history for averaging static constexpr int HISTORY_SIZE = 60; float frameTimeHistory[HISTORY_SIZE] = {0}; int historyIndex = 0; void updateFrameTime(float deltaMs) { frameTime = deltaMs; frameTimeHistory[historyIndex] = deltaMs; historyIndex = (historyIndex + 1) % HISTORY_SIZE; // Calculate average float sum = 0.0f; for (int i = 0; i < HISTORY_SIZE; ++i) { sum += frameTimeHistory[i]; } avgFrameTime = sum / HISTORY_SIZE; fps = avgFrameTime > 0 ? static_cast(1000.0f / avgFrameTime) : 0; } void resetPerFrame() { drawCalls = 0; uiElements = 0; visibleElements = 0; } } metrics; GameEngine(); GameEngine(const McRogueFaceConfig& cfg); ~GameEngine(); Scene* currentScene(); void changeScene(std::string); void createScene(std::string); void quit(); void setPause(bool); sf::Font & getFont(); sf::RenderWindow & getWindow(); sf::RenderTarget & getRenderTarget(); sf::RenderTarget* getRenderTargetPtr() { return render_target; } void run(); void sUserInput(); void cleanup(); // Clean up Python references before destruction int getFrame() { return currentFrame; } float getFrameTime() { return frameTime; } sf::View getView() { return visible; } void manageTimer(std::string, PyObject*, int); std::shared_ptr getTimer(const std::string& name); void setWindowScale(float); bool isHeadless() const { return headless; } void processEvent(const sf::Event& event); // global textures for scripts to access std::vector textures; // global audio storage std::vector sfxbuffers; sf::Music music; sf::Sound sfx; std::shared_ptr>> scene_ui(std::string scene); };