feat: add ImGui frontend support with game selection and debug panels

This commit is contained in:
moonpower
2026-02-01 23:54:58 +03:00
parent 5b8081bc33
commit 25add6ada7
8 changed files with 1024 additions and 32 deletions

View File

@@ -3,6 +3,8 @@
#include <SDL.h>
#include <filesystem>
#include <memory>
#include <optional>
#include "emulator.hpp"
#include "input_mappings.hpp"
@@ -13,11 +15,26 @@ class FrontendSDL {
#ifdef PANDA3DS_ENABLE_OPENGL
SDL_GLContext glContext;
#endif
#ifdef IMGUI_FRONTEND
std::unique_ptr<class ImGuiLayer> imgui;
#endif
public:
FrontendSDL();
#ifdef IMGUI_FRONTEND
FrontendSDL(SDL_Window* existingWindow, SDL_GLContext existingContext);
#endif
~FrontendSDL();
#ifdef IMGUI_FRONTEND
struct ImGuiWindowContext {
SDL_Window* window = nullptr;
SDL_GLContext context = nullptr;
};
static ImGuiWindowContext createImGuiWindowContext(const EmulatorConfig& bootConfig, const char* windowTitle);
#endif
bool loadROM(const std::filesystem::path& path);
void run();
std::optional<std::filesystem::path> selectGame();
u32 getMapping(InputMappings::Scancode scancode) { return keyboardMappings.getMapping(scancode); }
SDL_Window* window = nullptr;
@@ -42,8 +59,12 @@ class FrontendSDL {
// And so the user can still use the keyboard to control the analog
bool keyboardAnalogX = false;
bool keyboardAnalogY = false;
bool emuPaused = false;
private:
void setupControllerSensors(SDL_GameController* controller);
void handleLeftClick(int mouseX, int mouseY);
void setPaused(bool paused);
void togglePaused();
void initialize(SDL_Window* existingWindow, SDL_GLContext existingContext, bool useExternalContext);
};

View File

@@ -0,0 +1,50 @@
#pragma once
#ifdef IMGUI_FRONTEND
#include <SDL.h>
#include <functional>
#include <optional>
#include "emulator.hpp"
class ImGuiLayer {
public:
ImGuiLayer(SDL_Window* window, SDL_GLContext context, Emulator& emu);
void init();
void shutdown();
void processEvent(const SDL_Event& event);
void beginFrame();
void render();
void handleHotkey(const SDL_Event& event);
std::optional<std::filesystem::path> runGameSelector();
bool wantsCaptureKeyboard() const { return captureKeyboard; }
bool wantsCaptureMouse() const { return captureMouse; }
void setPaused(bool paused) { isPaused = paused; }
void setPauseCallback(std::function<void(bool)> callback) { onPauseChange = std::move(callback); }
void setVsyncCallback(std::function<void(bool)> callback) { onVsyncChange = std::move(callback); }
private:
void drawDebugPanel();
void drawPausePanel();
void drawSettingsPanel();
SDL_Window* window = nullptr;
SDL_GLContext glContext = nullptr;
Emulator& emu;
bool showDebug = true;
bool showPauseMenu = false;
bool showSettings = false;
bool isPaused = false;
bool captureKeyboard = false;
bool captureMouse = false;
std::function<void(bool)> onPauseChange;
std::function<void(bool)> onVsyncChange;
};
#endif