mirror of
https://github.com/isledecomp/isle-portable.git
synced 2026-01-11 18:41:14 +00:00
* Show imgui window when starting app with --debug * g_closed test in SDL_AppIterate is still needed * Allow disabling isleapp debugging by configuring with -DISLE_DEBUG=OFF * clang-format
156 lines
4.1 KiB
C++
156 lines
4.1 KiB
C++
#include "isledebug.h"
|
|
|
|
#include "isleapp.h"
|
|
#include "legobuildingmanager.h"
|
|
#include "legogamestate.h"
|
|
#include "legoplantmanager.h"
|
|
#include "legosoundmanager.h"
|
|
#include "legovideomanager.h"
|
|
#include "misc.h"
|
|
|
|
#include <SDL3/SDL.h>
|
|
#include <backends/imgui_impl_sdl3.h>
|
|
#include <backends/imgui_impl_sdlrenderer3.h>
|
|
#include <imgui.h>
|
|
|
|
bool g_debugEnabled;
|
|
bool g_debugPaused;
|
|
SDL_Window* g_debugWindow;
|
|
SDL_Renderer* g_debugRenderer;
|
|
|
|
void IsleDebug_Init()
|
|
{
|
|
do {
|
|
if (!g_debugEnabled) {
|
|
break;
|
|
}
|
|
if (!SDL_CreateWindowAndRenderer(
|
|
"Debug ISLE",
|
|
640,
|
|
480,
|
|
SDL_WINDOW_RESIZABLE,
|
|
&g_debugWindow,
|
|
&g_debugRenderer
|
|
)) {
|
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to create debug window");
|
|
break;
|
|
}
|
|
IMGUI_CHECKVERSION();
|
|
ImGui::CreateContext();
|
|
ImGui::StyleColorsDark();
|
|
if (!ImGui_ImplSDL3_InitForSDLRenderer(g_debugWindow, g_debugRenderer)) {
|
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "ImGui_ImplSDL3_InitForSDLRenderer failed");
|
|
g_debugEnabled = false;
|
|
break;
|
|
}
|
|
if (!ImGui_ImplSDLRenderer3_Init(g_debugRenderer)) {
|
|
g_debugEnabled = false;
|
|
break;
|
|
}
|
|
} while (0);
|
|
if (!g_debugEnabled) {
|
|
if (g_debugRenderer) {
|
|
SDL_DestroyRenderer(g_debugRenderer);
|
|
g_debugRenderer = nullptr;
|
|
}
|
|
if (g_debugWindow) {
|
|
SDL_DestroyWindow(g_debugWindow);
|
|
g_debugWindow = nullptr;
|
|
}
|
|
}
|
|
}
|
|
|
|
bool IsleDebug_Event(SDL_Event* event)
|
|
{
|
|
if (!g_debugEnabled) {
|
|
return false;
|
|
}
|
|
if (SDL_GetWindowFromEvent(event) != g_debugWindow) {
|
|
return false;
|
|
}
|
|
ImGui_ImplSDL3_ProcessEvent(event);
|
|
return true;
|
|
}
|
|
|
|
void IsleDebug_Render()
|
|
{
|
|
if (!g_debugEnabled) {
|
|
return;
|
|
}
|
|
const ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
|
|
|
|
ImGui_ImplSDLRenderer3_NewFrame();
|
|
ImGui_ImplSDL3_NewFrame();
|
|
ImGui::NewFrame();
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
{
|
|
ImGui::BeginMainMenuBar();
|
|
if (ImGui::MenuItem(g_debugPaused ? "Resume" : "Pause")) {
|
|
g_debugPaused = !g_debugPaused;
|
|
if (g_debugPaused) {
|
|
g_isle->SetWindowActive(false);
|
|
Lego()->Pause();
|
|
}
|
|
else {
|
|
g_isle->SetWindowActive(true);
|
|
Lego()->Resume();
|
|
}
|
|
}
|
|
ImGui::EndMainMenuBar();
|
|
LegoOmni* lego = Lego();
|
|
if (ImGui::Begin("LEGO")) {
|
|
if (ImGui::TreeNode("Game State")) {
|
|
LegoGameState* gameState = lego->GetGameState();
|
|
ImGui::Value("Actor Id", gameState->GetActorId());
|
|
ImGui::Text("Actor Name: %s", gameState->GetActorName());
|
|
ImGui::Text("Current act: %d", gameState->GetCurrentAct());
|
|
ImGui::Text("Loaded act: %d", gameState->GetLoadedAct());
|
|
ImGui::Text("Previous area: %d", gameState->GetPreviousArea());
|
|
ImGui::Text("Unknown 0x42c: %d", gameState->GetUnknown0x42c());
|
|
ImGui::Value("Player count", gameState->GetPlayerCount());
|
|
ImGui::TreePop();
|
|
}
|
|
if (ImGui::TreeNode("Sound Manager")) {
|
|
LegoSoundManager* soundManager = lego->GetSoundManager();
|
|
Sint32 oldVolume = soundManager->GetVolume();
|
|
Sint32 volume = oldVolume;
|
|
ImGui::SliderInt("volume", &volume, 0, 100);
|
|
if (volume != oldVolume) {
|
|
soundManager->SetVolume(volume);
|
|
}
|
|
ImGui::TreePop();
|
|
}
|
|
if (ImGui::TreeNode("Video Manager")) {
|
|
LegoVideoManager* videoManager = lego->GetVideoManager();
|
|
ImGui::Text("Elapsed: %g", static_cast<float>(videoManager->GetElapsedSeconds()));
|
|
ImGui::Value("Render3D", videoManager->GetRender3D());
|
|
ImGui::TreePop();
|
|
}
|
|
if (ImGui::TreeNode("Plant Manager")) {
|
|
LegoPlantManager* plantManager = lego->GetPlantManager();
|
|
ImGui::Value("#plants", plantManager->GetNumPlants());
|
|
ImGui::TreePop();
|
|
}
|
|
if (ImGui::TreeNode("Building Manager")) {
|
|
LegoBuildingManager* buildingManager = lego->GetBuildingManager();
|
|
ImGui::TreePop();
|
|
}
|
|
}
|
|
ImGui::End();
|
|
}
|
|
ImGui::ShowDemoWindow(nullptr);
|
|
|
|
ImGui::Render();
|
|
SDL_RenderClear(g_debugRenderer);
|
|
SDL_SetRenderScale(g_debugRenderer, io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y);
|
|
SDL_SetRenderDrawColor(
|
|
g_debugRenderer,
|
|
(Uint8) (clear_color.x * 255),
|
|
(Uint8) (clear_color.y * 255),
|
|
(Uint8) (clear_color.z * 255),
|
|
(Uint8) (clear_color.w * 255)
|
|
);
|
|
ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData(), g_debugRenderer);
|
|
SDL_RenderPresent(g_debugRenderer);
|
|
}
|