Added Lua User Input System.

This commit is contained in:
OusmBlueNinja 2025-01-01 01:36:53 -06:00
parent 513414608d
commit f7f5ffa4e4
17 changed files with 484 additions and 68 deletions

View File

@ -2,7 +2,7 @@
# Compiler and Flags
CXX := g++
CXXFLAGS := -Wall -Wextra -std=c++17 -g -DDEBUG
CXXFLAGS := -Wall -Wextra -std=c++17 -g -DDEBUG -DTIMERS
# Directories
SRC_DIR := src

View File

@ -1,4 +1,5 @@
local Engine = require("./assets/scripts/engine")
local KeyCode = require("./assets/scripts/keycode")
local transform = nil
@ -6,30 +7,49 @@ local transform = nil
local new_rotation = 0
local new_rotationSpeed = 15
local Move_Speec = 300
function OnInit()
function OnInit()
local gameObject = Engine.GetGameObjectByTag("Camera")
transform = gameObject:GetComponent("Transform")
Engine.Log("Init Done")
end
function OnUpdate(deltaTime)
local gameObject = Engine.GetGameObjectByTag("Camera")
transform = gameObject:GetComponent("Transform")
local gameObject = Engine.GetGameObjectByTag("Camera")
transform = gameObject:GetComponent("Transform")
local old_rotation = transform:GetRotation()
local old_rotation = transform:GetRotation()
local rotation = {
x = old_rotation.x, -- Preserving existing new_rotation on X-axis
y = new_rotation, -- Updated new_rotation on Y-axis for spinning
z = old_rotation.z -- Preserving existing new_rotation on Z-axis
}
-- Apply the new new_rotation to the Transform component
transform:SetRotation(rotation)
new_rotation = new_rotation + (deltaTime * new_rotationSpeed)
if new_rotation >= 360 then
new_rotation = 0
end
end
local Position = transform:GetPosition()
if Engine.KeyDown(KeyCode.W) then
Position.x = Position.x + (deltaTime * Move_Speec)
end
if Engine.KeyDown(KeyCode.S) then
Position.x = Position.x - (deltaTime * Move_Speec)
end
if Engine.KeyDown(KeyCode.D) then
Position.z = Position.z + (deltaTime * Move_Speec)
end
if Engine.KeyDown(KeyCode.A) then
Position.z = Position.z - (deltaTime * Move_Speec)
end
transform:SetPosition(Position)
local rotation = {
x = old_rotation.x, -- Preserving existing new_rotation on X-axis
y = new_rotation, -- Updated new_rotation on Y-axis for spinning
z = old_rotation.z -- Preserving existing new_rotation on Z-axis
}
-- Apply the new new_rotation to the Transform component
transform:SetRotation(rotation)
new_rotation = new_rotation + (deltaTime * new_rotationSpeed)
if new_rotation >= 360 then
new_rotation = 0
end
end

View File

@ -0,0 +1 @@
return _T_KeyCode_Table

View File

@ -1,6 +1,6 @@
[Window][DockSpace]
Pos=0,0
Size=1280,720
Size=1920,1177
Collapsed=0
[Window][Debug##Default]
@ -80,8 +80,8 @@ Collapsed=0
DockId=0x0000001F,0
[Window][Performance##performance]
Pos=8,435
Size=322,277
Pos=8,706
Size=322,463
Collapsed=0
DockId=0x0000001C,0
@ -105,7 +105,7 @@ DockId=0x0000000F,0
[Window][Scene Window##SceneWindow]
Pos=8,28
Size=322,405
Size=322,676
Collapsed=0
DockId=0x0000001B,0
@ -134,26 +134,26 @@ Collapsed=0
DockId=0x0000001E,0
[Window][ Logger##logger]
Pos=607,354
Size=277,358
Pos=1070,811
Size=454,358
Collapsed=0
DockId=0x00000024,0
[Window][ Editor##EditorWindow]
Pos=332,28
Size=552,324
Size=1192,781
Collapsed=0
DockId=0x0000001F,0
[Window][ Inspector##InspectorWindow]
Pos=886,28
Size=386,684
Pos=1526,28
Size=386,1141
Collapsed=0
DockId=0x00000022,0
[Window][ Profiler]
Pos=332,354
Size=273,358
Pos=332,811
Size=736,358
Collapsed=0
DockId=0x00000023,0
@ -164,14 +164,14 @@ Column 2 Weight=0.6474
Column 3 Weight=1.0088
[Table][0x08173DEA,4]
Column 0 Weight=1.0000
Column 1 Weight=1.0000
Column 2 Weight=1.0000
Column 3 Weight=1.0000
Column 0 Weight=1.2209
Column 1 Weight=1.1411
Column 2 Weight=1.2270
Column 3 Weight=0.4110
[Docking][Data]
DockSpace ID=0x14621557 Window=0x3DA2F1DE Pos=172,215 Size=1264,684 Split=X Selected=0xF7365A5A
DockNode ID=0x00000021 Parent=0x14621557 SizeRef=876,1139 Split=X
DockSpace ID=0x14621557 Window=0x3DA2F1DE Pos=8,51 Size=1904,1141 Split=X Selected=0xF7365A5A
DockNode ID=0x00000021 Parent=0x14621557 SizeRef=1516,1141 Split=X
DockNode ID=0x00000013 Parent=0x00000021 SizeRef=322,1142 Split=Y Selected=0x818D04BB
DockNode ID=0x0000001B Parent=0x00000013 SizeRef=264,675 HiddenTabBar=1 Selected=0x1D5D92B6
DockNode ID=0x0000001C Parent=0x00000013 SizeRef=264,463 HiddenTabBar=1 Selected=0x818D04BB
@ -194,8 +194,8 @@ DockSpace ID=0x14621557 Window=0x3DA2F1DE Pos=172,215
DockNode ID=0x0000001D Parent=0x00000017 SizeRef=518,720 Split=Y Selected=0xDFF75B3F
DockNode ID=0x0000001F Parent=0x0000001D SizeRef=518,779 CentralNode=1 Selected=0x9A7B23B9
DockNode ID=0x00000020 Parent=0x0000001D SizeRef=518,358 Split=X Selected=0x7A66B86B
DockNode ID=0x00000023 Parent=0x00000020 SizeRef=273,358 HiddenTabBar=1 Selected=0x7A66B86B
DockNode ID=0x00000024 Parent=0x00000020 SizeRef=277,358 HiddenTabBar=1 Selected=0x1F29F1F5
DockNode ID=0x00000023 Parent=0x00000020 SizeRef=736,358 HiddenTabBar=1 Selected=0x7A66B86B
DockNode ID=0x00000024 Parent=0x00000020 SizeRef=454,358 HiddenTabBar=1 Selected=0x1F29F1F5
DockNode ID=0x0000001E Parent=0x00000017 SizeRef=518,417 Selected=0xC74E1AEE
DockNode ID=0x00000018 Parent=0x0000000D SizeRef=1202,364 Split=X Selected=0x1C0788A1
DockNode ID=0x00000019 Parent=0x00000018 SizeRef=601,364 Selected=0x1C0788A1
@ -204,7 +204,7 @@ DockSpace ID=0x14621557 Window=0x3DA2F1DE Pos=172,215
DockNode ID=0x00000004 Parent=0x00000001 SizeRef=1202,291 Selected=0x9DD4E196
DockNode ID=0x00000002 Parent=0x00000008 SizeRef=334,1142 HiddenTabBar=1 Selected=0x36DC96AB
DockNode ID=0x00000016 Parent=0x00000014 SizeRef=420,1142 Selected=0x8D0E8380
DockNode ID=0x00000022 Parent=0x14621557 SizeRef=386,1139 Selected=0xD1D25642
DockNode ID=0x00000022 Parent=0x14621557 SizeRef=386,1141 Selected=0xD1D25642
DockSpace ID=0xC6145A92 Pos=8,27 Size=1904,1142 Split=X
DockNode ID=0x0000000F Parent=0xC6145A92 SizeRef=301,1142 Selected=0xA8433A03
DockNode ID=0x00000010 Parent=0xC6145A92 SizeRef=1601,1142 CentralNode=1

View File

@ -88,6 +88,7 @@ bool GameObject::RemoveComponent(const std::shared_ptr<Component> &component)
return true;
}
}
return false;
}
void GameObject::Update(float deltaTime)

View File

@ -33,7 +33,7 @@
#include "Engine/SceneManager.h"
#include "Engine/LuaAPI.h"
#include "Engine/Utilitys.h"
#include "Engine/InputManager.h"
#include "Engine/ScopedTimer.h"
#include "Engine/Profiler.h"
@ -48,6 +48,9 @@ LoggerWindow *g_LoggerWindow;
SceneManager g_SceneManager;
InputManager g_InputManager;
std::vector<std::shared_ptr<GameObject>> g_GameObjects;
std::shared_ptr<CameraComponent> g_RuntimeCameraObject;
@ -202,6 +205,13 @@ void MyEngine::Run()
glfwPollEvents();
}
{
SCOPE_TIMER("InputManagerUpdate");
g_InputManager.Update(m_Window);
}
// Calculate current time
double current_time = glfwGetTime();

View File

@ -0,0 +1,29 @@
// InputManager.cpp
#include "InputManager.h"
#include <GLFW/glfw3.h>
void InputManager::Update(GLFWwindow* window)
{
if (!window)
{
return;
}
// Update the state of each key
for (int key = 0; key <= GLFW_KEY_LAST; ++key)
{
m_KeyStates[key] = glfwGetKey(window, key) == GLFW_PRESS;
}
}
bool InputManager::IsKeyPressed(KeyCode key) const
{
int keyInt = static_cast<int>(key);
if (keyInt >= 0 && keyInt <= GLFW_KEY_LAST)
{
return m_KeyStates[keyInt];
}
return false;
}

20
src/Engine/InputManager.h Normal file
View File

@ -0,0 +1,20 @@
// InputManager.h
#pragma once
#include "KeyCode.h"
#include <GLFW/glfw3.h>
class InputManager
{
public:
// Update key states (to be called every frame)
void Update(GLFWwindow* window);
// Check if a key is pressed
bool IsKeyPressed(KeyCode key) const;
private:
// Array or map storing key states
bool m_KeyStates[GLFW_KEY_LAST + 1] = { false };
};

128
src/Engine/KeyCode.h Normal file
View File

@ -0,0 +1,128 @@
// KeyCode.h
#pragma once
#include <GLFW/glfw3.h>
enum class KeyCode
{
Space = GLFW_KEY_SPACE,
Apostrophe = GLFW_KEY_APOSTROPHE,
Comma = GLFW_KEY_COMMA,
Minus = GLFW_KEY_MINUS,
Period = GLFW_KEY_PERIOD,
Slash = GLFW_KEY_SLASH,
D0 = GLFW_KEY_0,
D1 = GLFW_KEY_1,
D2 = GLFW_KEY_2,
D3 = GLFW_KEY_3,
D4 = GLFW_KEY_4,
D5 = GLFW_KEY_5,
D6 = GLFW_KEY_6,
D7 = GLFW_KEY_7,
D8 = GLFW_KEY_8,
D9 = GLFW_KEY_9,
Semicolon = GLFW_KEY_SEMICOLON,
Equal = GLFW_KEY_EQUAL,
A = GLFW_KEY_A,
B = GLFW_KEY_B,
C = GLFW_KEY_C,
D = GLFW_KEY_D,
E = GLFW_KEY_E,
F = GLFW_KEY_F,
G = GLFW_KEY_G,
H = GLFW_KEY_H,
I = GLFW_KEY_I,
J = GLFW_KEY_J,
K = GLFW_KEY_K,
L = GLFW_KEY_L,
M = GLFW_KEY_M,
N = GLFW_KEY_N,
O = GLFW_KEY_O,
P = GLFW_KEY_P,
Q = GLFW_KEY_Q,
R = GLFW_KEY_R,
S = GLFW_KEY_S,
T = GLFW_KEY_T,
U = GLFW_KEY_U,
V = GLFW_KEY_V,
W = GLFW_KEY_W,
X = GLFW_KEY_X,
Y = GLFW_KEY_Y,
Z = GLFW_KEY_Z,
LeftBracket = GLFW_KEY_LEFT_BRACKET,
Backslash = GLFW_KEY_BACKSLASH,
RightBracket = GLFW_KEY_RIGHT_BRACKET,
GraveAccent = GLFW_KEY_GRAVE_ACCENT,
World1 = GLFW_KEY_WORLD_1,
World2 = GLFW_KEY_WORLD_2,
Escape = GLFW_KEY_ESCAPE,
Enter = GLFW_KEY_ENTER,
Tab = GLFW_KEY_TAB,
Backspace = GLFW_KEY_BACKSPACE,
Insert = GLFW_KEY_INSERT,
Delete = GLFW_KEY_DELETE,
Right = GLFW_KEY_RIGHT,
Left = GLFW_KEY_LEFT,
Down = GLFW_KEY_DOWN,
Up = GLFW_KEY_UP,
PageUp = GLFW_KEY_PAGE_UP,
PageDown = GLFW_KEY_PAGE_DOWN,
Home = GLFW_KEY_HOME,
End = GLFW_KEY_END,
CapsLock = GLFW_KEY_CAPS_LOCK,
ScrollLock = GLFW_KEY_SCROLL_LOCK,
NumLock = GLFW_KEY_NUM_LOCK,
PrintScreen = GLFW_KEY_PRINT_SCREEN,
Pause = GLFW_KEY_PAUSE,
F1 = GLFW_KEY_F1,
F2 = GLFW_KEY_F2,
F3 = GLFW_KEY_F3,
F4 = GLFW_KEY_F4,
F5 = GLFW_KEY_F5,
F6 = GLFW_KEY_F6,
F7 = GLFW_KEY_F7,
F8 = GLFW_KEY_F8,
F9 = GLFW_KEY_F9,
F10 = GLFW_KEY_F10,
F11 = GLFW_KEY_F11,
F12 = GLFW_KEY_F12,
F13 = GLFW_KEY_F13,
F14 = GLFW_KEY_F14,
F15 = GLFW_KEY_F15,
F16 = GLFW_KEY_F16,
F17 = GLFW_KEY_F17,
F18 = GLFW_KEY_F18,
F19 = GLFW_KEY_F19,
F20 = GLFW_KEY_F20,
F21 = GLFW_KEY_F21,
F22 = GLFW_KEY_F22,
F23 = GLFW_KEY_F23,
F24 = GLFW_KEY_F24,
F25 = GLFW_KEY_F25,
KP0 = GLFW_KEY_KP_0,
KP1 = GLFW_KEY_KP_1,
KP2 = GLFW_KEY_KP_2,
KP3 = GLFW_KEY_KP_3,
KP4 = GLFW_KEY_KP_4,
KP5 = GLFW_KEY_KP_5,
KP6 = GLFW_KEY_KP_6,
KP7 = GLFW_KEY_KP_7,
KP8 = GLFW_KEY_KP_8,
KP9 = GLFW_KEY_KP_9,
KPDecimal = GLFW_KEY_KP_DECIMAL,
KPDivide = GLFW_KEY_KP_DIVIDE,
KPMultiply = GLFW_KEY_KP_MULTIPLY,
KPSubtract = GLFW_KEY_KP_SUBTRACT,
KPAdd = GLFW_KEY_KP_ADD,
KPEnter = GLFW_KEY_KP_ENTER,
KPEqual = GLFW_KEY_KP_EQUAL,
LeftShift = GLFW_KEY_LEFT_SHIFT,
LeftControl = GLFW_KEY_LEFT_CONTROL,
LeftAlt = GLFW_KEY_LEFT_ALT,
LeftSuper = GLFW_KEY_LEFT_SUPER,
RightShift = GLFW_KEY_RIGHT_SHIFT,
RightControl = GLFW_KEY_RIGHT_CONTROL,
RightAlt = GLFW_KEY_RIGHT_ALT,
RightSuper = GLFW_KEY_RIGHT_SUPER,
Menu = GLFW_KEY_MENU
};

View File

@ -9,6 +9,9 @@
#include "Componenets/ScriptComponent.h"
#include "Componenets/GameObject.h"
#include "Windows/LoggerWindow.h"
#include "Engine/InputManager.h"
#include "KeyCode.h"
#include <yaml-cpp/yaml.h>
#include <cstring>
@ -21,6 +24,10 @@
// External LoggerWindow instance for logging
extern LoggerWindow *g_LoggerWindow;
// Forward declaration of the InputManager instance
extern InputManager g_InputManager;
// External GameObjects list
extern std::vector<std::unique_ptr<GameObject>> g_GameObjects;
@ -43,6 +50,149 @@ LuaManager::~LuaManager()
}
}
// Function to create and register the KeyCode table
void LuaManager::RegisterKeyCodeTable(lua_State* L)
{
lua_newtable(L); // Create a new table and push it onto the stack
// Push key-value pairs
#define REGISTER_KEYCODE(name) \
lua_pushstring(L, #name); \
lua_pushinteger(L, static_cast<int>(KeyCode::name)); \
lua_settable(L, -3);
REGISTER_KEYCODE(Space)
REGISTER_KEYCODE(Apostrophe)
REGISTER_KEYCODE(Comma)
REGISTER_KEYCODE(Minus)
REGISTER_KEYCODE(Period)
REGISTER_KEYCODE(Slash)
REGISTER_KEYCODE(D0)
REGISTER_KEYCODE(D1)
REGISTER_KEYCODE(D2)
REGISTER_KEYCODE(D3)
REGISTER_KEYCODE(D4)
REGISTER_KEYCODE(D5)
REGISTER_KEYCODE(D6)
REGISTER_KEYCODE(D7)
REGISTER_KEYCODE(D8)
REGISTER_KEYCODE(D9)
REGISTER_KEYCODE(Semicolon)
REGISTER_KEYCODE(Equal)
REGISTER_KEYCODE(A)
REGISTER_KEYCODE(B)
REGISTER_KEYCODE(C)
REGISTER_KEYCODE(D)
REGISTER_KEYCODE(E)
REGISTER_KEYCODE(F)
REGISTER_KEYCODE(G)
REGISTER_KEYCODE(H)
REGISTER_KEYCODE(I)
REGISTER_KEYCODE(J)
REGISTER_KEYCODE(K)
REGISTER_KEYCODE(L)
REGISTER_KEYCODE(M)
REGISTER_KEYCODE(N)
REGISTER_KEYCODE(O)
REGISTER_KEYCODE(P)
REGISTER_KEYCODE(Q)
REGISTER_KEYCODE(R)
REGISTER_KEYCODE(S)
REGISTER_KEYCODE(T)
REGISTER_KEYCODE(U)
REGISTER_KEYCODE(V)
REGISTER_KEYCODE(W)
REGISTER_KEYCODE(X)
REGISTER_KEYCODE(Y)
REGISTER_KEYCODE(Z)
REGISTER_KEYCODE(LeftBracket)
REGISTER_KEYCODE(Backslash)
REGISTER_KEYCODE(RightBracket)
REGISTER_KEYCODE(GraveAccent)
REGISTER_KEYCODE(World1)
REGISTER_KEYCODE(World2)
REGISTER_KEYCODE(Escape)
REGISTER_KEYCODE(Enter)
REGISTER_KEYCODE(Tab)
REGISTER_KEYCODE(Backspace)
REGISTER_KEYCODE(Insert)
REGISTER_KEYCODE(Delete)
REGISTER_KEYCODE(Right)
REGISTER_KEYCODE(Left)
REGISTER_KEYCODE(Down)
REGISTER_KEYCODE(Up)
REGISTER_KEYCODE(PageUp)
REGISTER_KEYCODE(PageDown)
REGISTER_KEYCODE(Home)
REGISTER_KEYCODE(End)
REGISTER_KEYCODE(CapsLock)
REGISTER_KEYCODE(ScrollLock)
REGISTER_KEYCODE(NumLock)
REGISTER_KEYCODE(PrintScreen)
REGISTER_KEYCODE(Pause)
REGISTER_KEYCODE(F1)
REGISTER_KEYCODE(F2)
REGISTER_KEYCODE(F3)
REGISTER_KEYCODE(F4)
REGISTER_KEYCODE(F5)
REGISTER_KEYCODE(F6)
REGISTER_KEYCODE(F7)
REGISTER_KEYCODE(F8)
REGISTER_KEYCODE(F9)
REGISTER_KEYCODE(F10)
REGISTER_KEYCODE(F11)
REGISTER_KEYCODE(F12)
REGISTER_KEYCODE(F13)
REGISTER_KEYCODE(F14)
REGISTER_KEYCODE(F15)
REGISTER_KEYCODE(F16)
REGISTER_KEYCODE(F17)
REGISTER_KEYCODE(F18)
REGISTER_KEYCODE(F19)
REGISTER_KEYCODE(F20)
REGISTER_KEYCODE(F21)
REGISTER_KEYCODE(F22)
REGISTER_KEYCODE(F23)
REGISTER_KEYCODE(F24)
REGISTER_KEYCODE(F25)
REGISTER_KEYCODE(KP0)
REGISTER_KEYCODE(KP1)
REGISTER_KEYCODE(KP2)
REGISTER_KEYCODE(KP3)
REGISTER_KEYCODE(KP4)
REGISTER_KEYCODE(KP5)
REGISTER_KEYCODE(KP6)
REGISTER_KEYCODE(KP7)
REGISTER_KEYCODE(KP8)
REGISTER_KEYCODE(KP9)
REGISTER_KEYCODE(KPDecimal)
REGISTER_KEYCODE(KPDivide)
REGISTER_KEYCODE(KPMultiply)
REGISTER_KEYCODE(KPSubtract)
REGISTER_KEYCODE(KPAdd)
REGISTER_KEYCODE(KPEnter)
REGISTER_KEYCODE(KPEqual)
REGISTER_KEYCODE(LeftShift)
REGISTER_KEYCODE(LeftControl)
REGISTER_KEYCODE(LeftAlt)
REGISTER_KEYCODE(LeftSuper)
REGISTER_KEYCODE(RightShift)
REGISTER_KEYCODE(RightControl)
REGISTER_KEYCODE(RightAlt)
REGISTER_KEYCODE(RightSuper)
REGISTER_KEYCODE(Menu)
#undef REGISTER_KEYCODE
// Set the table in the global namespace as 'KeyCode'
lua_setglobal(L, "_T_KeyCode_Table");
}
// Initialize the LuaManager with the given script path
bool LuaManager::Initialize(const std::string &scriptPath)
{
@ -84,6 +234,8 @@ bool LuaManager::Initialize(const std::string &scriptPath)
// Register all necessary metatables
RegisterAllMetatables();
RegisterKeyCodeTable(m_LuaState);
// Create the Engine table
lua_newtable(m_LuaState);
lua_setglobal(m_LuaState, "_T_Engine_Table");
@ -96,6 +248,10 @@ bool LuaManager::Initialize(const std::string &scriptPath)
lua_pushcfunction(m_LuaState, Lua_Engine_Expose);
lua_setfield(m_LuaState, -2, "Expose");
// Bind the KeyDown function to Engine.KeyDown
lua_pushcfunction(m_LuaState, Lua_Engine_KeyDown);
lua_setfield(m_LuaState, -2, "KeyDown");
// Add the ScriptName binding
lua_pushcfunction(m_LuaState, Lua_Engine_ScriptName);
lua_setfield(m_LuaState, -2, "ScriptName");
@ -212,6 +368,26 @@ void LuaManager::UpdateVariable(const std::string &name, const LuaManager::LuaEx
lua_pop(m_LuaState, 1);
}
// Lua binding for Engine.KeyDown
int LuaManager::Lua_Engine_KeyDown(lua_State* L)
{
// Check if the first argument is an integer (keycode)
if (!lua_isinteger(L, 1))
{
lua_pushstring(L, "KeyDown expects an integer keycode argument.");
lua_error(L); // Raises a Lua error and does not return
return 0; // This line won't be reached
}
int keycode = static_cast<int>(lua_tointeger(L, 1));
// Check if the key is currently pressed
bool isPressed = g_InputManager.IsKeyPressed(static_cast<KeyCode>(keycode));
lua_pushboolean(L, isPressed ? 1 : 0); // Push true or false onto the Lua stack
return 1; // Number of return values
}
int LuaManager::Lua_Engine_Expose(lua_State *L)
{
// Check that at least two arguments are passed: name and value

View File

@ -62,12 +62,9 @@ public:
using LuaExposedVariant = std::variant<int, float, std::string, bool>;
// Retrieve exposed variables
std::unordered_map<std::string, LuaExposedVariant> GetExposedVariables();
void UpdateVariable(const std::string& name, const LuaExposedVariant& value);
void UpdateVariable(const std::string &name, const LuaExposedVariant &value);
private:
// Lua state
@ -79,13 +76,14 @@ private:
static std::unordered_map<std::string, LuaExposedVariant> m_ExposedVariables;
// Last error message to prevent duplicate logging
std::string m_LastErrorMessage;
void RegisterKeyCodeTable(lua_State *L);
void LogError(const char *message);
void HandleLuaError(const std::string &functionName);
void LogError(const char* message);
void HandleLuaError(const std::string& functionName);
void RegisterAllMetatables();
void RegisterComponentMetaTable();
@ -120,8 +118,7 @@ private:
static int Lua_Engine_Log(lua_State *L);
static int Lua_Engine_ScriptName(lua_State *L);
static int Lua_Engine_GetGameObjectByTag(lua_State *L);
static int Lua_Engine_Expose(lua_State* L);
static int Lua_Engine_Expose(lua_State *L);
static int Lua_Engine_KeyDown(lua_State* L);
};

View File

@ -5,6 +5,22 @@
#include <chrono>
class Profiler; // Forward declaration
// Helper macros for token concatenation
#define CONCATENATE_DETAIL(x, y) x##y
#define CONCATENATE(x, y) CONCATENATE_DETAIL(x, y)
#ifdef TIMERS
// Use __COUNTER__ for unique variable names if available
#ifdef __COUNTER__
#define SCOPE_TIMER(name) ScopedTimer CONCATENATE(timer_, __COUNTER__)(name)
#else
// Fallback to __LINE__ if __COUNTER__ is not supported
#define SCOPE_TIMER(name) ScopedTimer CONCATENATE(timer_, __LINE__)(name)
#endif
#else
// When TIMERS is not defined, expand to nothing
#define SCOPE_TIMER(name)
#endif
class ScopedTimer {
public:

View File

@ -3,6 +3,7 @@
#include <cstring> // for strcpy, if needed
#include <glm/gtc/type_ptr.hpp> // Required for glm::value_ptr
#include "Engine/ScopedTimer.h"
#include <vector>
@ -18,6 +19,8 @@ extern LoggerWindow *g_LoggerWindow;
void InspectorWindow::Show()
{
SCOPE_TIMER("InspectorWindow::Show");
// Increase window/item spacing for a cleaner look
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(12, 12));
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(6, 4));

View File

@ -5,15 +5,18 @@
#include <cstdarg>
#include <cstdio>
#include "Icons.h"
#include "Engine/ScopedTimer.h"
// Helper function to format strings
static std::string FormatString(const char* fmt, va_list args) {
static std::string FormatString(const char *fmt, va_list args)
{
char buffer[1024];
vsnprintf(buffer, sizeof(buffer), fmt, args);
return std::string(buffer);
}
void LoggerWindow::AddLog(const char* fmt, ...) {
void LoggerWindow::AddLog(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
std::string formatted = FormatString(fmt, args);
@ -23,7 +26,8 @@ void LoggerWindow::AddLog(const char* fmt, ...) {
m_ScrollToBottom = true;
}
void LoggerWindow::AddLog(const char* fmt, std::optional<ImVec4> color, ...) {
void LoggerWindow::AddLog(const char *fmt, std::optional<ImVec4> color, ...)
{
va_list args;
va_start(args, color);
std::string formatted = FormatString(fmt, args);
@ -33,10 +37,14 @@ void LoggerWindow::AddLog(const char* fmt, std::optional<ImVec4> color, ...) {
m_ScrollToBottom = true;
}
void LoggerWindow::Show() {
void LoggerWindow::Show()
{
SCOPE_TIMER("LoggerWindow::Show");
ImGui::Begin(ICON_FA_TERMINAL " Logger##logger");
if (ImGui::Button("Clear")) {
if (ImGui::Button("Clear"))
{
m_Logs.clear();
}
@ -45,18 +53,23 @@ void LoggerWindow::Show() {
// Begin a child region to enable scrolling
ImGui::BeginChild("LoggerScrollRegion", ImVec2(0, 0), false, ImGuiWindowFlags_HorizontalScrollbar);
for (const auto& logEntry : m_Logs) {
if (logEntry.color.has_value()) {
for (const auto &logEntry : m_Logs)
{
if (logEntry.color.has_value())
{
ImGui::PushStyleColor(ImGuiCol_Text, logEntry.color.value());
ImGui::TextUnformatted(logEntry.text.c_str());
ImGui::PopStyleColor();
} else {
}
else
{
ImGui::TextUnformatted(logEntry.text.c_str());
}
}
// Auto-scroll to bottom if new logs are added
if (m_ScrollToBottom) {
if (m_ScrollToBottom)
{
ImGui::SetScrollHereY(1.0f);
m_ScrollToBottom = false;
}

View File

@ -2,14 +2,12 @@
#include "imgui.h"
#include <algorithm> // for std::max_element, etc.
#include "Engine/ThemeManager.h"
#include "Engine/ScopedTimer.h"
extern int LoadedAssets;
extern int g_GPU_Triangles_drawn_to_screen;
const char* polygonModeOptions[] = { "Fill", "Wireframe", "Points" };
const char *polygonModeOptions[] = {"Fill", "Wireframe", "Points"};
const int numPolygonModes = sizeof(polygonModeOptions) / sizeof(polygonModeOptions[0]);
int polygonMode = 0;
@ -49,11 +47,12 @@ void PerformanceWindow::UpdatePerformanceStats(int newCallCount, int newTriangle
m_TriangleCount = newTriangleCount;
g_GPU_Triangles_drawn_to_screen = 0;
}
void PerformanceWindow::Show(float fps, float ms)
{
SCOPE_TIMER("PerformanceWindow::Show");
// 1) Get current time from ImGui's internal clock
double currentTime = ImGui::GetTime();
@ -154,7 +153,7 @@ void PerformanceWindow::Show(float fps, float ms)
0,
nullptr,
0.0f,
m_TriangleCount*2.5,
m_TriangleCount * 2.5,
ImVec2(0, 50));
ImGui::Separator();
@ -164,8 +163,6 @@ void PerformanceWindow::Show(float fps, float ms)
ImGui::Separator();
const char *options[] = {"Bootsrap", "Duck Red", "Windark", "Deep Dark", "Tesseract Black"};
static int current_option = -1; // No selection initially
@ -177,7 +174,7 @@ void PerformanceWindow::Show(float fps, float ms)
bool is_selected = (current_option == n);
if (ImGui::Selectable(options[n], is_selected))
{
current_option = n; // Update current option
current_option = n; // Update current option
ThemeManager_ChangeTheme(n); // Call the function with the selected option
}
// Set the initial focus when opening the combo (optional)

View File

@ -4,6 +4,7 @@
#include <string>
#include <iostream> // For debug statements
#include "Icons.h"
#include "Engine/ScopedTimer.h"
// Constructor
ProfilerWindow::ProfilerWindow()
@ -87,6 +88,8 @@ void ProfilerWindow::UpdateHistory(const std::unordered_map<std::string, Profile
void ProfilerWindow::Show()
{
SCOPE_TIMER("ProfilerWindow::Show");
// Check if it's time to update the profiler data
auto now = std::chrono::steady_clock::now();
std::chrono::duration<double> elapsed = now - m_LastUpdateTime;
@ -99,7 +102,7 @@ void ProfilerWindow::Show()
}
// Begin ImGui window with improved styling
ImGui::Begin(ICON_FA_GAUGE " Profiler", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_HorizontalScrollbar);
ImGui::Begin(ICON_FA_GAUGE " Profiler", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_HorizontalScrollbar);
const auto &data = Profiler::Get().GetLastFrameData();

View File

@ -6,6 +6,7 @@
#include "Engine/AssetManager.h"
#include "TestModel.h"
#include "gcml.h"
#include "Engine/ScopedTimer.h"
#include <iostream>
@ -28,6 +29,7 @@ std::shared_ptr<GameObject> CreateDefaultCube()
void SceneWindow::Show()
{
SCOPE_TIMER("SceneWindow::Show");
if (ImGui::Begin("Scene Window##SceneWindow"))
{
// Add Button