feat: Add ImGui-based developer console overlay
Integrates Dear ImGui for an in-game debug console that replaces the blocking Python REPL. Press ~ (grave/tilde) to toggle the console. Features: - Python code execution without blocking the game loop - Output capture with color coding (yellow=input, red=errors, gray=output) - Expression results show repr() automatically - Command history navigation with up/down arrows - Word wrapping for long output lines - Auto-scroll that doesn't fight manual scrolling - mcrfpy.setDevConsole(bool) API to disable for shipping Technical changes: - Update imgui submodule to v1.89.9 (stable) - Update imgui-sfml submodule to 2.6.x branch (SFML 2.x compatible) - Add ImGui sources to CMakeLists.txt with OpenGL dependency - Integrate ImGui lifecycle into GameEngine - Add ImGuiConsole class for console overlay closes #36, closes #65, closes #75 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
8e2c603c54
commit
3f6ea4fe33
9 changed files with 405 additions and 10 deletions
56
src/ImGuiConsole.h
Normal file
56
src/ImGuiConsole.h
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <deque>
|
||||
|
||||
/**
|
||||
* @brief ImGui-based debug console for Python REPL
|
||||
*
|
||||
* Provides an overlay console that can execute Python code
|
||||
* without blocking the main game loop. Activated by grave/tilde key.
|
||||
*/
|
||||
class ImGuiConsole {
|
||||
public:
|
||||
ImGuiConsole();
|
||||
|
||||
// Core functionality
|
||||
void render(); // Render the console UI
|
||||
void toggle(); // Toggle visibility
|
||||
bool isVisible() const { return visible; }
|
||||
void setVisible(bool v) { visible = v; }
|
||||
|
||||
// Configuration (for Python API)
|
||||
static bool isEnabled() { return enabled; }
|
||||
static void setEnabled(bool e) { enabled = e; }
|
||||
|
||||
// Input handling
|
||||
bool wantsKeyboardInput() const; // Returns true if ImGui wants keyboard
|
||||
|
||||
private:
|
||||
void executeCommand(const std::string& command);
|
||||
void addOutput(const std::string& text, bool isError = false);
|
||||
|
||||
// State
|
||||
bool visible = false;
|
||||
static bool enabled; // Global enable/disable (for shipping games)
|
||||
|
||||
// Input buffer
|
||||
char inputBuffer[1024] = {0};
|
||||
|
||||
// Output history
|
||||
struct OutputLine {
|
||||
std::string text;
|
||||
bool isError;
|
||||
bool isInput; // True if this was user input (for styling)
|
||||
};
|
||||
std::deque<OutputLine> outputHistory;
|
||||
static constexpr size_t MAX_HISTORY = 500;
|
||||
|
||||
// Command history for up/down navigation
|
||||
std::vector<std::string> commandHistory;
|
||||
int historyIndex = -1;
|
||||
|
||||
// Scroll state
|
||||
bool scrollToBottom = true;
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue