Added Popup system

This commit is contained in:
OusmBlueNinja 2025-05-06 18:59:26 -05:00
parent 16db021aaa
commit c3ce41307a
9 changed files with 1265 additions and 1056 deletions

View File

@ -10,24 +10,24 @@ Collapsed=1
[Window][WindowOverViewport_11111111]
Pos=0,19
Size=1920,1158
Size=1280,701
Collapsed=0
[Window][Inspector]
Pos=1553,19
Size=367,659
Pos=913,19
Size=367,202
Collapsed=0
DockId=0x00000018,0
[Window][Scene Tree]
Pos=0,19
Size=342,579
Size=342,350
Collapsed=0
DockId=0x0000000F,0
[Window][Viewport]
Pos=344,19
Size=1207,659
Size=567,202
Collapsed=0
DockId=0x00000017,0
@ -36,14 +36,14 @@ Size=1280,19
Collapsed=0
[Window][Performance Info]
Pos=1606,680
Size=314,497
Pos=1094,223
Size=186,497
Collapsed=0
DockId=0x00000016,0
[Window][Console]
Pos=344,680
Size=1206,273
Pos=344,223
Size=715,273
Collapsed=0
DockId=0x00000013,0
@ -54,8 +54,8 @@ Collapsed=0
DockId=0x00000017,1
[Window][Profiler]
Pos=344,955
Size=1206,222
Pos=344,498
Size=715,222
Collapsed=0
DockId=0x00000014,0
@ -112,8 +112,8 @@ Collapsed=0
DockId=0x0000000E,0
[Window][Audio Output]
Pos=1552,680
Size=52,497
Pos=1061,223
Size=31,497
Collapsed=0
DockId=0x00000012,0
@ -124,13 +124,13 @@ Collapsed=0
DockId=0x0000000D,0
[Window][Resources]
Pos=0,600
Size=342,577
Pos=0,371
Size=342,349
Collapsed=0
DockId=0x00000010,0
[Docking][Data]
DockSpace ID=0x11111111 Window=0x1BBC0F80 Pos=0,19 Size=1920,1158 Split=X
DockSpace ID=0x11111111 Window=0x1BBC0F80 Pos=0,19 Size=1280,701 Split=X
DockNode ID=0x00000005 Parent=0x11111111 SizeRef=989,1158 Split=X
DockNode ID=0x00000001 Parent=0x00000005 SizeRef=342,701 Split=Y Selected=0x12EF0F59
DockNode ID=0x00000003 Parent=0x00000001 SizeRef=342,637 Split=Y Selected=0x12EF0F59

View File

@ -1,4 +1,2 @@
[COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -Isrc/vendor/xxhash -Isrc/vendor/miniaudio -Isrc/vendor/imguizmo -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\core\audio\AudioEngine.cpp -o src\build\core\audio\AudioEngine.o
[COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -Isrc/vendor/xxhash -Isrc/vendor/miniaudio -Isrc/vendor/imguizmo -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\core\utils\EngineConfig.cpp -o src\build\core\utils\EngineConfig.o
[COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -Isrc/vendor/xxhash -Isrc/vendor/miniaudio -Isrc/vendor/imguizmo -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\Engine.cpp -o src\build\Engine.o
[LINK] g++ src\build\Engine.o src\build\main.o src\build\Renderer.o src\build\Components\AnimationComponent.o src\build\Components\AudioPlayerComponent.o src\build\Components\CameraComponent.o src\build\Components\LightComponent.o src\build\Components\ParticleComponent.o src\build\Components\PhysicsComponent.o src\build\Components\ScriptComponent.o src\build\Components\SpriteComponent.o src\build\Components\TextComonent.o src\build\Components\TilemapComponent.o src\build\core\audio\AudioEngine.o src\build\core\utils\AssetManager.o src\build\core\utils\EngineConfig.o src\build\core\utils\ExceptionHandler.o src\build\core\utils\FileDialog.o src\build\core\utils\input.o src\build\core\utils\LoadingWindow.o src\build\core\utils\Logging.o src\build\core\utils\Profiler.o src\build\core\utils\Texture.o src\build\core\utils\utils.o src\build\editor\windows\AssetBrowser.o src\build\editor\windows\AudioInfo.o src\build\editor\windows\Inspector.o src\build\Entitys\Object.o src\build\utils\GameObjectsList.o src\build\utils\Shader.o src\build\utils\UID.o src\build\lapi.o src\build\lauxlib.o src\build\lbaselib.o src\build\lcode.o src\build\lcorolib.o src\build\lctype.o src\build\ldblib.o src\build\ldebug.o src\build\ldo.o src\build\ldump.o src\build\lfunc.o src\build\lgc.o src\build\linit.o src\build\liolib.o src\build\llex.o src\build\lmathlib.o src\build\lmem.o src\build\loadlib.o src\build\lobject.o src\build\lopcodes.o src\build\loslib.o src\build\lparser.o src\build\lstate.o src\build\lstring.o src\build\lstrlib.o src\build\ltable.o src\build\ltablib.o src\build\ltm.o src\build\lua.o src\build\luac.o src\build\lundump.o src\build\lutf8lib.o src\build\lvm.o src\build\lzio.o src\build\imgui.o src\build\imgui_demo.o src\build\imgui_draw.o src\build\imgui_impl_glfw.o src\build\imgui_impl_opengl3.o src\build\imgui_tables.o src\build\imgui_widgets.o src\build\aabb.o src\build\arena_allocator.o src\build\array.o src\build\bitset.o src\build\body.o src\build\broad_phase.o src\build\constraint_graph.o src\build\contact.o src\build\contact_solver.o src\build\core.o src\build\distance.o src\build\distance_joint.o src\build\dynamic_tree.o src\build\geometry.o src\build\hull.o src\build\id_pool.o src\build\island.o src\build\joint.o src\build\manifold.o src\build\math_functions.o src\build\motor_joint.o src\build\mouse_joint.o src\build\mover.o src\build\prismatic_joint.o src\build\revolute_joint.o src\build\sensor.o src\build\shape.o src\build\solver.o src\build\solver_set.o src\build\table.o src\build\timer.o src\build\types.o src\build\weld_joint.o src\build\wheel_joint.o src\build\world.o src\build\xxhash.o src\build\miniaudio.o src\build\ImGuizmo.o -o src\build\app.exe -LC:\msys64\mingw64\lib -lglfw3 -lglew32 -lopengl32 -lgdi32 -lyaml-cpp -lcomdlg32 -lssl -lcrypto -ldbghelp
[COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -Isrc/vendor/xxhash -Isrc/vendor/miniaudio -Isrc/vendor/imguizmo -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\core\utils\Popup.cpp -o src\build\core\utils\Popup.o
[LINK] g++ src\build\Engine.o src\build\main.o src\build\Renderer.o src\build\Components\AnimationComponent.o src\build\Components\AudioPlayerComponent.o src\build\Components\CameraComponent.o src\build\Components\LightComponent.o src\build\Components\ParticleComponent.o src\build\Components\PhysicsComponent.o src\build\Components\ScriptComponent.o src\build\Components\SpriteComponent.o src\build\Components\TextComonent.o src\build\Components\TilemapComponent.o src\build\core\audio\AudioEngine.o src\build\core\utils\AssetManager.o src\build\core\utils\EngineConfig.o src\build\core\utils\ExceptionHandler.o src\build\core\utils\FileDialog.o src\build\core\utils\input.o src\build\core\utils\LoadingWindow.o src\build\core\utils\Logging.o src\build\core\utils\Popup.o src\build\core\utils\Profiler.o src\build\core\utils\Texture.o src\build\core\utils\utils.o src\build\editor\windows\AssetBrowser.o src\build\editor\windows\AudioInfo.o src\build\editor\windows\Inspector.o src\build\Entitys\Object.o src\build\utils\GameObjectsList.o src\build\utils\Shader.o src\build\utils\UID.o src\build\lapi.o src\build\lauxlib.o src\build\lbaselib.o src\build\lcode.o src\build\lcorolib.o src\build\lctype.o src\build\ldblib.o src\build\ldebug.o src\build\ldo.o src\build\ldump.o src\build\lfunc.o src\build\lgc.o src\build\linit.o src\build\liolib.o src\build\llex.o src\build\lmathlib.o src\build\lmem.o src\build\loadlib.o src\build\lobject.o src\build\lopcodes.o src\build\loslib.o src\build\lparser.o src\build\lstate.o src\build\lstring.o src\build\lstrlib.o src\build\ltable.o src\build\ltablib.o src\build\ltm.o src\build\lua.o src\build\luac.o src\build\lundump.o src\build\lutf8lib.o src\build\lvm.o src\build\lzio.o src\build\imgui.o src\build\imgui_demo.o src\build\imgui_draw.o src\build\imgui_impl_glfw.o src\build\imgui_impl_opengl3.o src\build\imgui_tables.o src\build\imgui_widgets.o src\build\aabb.o src\build\arena_allocator.o src\build\array.o src\build\bitset.o src\build\body.o src\build\broad_phase.o src\build\constraint_graph.o src\build\contact.o src\build\contact_solver.o src\build\core.o src\build\distance.o src\build\distance_joint.o src\build\dynamic_tree.o src\build\geometry.o src\build\hull.o src\build\id_pool.o src\build\island.o src\build\joint.o src\build\manifold.o src\build\math_functions.o src\build\motor_joint.o src\build\mouse_joint.o src\build\mover.o src\build\prismatic_joint.o src\build\revolute_joint.o src\build\sensor.o src\build\shape.o src\build\solver.o src\build\solver_set.o src\build\table.o src\build\timer.o src\build\types.o src\build\weld_joint.o src\build\wheel_joint.o src\build\world.o src\build\xxhash.o src\build\miniaudio.o src\build\ImGuizmo.o -o src\build\app.exe -LC:\msys64\mingw64\lib -lglfw3 -lglew32 -lopengl32 -lgdi32 -lyaml-cpp -lcomdlg32 -lssl -lcrypto -ldbghelp

File diff suppressed because it is too large Load Diff

View File

@ -756,6 +756,10 @@ void Engine::Run()
{
ImGui::Checkbox("Enable Lighting", &g_engineConfig.settings.lighting_enabled);
ImGui::Checkbox("Enable Gizmos", &g_engineConfig.settings.draw_gizmos);
if (ImGui::BeginMenu("Defaults"))
{
ImGui::Checkbox("Prompt Outdated Scenes", &g_engineConfig.settings.ignore_invalid_versions_popups);
}
if (ImGui::BeginMenu("Profiling"))
{
ImGui::Text("Note: Slow");
@ -1487,6 +1491,8 @@ void Engine::SaveScene(const std::string &path)
void Engine::LoadScene(const std::string &path)
{
bool legacyLoad = false;
Logger::LogDebug("[LoadScene] Reading Scene File.");
YAML::Node root = YAML::LoadFile(path);
@ -1504,12 +1510,43 @@ void Engine::LoadScene(const std::string &path)
return;
}
std::string loadedVersion = root["engine_version"].as<std::string>();
std::string expectedVersion = g_engineConfig.version;
if (root["engine_version"].as<std::string>() != g_engineConfig.version)
if (loadedVersion != expectedVersion)
{
Logger::LogError("[LoadScene] Version mismatch! Expected %s, got %s", g_engineConfig.version.c_str(), root["engine_version"].as<std::string>().c_str());
Logger::LogWarning("[LoadScene] Version mismatch! Expected %s, got %s",
expectedVersion.c_str(), loadedVersion.c_str());
if (!g_engineConfig.settings.ignore_invalid_versions_popups)
{
loadingUI.Destroy(); // Close visual loading before blocking popup
int result = Popup::Show("Version Mismatch",
"Scene was created with engine version: " + loadedVersion +
"\nExpected: " + expectedVersion +
"\n\nLoad anyway?",
{Popup::Option("Yes", 1),
Popup::Option("Yes (Don't Ask Again)", 2),
Popup::Option("No", 0)});
if (result == 0)
{
Logger::LogInfo("[LoadScene] User cancelled scene load.");
return;
}
if (result == 2)
{
g_engineConfig.settings.ignore_invalid_versions_popups = true;
}
loadingUI.Create("Loading Scene (Legacy Recovery)");
loadingUI.Update("Attempting Recovery", "Loading scene with fallback...", 0.02f);
}
else
{
Logger::LogInfo("[LoadScene] Version mismatch ignored due to user setting.");
}
}
if (!VerifySceneHash(root))
@ -1549,12 +1586,21 @@ void Engine::LoadScene(const std::string &path)
float progress = 0.1f + (0.75f * (objectIndex / static_cast<float>(std::max(1, totalObjects))));
loadingUI.Update(currentStep, currentDetail, progress);
auto obj = std::make_shared<Object>(objName);
obj->Load(node);
objects.push_back(obj);
try
{
auto obj = std::make_shared<Object>(objName);
obj->Load(node);
objects.push_back(obj);
}
catch (const std::exception &e)
{
Logger::LogWarning("[LoadScene] Failed to load object '%s': %s", objName.c_str(), e.what());
}
objectIndex++;
}
// Color correction settings
if (root["color_correction"])
{
Logger::LogVerbose("[LoadScene] Loading Color Correction Attributes");
@ -1581,6 +1627,7 @@ void Engine::LoadScene(const std::string &path)
}
}
// Finalize
currentStep = "Done";
currentDetail = "Finalizing load...";
loadingUI.Update(currentStep, currentDetail, 1.0f);

View File

@ -12,7 +12,7 @@
//! Macro Fuckery my Gz
EngineConfig g_engineConfig{
.version = "0.8.1",
.version = "0.8.2",
.gl_version = "430",
.gl_maxLight = 512,
.settings = UserSettings{}

View File

@ -12,7 +12,8 @@
USER_SETTING(show_asset_window, bool, false) \
USER_SETTING(profile_gpu, bool, false) \
USER_SETTING(show_performance_window, bool, false) \
USER_SETTING(show_audio_window, bool, false)
USER_SETTING(show_audio_window, bool, false) \
USER_SETTING(ignore_invalid_versions_popups, bool, false)

View File

@ -1,6 +1,7 @@
#pragma once
#include <windows.h>
#include <string>
#include "Popup.h"
class LoadingWindow {
public:

View File

@ -0,0 +1,137 @@
#include "Popup.h"
#include <windows.h>
#include <string>
#include <vector>
struct PopupContext
{
std::string message;
std::vector<Popup::Option> options;
int result = -1;
};
static PopupContext *g_ctx = nullptr;
static const char *CLASS_NAME = "PopupWindowClass";
LRESULT CALLBACK PopupWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CREATE:
{
RECT textRect = {20, 20, 360 + 20, 200};
HFONT font = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
HDC hdc = GetDC(hwnd);
SelectObject(hdc, font);
DrawTextA(hdc, g_ctx->message.c_str(), -1, &textRect, DT_WORDBREAK | DT_CALCRECT);
ReleaseDC(hwnd, hdc);
// Add padding
int textHeight = textRect.bottom - textRect.top + 8;
HWND label = CreateWindowA("STATIC", g_ctx->message.c_str(),
WS_CHILD | WS_VISIBLE | SS_LEFT | SS_NOPREFIX,
20, 20, 360, textHeight,
hwnd, nullptr, nullptr, nullptr);
SendMessage(label, WM_SETFONT, (WPARAM)font, TRUE);
int btnW = 120, btnH = 28, spacing = 10;
int totalW = (int)g_ctx->options.size() * btnW + ((int)g_ctx->options.size() - 1) * spacing;
int x = (400 - totalW) / 2;
for (int i = 0; i < (int)g_ctx->options.size(); ++i)
{
HWND btn = CreateWindowA("BUTTON", g_ctx->options[i].label.c_str(),
WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
x + i * (btnW + spacing), 100, btnW, btnH,
hwnd, (HMENU)(1000 + i), GetModuleHandle(nullptr), nullptr);
SendMessage(btn, WM_SETFONT, (WPARAM)font, TRUE);
}
break;
}
case WM_COMMAND:
{
int id = LOWORD(wParam);
if (id >= 1000)
{
int index = id - 1000;
if (index >= 0 && index < (int)g_ctx->options.size())
{
g_ctx->result = g_ctx->options[index].returnValue;
DestroyWindow(hwnd);
}
}
break;
}
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
int Popup::Show(const std::string &title,
const std::string &message,
const std::vector<Option> &options)
{
if (options.size() <= 2)
{
if (options.size() == 1 && options[0].label == "OK")
{
MessageBoxA(nullptr, message.c_str(), title.c_str(), MB_OK | MB_ICONINFORMATION);
return options[0].returnValue;
}
if ((options[0].label == "Yes" && options[1].label == "No") ||
(options[0].label == "No" && options[1].label == "Yes"))
{
int result = MessageBoxA(nullptr, message.c_str(), title.c_str(), MB_YESNO | MB_ICONQUESTION);
return (result == IDYES) ? (options[0].label == "Yes" ? options[0].returnValue : options[1].returnValue)
: (options[0].label == "No" ? options[0].returnValue : options[1].returnValue);
}
}
// For 3+ options, use custom window
static bool registered = false;
if (!registered)
{
WNDCLASSA wc = {};
wc.lpfnWndProc = PopupWndProc;
wc.hInstance = GetModuleHandle(nullptr);
wc.lpszClassName = CLASS_NAME;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
RegisterClassA(&wc);
registered = true;
}
PopupContext context = {message, options, -1};
g_ctx = &context;
HWND hwnd = CreateWindowExA(
WS_EX_DLGMODALFRAME,
CLASS_NAME,
title.c_str(),
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU,
CW_USEDEFAULT, CW_USEDEFAULT, 400, 180,
nullptr, nullptr, GetModuleHandle(nullptr), nullptr);
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
MSG msg;
while (IsWindow(hwnd) && GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return context.result;
}

View File

@ -0,0 +1,25 @@
#pragma once
#include <string>
#include <vector>
#include <optional>
class Popup {
public:
struct Option {
std::string label;
int returnValue;
static int nextID;
Option(const std::string& label, int value)
: label(label), returnValue(value) {}
};
// Yes/No message box (native)
static bool AskYesNo(const std::string& title, const std::string& message);
static int Show(const std::string& title,
const std::string& message,
const std::vector<Option>& options = { Option("OK", 1) });
};