Added Lua GLOBALS

This commit is contained in:
OusmBlueNinja 2025-05-07 23:06:31 -05:00
parent 90fb92c3ae
commit 7e2769ac9e
12 changed files with 297 additions and 66 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=335,579
Size=335,350
Collapsed=0
DockId=0x0000000F,0
DockId=0x0000001B,0
[Window][Viewport]
Pos=337,19
Size=1214,659
Size=574,202
Collapsed=0
DockId=0x00000017,0
@ -36,14 +36,14 @@ Size=1280,19
Collapsed=0
[Window][Performance Info]
Pos=1628,680
Size=292,268
Pos=1106,223
Size=174,268
Collapsed=0
DockId=0x00000019,0
[Window][Console]
Pos=337,680
Size=1238,497
Pos=337,223
Size=736,497
Collapsed=0
DockId=0x00000013,0
@ -78,8 +78,8 @@ Collapsed=0
DockId=0x00000015,1
[Window][Color Correction]
Pos=1628,950
Size=292,227
Pos=1106,493
Size=174,227
Collapsed=0
DockId=0x0000001A,0
@ -113,8 +113,8 @@ Collapsed=0
DockId=0x0000000E,0
[Window][Audio Output]
Pos=1577,680
Size=49,497
Pos=1075,223
Size=29,497
Collapsed=0
DockId=0x00000012,0
@ -125,8 +125,8 @@ Collapsed=0
DockId=0x0000000D,0
[Window][Resources]
Pos=0,600
Size=335,577
Pos=0,371
Size=335,349
Collapsed=0
DockId=0x00000010,0
@ -135,17 +135,25 @@ Pos=584,22
Size=536,391
Collapsed=0
[Window][Lua Globals]
Pos=0,482
Size=335,116
Collapsed=0
DockId=0x0000001C,0
[Table][0x96376740,2]
RefScale=13
Column 0 Weight=1.0000
Column 1 Width=120
[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=335,701 Split=Y Selected=0x12EF0F59
DockNode ID=0x00000003 Parent=0x00000001 SizeRef=342,637 Split=Y Selected=0x12EF0F59
DockNode ID=0x0000000F Parent=0x00000003 SizeRef=342,579 HiddenTabBar=1 Selected=0x12EF0F59
DockNode ID=0x0000000F Parent=0x00000003 SizeRef=342,579 Split=Y Selected=0x12EF0F59
DockNode ID=0x0000001B Parent=0x0000000F SizeRef=335,461 HiddenTabBar=1 Selected=0x12EF0F59
DockNode ID=0x0000001C Parent=0x0000000F SizeRef=335,116 HiddenTabBar=1 Selected=0x8CFF897F
DockNode ID=0x00000010 Parent=0x00000003 SizeRef=342,577 HiddenTabBar=1 Selected=0x30401527
DockNode ID=0x00000004 Parent=0x00000001 SizeRef=342,519 HiddenTabBar=1 Selected=0x36AF052B
DockNode ID=0x00000002 Parent=0x00000005 SizeRef=943,701 Split=Y Selected=0xC450F867

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\functions\ScenePacker.cpp -o src\build\core\functions\ScenePacker.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\functions\Prefab.o src\build\core\functions\ScenePacker.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 -lz
[ERROR] Runtime crash
Command 'src\build\app.exe' returned non-zero exit status 3221225477.
[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\functions\Prefab.o src\build\core\functions\ScenePacker.o src\build\core\scripts\LuaGlobalBridge.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\editor\windows\LuaGlobals.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 -lz

View File

@ -0,0 +1,4 @@
function OnUpdate(dt)
local hp = Engine.GetGlobal("player_health") or 0
Engine.SetGlobal("player_health", hp + 1)
end

View File

@ -0,0 +1,8 @@
function OnUpdate(dt)
local hp = Engine.GetGlobal("player_health")
if hp ~= nil then
print("Player Health:", hp)
else
print("player_health is nil")
end
end

View File

@ -0,0 +1,23 @@
engine_version: 0.8.3
scene_name: lua_stesting
scene_hash: b1e82bcabfb7fb81c42d1bf6ad852ae165648f6134d1a64ae35bb761bd1b626b
format_version: 1
objects:
- name: Hello, Create
uid: b0a9e03bdb314b6eb50f3b3eaa6097bc
id: 0
position: [0, 0]
rotation: 0
layer: 0
visable: true
components: []
children: []
color_correction:
brightness: 1
saturation: 1
gamma: 1
bloom: false
intensity: 1.20000005
threshold: 1
Assets:
[]

View File

@ -20,9 +20,53 @@
#include "../core/types/vec2.h"
#include "../core/types/vec3.h"
#include <lua.hpp>
#include <memory>
#include <cstring>
#include "../core/scripts/LuaGlobalBridge.h"
static int Lua_SetGlobal(lua_State *L)
{
const char *key = luaL_checkstring(L, 1);
switch (lua_type(L, 2))
{
case LUA_TNUMBER:
LuaGlobalBridge::Set(key, lua_tonumber(L, 2));
break;
case LUA_TBOOLEAN:
LuaGlobalBridge::Set(key, (bool)lua_toboolean(L, 2));
break;
case LUA_TSTRING:
LuaGlobalBridge::Set(key, std::string(lua_tostring(L, 2)));
break;
default:
luaL_error(L, "[Engine.SetGlobal] Unsupported value type");
}
return 0;
}
static int Lua_GetGlobal(lua_State *L)
{
const char *key = luaL_checkstring(L, 1);
auto value = LuaGlobalBridge::Get(key);
if (!value.has_value())
{
lua_pushnil(L);
return 1;
}
std::visit([L](auto &&val)
{
using T = std::decay_t<decltype(val)>;
if constexpr (std::is_same_v<T, double>)
lua_pushnumber(L, val);
else if constexpr (std::is_same_v<T, bool>)
lua_pushboolean(L, val);
else if constexpr (std::is_same_v<T, std::string>)
lua_pushstring(L, val.c_str()); }, *value);
return 1;
}
static bool luaDebugEnabled = false;
static bool old_state = false;
@ -153,21 +197,28 @@ static int Lua_DebugLua(lua_State *L)
return 0;
}
static Component* GetComponentByName(Object* obj, const std::string& type)
static Component *GetComponentByName(Object *obj, const std::string &type)
{
PROFILE_DEEP_SCOPE("GetComponentByName");
using GetterFn = std::function<Component*(Object*)>;
using GetterFn = std::function<Component *(Object *)>;
static const std::unordered_map<std::string, GetterFn> table = {
{"SpriteComponent", [](Object* o) { return o->GetComponent<SpriteComponent>().get(); }},
{"CameraComponent", [](Object* o) { return o->GetComponent<CameraComponent>().get(); }},
{"LightComponent", [](Object* o) { return o->GetComponent<LightComponent>().get(); }},
{"TilemapComponent", [](Object* o) { return o->GetComponent<TilemapComponent>().get(); }},
{"TextComponent", [](Object* o) { return o->GetComponent<TextComponent>().get(); }},
{"ScriptComponent", [](Object* o) { return o->GetComponent<ScriptComponent>().get(); }},
{"AnimationComponent", [](Object* o) { return o->GetComponent<AnimationComponent>().get(); }},
{"AudioPlayerComponent", [](Object* o) { return o->GetComponent<AudioPlayerComponent>().get(); }},
{"SpriteComponent", [](Object *o)
{ return o->GetComponent<SpriteComponent>().get(); }},
{"CameraComponent", [](Object *o)
{ return o->GetComponent<CameraComponent>().get(); }},
{"LightComponent", [](Object *o)
{ return o->GetComponent<LightComponent>().get(); }},
{"TilemapComponent", [](Object *o)
{ return o->GetComponent<TilemapComponent>().get(); }},
{"TextComponent", [](Object *o)
{ return o->GetComponent<TextComponent>().get(); }},
{"ScriptComponent", [](Object *o)
{ return o->GetComponent<ScriptComponent>().get(); }},
{"AnimationComponent", [](Object *o)
{ return o->GetComponent<AnimationComponent>().get(); }},
{"AudioPlayerComponent", [](Object *o)
{ return o->GetComponent<AudioPlayerComponent>().get(); }},
};
auto it = table.find(type);
@ -177,8 +228,6 @@ static Component* GetComponentByName(Object* obj, const std::string& type)
return nullptr;
}
static int Lua_GetMousePos(lua_State *L)
{
PROFILE_DEEP_SCOPE("Engine::GetMousePos");
@ -248,38 +297,37 @@ static int Lua_Object_GetComponent(lua_State *L)
return 1;
}
static AudioPlayerComponent* CheckSound(lua_State* L)
static AudioPlayerComponent *CheckSound(lua_State *L)
{
return ((LuaSoundWrapper*)luaL_checkudata(L, 1, LUA_SOUND_MT))->comp;
return ((LuaSoundWrapper *)luaL_checkudata(L, 1, LUA_SOUND_MT))->comp;
}
static int Lua_Sound_Play(lua_State* L)
static int Lua_Sound_Play(lua_State *L)
{
CheckSound(L)->Play();
return 0;
}
static int Lua_Sound_Stop(lua_State* L)
static int Lua_Sound_Stop(lua_State *L)
{
CheckSound(L)->Stop();
return 0;
}
static int Lua_Sound_Pause(lua_State* L)
static int Lua_Sound_Pause(lua_State *L)
{
CheckSound(L)->Pause();
return 0;
}
static int Lua_Sound_SetVolume(lua_State* L)
static int Lua_Sound_SetVolume(lua_State *L)
{
float vol = static_cast<float>(luaL_checknumber(L, 2));
CheckSound(L)->SetVolume(vol);
return 0;
}
static int Lua_Sound_Index(lua_State* L)
static int Lua_Sound_Index(lua_State *L)
{
luaL_getmetatable(L, LUA_SOUND_MT);
lua_pushvalue(L, 2);
@ -287,8 +335,6 @@ static int Lua_Sound_Index(lua_State* L)
return 1;
}
static int Lua_Object_GetPosition(lua_State *L)
{
PROFILE_DEEP_SCOPE("Object::GetPosition");
@ -444,14 +490,18 @@ static int Lua_Light_Index(lua_State *L)
return 1;
}
void RegisterSoundType(lua_State* L)
void RegisterSoundType(lua_State *L)
{
luaL_newmetatable(L, LUA_SOUND_MT);
lua_pushcfunction(L, Lua_Sound_Play); lua_setfield(L, -2, "Play");
lua_pushcfunction(L, Lua_Sound_Stop); lua_setfield(L, -2, "Stop");
lua_pushcfunction(L, Lua_Sound_Pause); lua_setfield(L, -2, "Pause");
lua_pushcfunction(L, Lua_Sound_SetVolume); lua_setfield(L, -2, "SetVolume");
lua_pushcfunction(L, Lua_Sound_Play);
lua_setfield(L, -2, "Play");
lua_pushcfunction(L, Lua_Sound_Stop);
lua_setfield(L, -2, "Stop");
lua_pushcfunction(L, Lua_Sound_Pause);
lua_setfield(L, -2, "Pause");
lua_pushcfunction(L, Lua_Sound_SetVolume);
lua_setfield(L, -2, "SetVolume");
lua_pushcfunction(L, Lua_Sound_Index);
lua_setfield(L, -2, "__index");
@ -459,9 +509,6 @@ void RegisterSoundType(lua_State* L)
lua_pop(L, 1);
}
void RegisterLightType(lua_State *L)
{
luaL_newmetatable(L, LUA_LIGHT_MT);
@ -951,6 +998,11 @@ void ScriptComponent::RegisterEngineBindings()
lua_pushcfunction(L, Lua_GetMousePos);
lua_setfield(L, -2, "GetMousePos");
lua_pushcfunction(L, Lua_SetGlobal);
lua_setfield(L, -2, "SetGlobal");
lua_pushcfunction(L, Lua_GetGlobal);
lua_setfield(L, -2, "GetGlobal");
lua_setglobal(L, "Engine");
}

View File

@ -24,10 +24,14 @@
#include "core/utils/Profiler.h"
#include "core/utils/utils.h"
#include "core/utils/LoadingWindow.h"
#include "core/scripts/LuaGlobalBridge.h"
#include "editor/windows/AssetBrowser.h"
#include "editor/windows/Inspector.h"
#include "editor/windows/AudioInfo.h"
#include "editor/windows/LuaGlobals.h"
#include <GL/glew.h>
#include <GLFW/glfw3.h>
@ -431,46 +435,53 @@ void ShowColorCorrectionWindow()
ImGui::End();
}
void DrawGizmoForObject(const std::shared_ptr<Object> &obj, const glm::mat4 &view, const glm::mat4 &projection)
#include <ImGuizmo.h>
void DrawGizmoForObject(const std::shared_ptr<Object>& obj, const glm::mat4& view, const glm::mat4& projection)
{
if (!obj)
return;
// 1. Build model matrix from position and rotation
glm::mat4 model = glm::translate(glm::mat4(1.0f), glm::vec3(obj->GetLocalPosition(), 0.0f));
model = glm::rotate(model, obj->GetLocalRotation(), glm::vec3(0.0f, 0.0f, 1.0f));
// Setup ImGuizmo
// 2. Ensure ImGuizmo is configured correctly
ImGuizmo::SetOrthographic(false);
ImGuizmo::SetDrawlist();
ImVec2 windowPos = ImGui::GetWindowPos();
ImVec2 windowSize = ImGui::GetWindowSize();
ImGuizmo::SetRect(windowPos.x, windowPos.y, windowSize.x, windowSize.y);
// 3. Set ImGuizmo rect to match current window (e.g., your viewport)
ImVec2 pos = ImGui::GetWindowPos();
ImVec2 size = ImGui::GetWindowSize();
ImGuizmo::SetRect(pos.x, pos.y, size.x, size.y);
// 4. Handle mode switching
static ImGuizmo::OPERATION operation = ImGuizmo::TRANSLATE;
if (ImGui::IsKeyPressed(ImGuiKey_T))
operation = ImGuizmo::TRANSLATE;
if (ImGui::IsKeyPressed(ImGuiKey_R))
operation = ImGuizmo::ROTATE;
// 5. Perform manipulation
glm::mat4 manipulated = model;
ImGuizmo::Manipulate(glm::value_ptr(view), glm::value_ptr(projection),
operation, ImGuizmo::LOCAL, glm::value_ptr(manipulated));
// 6. Apply result to object if actively using gizmo
if (ImGuizmo::IsUsing())
{
glm::vec3 translation, rotation, dummyScale;
glm::vec3 translation, rotation, scale;
ImGuizmo::DecomposeMatrixToComponents(glm::value_ptr(manipulated),
glm::value_ptr(translation),
glm::value_ptr(rotation),
glm::value_ptr(dummyScale));
glm::value_ptr(scale));
obj->SetLocalPosition(translation);
obj->SetLocalPosition({translation.x, translation.y});
obj->SetLocalRotation(rotation.z);
}
}
void Engine::Init()
{
@ -789,6 +800,8 @@ void Engine::Run()
ImGui::Checkbox("Assets", &g_engineConfig.settings.show_asset_window);
ImGui::Checkbox("Performance Info", &g_engineConfig.settings.show_performance_window);
ImGui::Checkbox("Audio Viewer", &g_engineConfig.settings.show_audio_window);
ImGui::Checkbox("Lua Globals Viewer", &g_engineConfig.settings.show_lua_globals_window);
ImGui::EndMenu();
}
@ -816,6 +829,7 @@ void Engine::Run()
ShowAssetBrowser();
DrawAudioPlayingList();
DrawImGuiWindow();
{
PROFILE_ENGINE_SCOPE("Engine::DrawSceneTree");
@ -897,12 +911,17 @@ void Engine::Run()
editorCameraSavedPos = cameraPos;
editorCameraSavedZoom = cameraZoom;
editorCameraWasSaved = true;
LuaGlobalBridge::Clear();
}
else if (!playing && lastPlaying && editorCameraWasSaved)
{
cameraPos = editorCameraSavedPos;
cameraZoom = editorCameraSavedZoom;
editorCameraWasSaved = false;
LuaGlobalBridge::Clear();
}
lastPlaying = playing;

View File

@ -0,0 +1,31 @@
#include "LuaGlobalBridge.h"
void LuaGlobalBridge::Set(const std::string& key, const Value& value)
{
std::lock_guard<std::mutex> lock(mutex);
globals[key] = value;
}
std::optional<LuaGlobalBridge::Value> LuaGlobalBridge::Get(const std::string& key)
{
std::lock_guard<std::mutex> lock(mutex);
auto it = globals.find(key);
if (it != globals.end())
return it->second;
return std::nullopt;
}
std::unordered_map<std::string, LuaGlobalBridge::Value> LuaGlobalBridge::GetAll()
{
std::lock_guard<std::mutex> lock(mutex);
return globals;
}
void LuaGlobalBridge::Clear()
{
std::lock_guard<std::mutex> lock(mutex);
globals.clear();
}

View File

@ -0,0 +1,25 @@
#pragma once
#include <string>
#include <unordered_map>
#include <variant>
#include <optional>
#include <mutex>
class LuaGlobalBridge
{
public:
using Value = std::variant<double, bool, std::string>;
static void Set(const std::string& key, const Value& value);
static std::optional<Value> Get(const std::string& key);
static std::unordered_map<std::string, Value> GetAll();
static void Clear();
private:
static inline std::unordered_map<std::string, Value> globals;
static inline std::mutex mutex;
};

View File

@ -13,7 +13,8 @@
USER_SETTING(profile_gpu, bool, false) \
USER_SETTING(show_performance_window, bool, false) \
USER_SETTING(show_audio_window, bool, false) \
USER_SETTING(ignore_invalid_versions_popups, bool, false)
USER_SETTING(ignore_invalid_versions_popups, bool, false) \
USER_SETTING(show_lua_globals_window, bool, true)

View File

@ -0,0 +1,58 @@
#include "LuaGlobals.h"
#include "../../core/scripts/LuaGlobalBridge.h"
#include "../../core/utils/Logging.h"
#include "../../core/utils/EngineConfig.h"
#include <imgui.h>
void DrawImGuiWindow()
{
if (!g_engineConfig.settings.show_lua_globals_window)
return;
auto allGlobals = LuaGlobalBridge::GetAll();
ImGui::Begin("Lua Globals");
if (allGlobals.empty())
{
ImGui::TextDisabled("No global variables set.");
}
else
{
ImGui::Text("Active Globals:");
ImGui::Separator();
ImGui::Columns(2, nullptr, false);
ImGui::SetColumnWidth(0, 160);
ImGui::TextColored(ImVec4(1, 1, 0.4f, 1), "Key");
ImGui::NextColumn();
ImGui::TextColored(ImVec4(1, 1, 0.4f, 1), "Value");
ImGui::NextColumn();
ImGui::Separator();
for (const auto& [key, value] : allGlobals)
{
std::string valueStr;
std::visit([&](auto&& val) {
using T = std::decay_t<decltype(val)>;
if constexpr (std::is_same_v<T, double>)
valueStr = std::to_string(val);
else if constexpr (std::is_same_v<T, bool>)
valueStr = val ? "true" : "false";
else if constexpr (std::is_same_v<T, std::string>)
valueStr = val;
}, value);
ImGui::TextUnformatted(key.c_str());
ImGui::NextColumn();
ImGui::TextUnformatted(valueStr.c_str());
ImGui::NextColumn();
}
ImGui::Columns(1);
}
ImGui::End();
}

View File

@ -0,0 +1,4 @@
#pragma once
void DrawImGuiWindow();