Compare commits

..

No commits in common. "ca427b043fd696a8710c652b3e65c048f6835c88" and "dbd23a30fc06009bb4301d9a47d8d7c22bca574a" have entirely different histories.

10 changed files with 304 additions and 1685 deletions

132
imgui.ini
View File

@ -19,7 +19,7 @@ DockId=0x00000002,0
Pos=374,27 Pos=374,27
Size=1212,770 Size=1212,770
Collapsed=0 Collapsed=0
DockId=0x0000001F,0 DockId=0x00000017,0
[Window][Performance] [Window][Performance]
Pos=8,774 Pos=8,774
@ -49,7 +49,7 @@ DockId=0x0000000B,0
Pos=374,27 Pos=374,27
Size=1202,849 Size=1202,849
Collapsed=0 Collapsed=0
DockId=0x0000001F,0 DockId=0x00000017,0
[Window][Lua Text Editor] [Window][Lua Text Editor]
Pos=8,481 Pos=8,481
@ -68,26 +68,26 @@ Size=1920,1177
Collapsed=0 Collapsed=0
[Window][Inspector##InspectorWindow] [Window][Inspector##InspectorWindow]
Pos=1492,30 Pos=1536,27
Size=420,1139 Size=376,1142
Collapsed=0 Collapsed=0
DockId=0x00000016,0 DockId=0x00000016,0
[Window][Editor##EditorWindow] [Window][Editor##EditorWindow]
Pos=332,30 Pos=332,27
Size=1158,430 Size=1202,776
Collapsed=0 Collapsed=0
DockId=0x0000001F,0 DockId=0x00000017,0
[Window][Performance##performance] [Window][Performance##performance]
Pos=8,746 Pos=8,761
Size=322,423 Size=322,408
Collapsed=0 Collapsed=0
DockId=0x0000001C,0 DockId=0x0000001C,0
[Window][Logger##logger] [Window][Logger##logger]
Pos=332,348 Pos=332,805
Size=518,364 Size=1202,364
Collapsed=0 Collapsed=0
DockId=0x00000019,0 DockId=0x00000019,0
@ -104,8 +104,8 @@ Collapsed=0
DockId=0x0000000F,0 DockId=0x0000000F,0
[Window][Scene Window##SceneWindow] [Window][Scene Window##SceneWindow]
Pos=8,30 Pos=8,27
Size=322,714 Size=322,732
Collapsed=0 Collapsed=0
DockId=0x0000001B,0 DockId=0x0000001B,0
@ -116,8 +116,8 @@ Collapsed=0
DockId=0x00000011,0 DockId=0x00000011,0
[Window][Profiler] [Window][Profiler]
Pos=332,805 Pos=935,805
Size=1158,364 Size=599,364
Collapsed=0 Collapsed=0
DockId=0x0000001A,0 DockId=0x0000001A,0
@ -127,83 +127,41 @@ Size=1202,364
Collapsed=0 Collapsed=0
DockId=0x00000019,1 DockId=0x00000019,1
[Window][Logger##logger]
Pos=332,752
Size=1158,417
Collapsed=0
DockId=0x0000001E,0
[Window][ Logger##logger]
Pos=332,828
Size=1187,341
Collapsed=0
DockId=0x00000020,1
[Window][ Editor##EditorWindow]
Pos=332,30
Size=1187,796
Collapsed=0
DockId=0x0000001F,0
[Window][ Inspector##InspectorWindow]
Pos=1521,30
Size=391,1139
Collapsed=0
DockId=0x00000022,0
[Window][ Profiler]
Pos=332,828
Size=1187,341
Collapsed=0
DockId=0x00000020,0
[Table][0xE9E836E4,4] [Table][0xE9E836E4,4]
Column 0 Weight=1.2999 Column 0 Weight=1.2999
Column 1 Weight=1.0439 Column 1 Weight=1.0439
Column 2 Weight=0.6474 Column 2 Weight=0.6474
Column 3 Weight=1.0088 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
[Docking][Data] [Docking][Data]
DockSpace ID=0x14621557 Window=0x3DA2F1DE Pos=8,53 Size=1904,1139 Split=X Selected=0xF7365A5A DockSpace ID=0x14621557 Window=0x3DA2F1DE Pos=8,50 Size=1904,1142 Split=X Selected=0xF7365A5A
DockNode ID=0x00000021 Parent=0x14621557 SizeRef=871,1139 Split=X DockNode ID=0x00000013 Parent=0x14621557 SizeRef=322,1142 Split=Y Selected=0x818D04BB
DockNode ID=0x00000013 Parent=0x00000021 SizeRef=322,1142 Split=Y Selected=0x818D04BB DockNode ID=0x0000001B Parent=0x00000013 SizeRef=264,456 HiddenTabBar=1 Selected=0x1D5D92B6
DockNode ID=0x0000001B Parent=0x00000013 SizeRef=264,714 HiddenTabBar=1 Selected=0x1D5D92B6 DockNode ID=0x0000001C Parent=0x00000013 SizeRef=264,254 HiddenTabBar=1 Selected=0x818D04BB
DockNode ID=0x0000001C Parent=0x00000013 SizeRef=264,423 HiddenTabBar=1 Selected=0x818D04BB DockNode ID=0x00000014 Parent=0x14621557 SizeRef=1580,1142 Split=X
DockNode ID=0x00000014 Parent=0x00000021 SizeRef=547,1142 Split=X DockNode ID=0x00000015 Parent=0x00000014 SizeRef=1202,1142 Split=X
DockNode ID=0x00000015 Parent=0x00000014 SizeRef=1158,1142 Split=X DockNode ID=0x00000011 Parent=0x00000015 SizeRef=265,1142 Selected=0x1D5D92B6
DockNode ID=0x00000011 Parent=0x00000015 SizeRef=265,1142 Selected=0x1D5D92B6 DockNode ID=0x00000012 Parent=0x00000015 SizeRef=1259,1142 Split=X
DockNode ID=0x00000012 Parent=0x00000015 SizeRef=1259,1142 Split=X DockNode ID=0x00000009 Parent=0x00000012 SizeRef=364,1142 Split=Y Selected=0x3DC5AC3F
DockNode ID=0x00000009 Parent=0x00000012 SizeRef=364,1142 Split=Y Selected=0x3DC5AC3F DockNode ID=0x00000005 Parent=0x00000009 SizeRef=364,745 Split=Y Selected=0x3DC5AC3F
DockNode ID=0x00000005 Parent=0x00000009 SizeRef=364,745 Split=Y Selected=0x3DC5AC3F DockNode ID=0x0000000B Parent=0x00000005 SizeRef=364,452 HiddenTabBar=1 Selected=0x3DC5AC3F
DockNode ID=0x0000000B Parent=0x00000005 SizeRef=364,452 HiddenTabBar=1 Selected=0x3DC5AC3F DockNode ID=0x0000000C Parent=0x00000005 SizeRef=364,291 Selected=0xAE3C694A
DockNode ID=0x0000000C Parent=0x00000005 SizeRef=364,291 Selected=0xAE3C694A DockNode ID=0x00000006 Parent=0x00000009 SizeRef=364,395 HiddenTabBar=1 Selected=0x726D8899
DockNode ID=0x00000006 Parent=0x00000009 SizeRef=364,395 HiddenTabBar=1 Selected=0x726D8899 DockNode ID=0x0000000A Parent=0x00000012 SizeRef=1538,1142 Split=X
DockNode ID=0x0000000A Parent=0x00000012 SizeRef=1538,1142 Split=X DockNode ID=0x00000007 Parent=0x0000000A SizeRef=357,1142 Selected=0x7737E8B2
DockNode ID=0x00000007 Parent=0x0000000A SizeRef=357,1142 Selected=0x7737E8B2 DockNode ID=0x00000008 Parent=0x0000000A SizeRef=1545,1142 Split=X
DockNode ID=0x00000008 Parent=0x0000000A SizeRef=1545,1142 Split=X DockNode ID=0x00000001 Parent=0x00000008 SizeRef=1202,1142 Split=Y Selected=0xDF0EC458
DockNode ID=0x00000001 Parent=0x00000008 SizeRef=1202,1142 Split=Y Selected=0xDF0EC458 DockNode ID=0x00000003 Parent=0x00000001 SizeRef=1202,849 Split=Y Selected=0xDF0EC458
DockNode ID=0x00000003 Parent=0x00000001 SizeRef=1202,849 Split=Y Selected=0xDF0EC458 DockNode ID=0x0000000D Parent=0x00000003 SizeRef=1202,571 Split=Y Selected=0xDFF75B3F
DockNode ID=0x0000000D Parent=0x00000003 SizeRef=1202,571 Split=Y Selected=0xDFF75B3F DockNode ID=0x00000017 Parent=0x0000000D SizeRef=1202,776 CentralNode=1 Selected=0xDFF75B3F
DockNode ID=0x00000017 Parent=0x0000000D SizeRef=1202,776 Split=Y Selected=0xDFF75B3F DockNode ID=0x00000018 Parent=0x0000000D SizeRef=1202,364 Split=X Selected=0x1C0788A1
DockNode ID=0x0000001D Parent=0x00000017 SizeRef=518,720 Split=Y Selected=0xDFF75B3F DockNode ID=0x00000019 Parent=0x00000018 SizeRef=601,364 Selected=0x1C0788A1
DockNode ID=0x0000001F Parent=0x0000001D SizeRef=518,796 CentralNode=1 Selected=0x9A7B23B9 DockNode ID=0x0000001A Parent=0x00000018 SizeRef=599,364 Selected=0x9B5D3198
DockNode ID=0x00000020 Parent=0x0000001D SizeRef=518,341 Selected=0x7A66B86B DockNode ID=0x0000000E Parent=0x00000003 SizeRef=1202,569 Selected=0xE98146C5
DockNode ID=0x0000001E Parent=0x00000017 SizeRef=518,417 Selected=0xC74E1AEE DockNode ID=0x00000004 Parent=0x00000001 SizeRef=1202,291 Selected=0x9DD4E196
DockNode ID=0x00000018 Parent=0x0000000D SizeRef=1202,364 Split=X Selected=0x1C0788A1 DockNode ID=0x00000002 Parent=0x00000008 SizeRef=334,1142 HiddenTabBar=1 Selected=0x36DC96AB
DockNode ID=0x00000019 Parent=0x00000018 SizeRef=601,364 Selected=0x1C0788A1 DockNode ID=0x00000016 Parent=0x00000014 SizeRef=376,1142 HiddenTabBar=1 Selected=0x8D0E8380
DockNode ID=0x0000001A Parent=0x00000018 SizeRef=599,364 Selected=0x9B5D3198 DockSpace ID=0xC6145A92 Pos=8,27 Size=1904,1142 Split=X
DockNode ID=0x0000000E Parent=0x00000003 SizeRef=1202,569 Selected=0xE98146C5 DockNode ID=0x0000000F Parent=0xC6145A92 SizeRef=301,1142 Selected=0xA8433A03
DockNode ID=0x00000004 Parent=0x00000001 SizeRef=1202,291 Selected=0x9DD4E196 DockNode ID=0x00000010 Parent=0xC6145A92 SizeRef=1601,1142 CentralNode=1
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=391,1139 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

@ -21,7 +21,6 @@
#include "Windows/LoggerWindow.h" #include "Windows/LoggerWindow.h"
#include "Windows/InspectorWindow.h" #include "Windows/InspectorWindow.h"
#include "Windows/SceneWindow.h" #include "Windows/SceneWindow.h"
#include "Windows/Icons.h"
#include "Windows/ProfilerWindow.h" #include "Windows/ProfilerWindow.h"
@ -50,8 +49,10 @@ SceneManager g_SceneManager;
std::vector<std::shared_ptr<GameObject>> g_GameObjects; std::vector<std::shared_ptr<GameObject>> g_GameObjects;
std::shared_ptr<CameraComponent> g_RuntimeCameraObject; std::shared_ptr<CameraComponent> g_RuntimeCameraObject;
int g_GPU_Triangles_drawn_to_screen = 0; int g_GPU_Triangles_drawn_to_screen = 0;
GameObject *g_SelectedObject; // Pointer to the currently selected object GameObject *g_SelectedObject; // Pointer to the currently selected object
@ -104,44 +105,10 @@ bool MyEngine::Init(int width, int height, const std::string &title)
(void)io; (void)io;
// Enable docking // Enable docking
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
#ifdef DEBUG #ifdef DEBUG
ImGui::GetIO().ConfigFlags |= ImGuiConfigFlags_DockingEnable | ImGuiConfigFlags_ViewportsEnable; ImGui::GetIO().ConfigFlags |= ImGuiConfigFlags_DockingEnable | ImGuiConfigFlags_ViewportsEnable;
#endif #endif
// Path to your font files
const char *regularFontPath = "assets/fonts/Roboto-Medium.ttf"; // Replace with your font file path
const char *fontAwesomePath = "assets/fonts/fa-solid-900.ttf"; // Replace with Font Awesome font path
float fontSize = 16.0f; // Font size for both regular font and icons
// Load the regular font
ImFont *regularFont = io.Fonts->AddFontFromFileTTF(regularFontPath, fontSize);
if (!regularFont)
{
fprintf(stderr, "Failed to load regular font: %s\n", regularFontPath);
return false;
}
// Configure Font Awesome
ImFontConfig fontAwesomeConfig;
fontAwesomeConfig.MergeMode = true; // Merge into the main font
fontAwesomeConfig.PixelSnapH = true; // Snap pixels for better alignment
fontAwesomeConfig.GlyphOffset.y = 2.0f; // Adjust vertical alignment (tweak this value if needed)
// Define the glyph range for Font Awesome
static const ImWchar fontAwesomeRanges[] = {ICON_MIN_FA, ICON_MAX_FA, 0};
// Load Font Awesome and merge it into the regular font
ImFont *fontAwesomeFont = io.Fonts->AddFontFromFileTTF(fontAwesomePath, fontSize, &fontAwesomeConfig, fontAwesomeRanges);
if (!fontAwesomeFont)
{
fprintf(stderr, "Failed to load Font Awesome font: %s\n", fontAwesomePath);
return false;
}
// Build the fonts
io.Fonts->Build();
// (Optional) Multi-viewport // (Optional) Multi-viewport
// io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; // io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
@ -164,7 +131,7 @@ bool MyEngine::Init(int width, int height, const std::string &title)
m_GameRunning = false; m_GameRunning = false;
m_FirstTickGameRunning = true; m_FirstTickGameRunning = true;
m_showProfiler = true; m_showProfiler = false;
g_LoggerWindow = m_LoggerWindow.get(); g_LoggerWindow = m_LoggerWindow.get();
@ -237,6 +204,7 @@ void MyEngine::Run()
DEBUG_PRINT("Save path: %s", savePath.c_str()); DEBUG_PRINT("Save path: %s", savePath.c_str());
g_SceneManager.SaveScene(g_GameObjects, savePath); g_SceneManager.SaveScene(g_GameObjects, savePath);
ScopedTimer LUA_INIT_timer("GameObjectsScriptInit"); ScopedTimer LUA_INIT_timer("GameObjectsScriptInit");
for (auto &Gameobject : g_GameObjects) for (auto &Gameobject : g_GameObjects)
{ {
@ -244,7 +212,7 @@ void MyEngine::Run()
// Handle Components That Require Updates // Handle Components That Require Updates
std::shared_ptr<ScriptComponent> script = Gameobject->GetComponent<ScriptComponent>(); std::shared_ptr<ScriptComponent> script = Gameobject->GetComponent<ScriptComponent>();
if (script) if (script)
{ // Null Checks { // Null Checks
ScopedTimer Lua_timer("GameObjectLuaCall_INIT: " + Gameobject->name); // var has to be named that or it will be redecl ScopedTimer Lua_timer("GameObjectLuaCall_INIT: " + Gameobject->name); // var has to be named that or it will be redecl
script->Init(); script->Init();
@ -273,6 +241,8 @@ void MyEngine::Run()
for (auto &Gameobject : g_GameObjects) for (auto &Gameobject : g_GameObjects)
{ {
Gameobject->Update(frame_delta); Gameobject->Update(frame_delta);
} }
} }
@ -290,7 +260,7 @@ void MyEngine::Run()
m_PerformanceWindow->Show(m_Fps, m_Ms); // FPS & ms m_PerformanceWindow->Show(m_Fps, m_Ms); // FPS & ms
m_LoggerWindow->Show(); // Logs m_LoggerWindow->Show(); // Logs
m_SceneWindow->Show(); m_SceneWindow->Show();
// m_luaEditor->Show(); //m_luaEditor->Show();
if (m_showProfiler) if (m_showProfiler)
{ {

View File

@ -49,7 +49,7 @@ private:
bool m_GameRunning = false; bool m_GameRunning = false;
bool m_FirstTickGameRunning = true; bool m_FirstTickGameRunning = true;
bool m_showProfiler = true; bool m_showProfiler = false;
// Windows // Windows
std::unique_ptr<RenderWindow> m_RenderWindow; std::unique_ptr<RenderWindow> m_RenderWindow;

View File

@ -2,7 +2,6 @@
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
#include <stdexcept>
#include <sstream> #include <sstream>
#include <cstring> #include <cstring>
#include <GL/glew.h> #include <GL/glew.h>
@ -72,9 +71,8 @@ AssetManager::AssetVariant AssetManager::loadAssetFromDisk(AssetType type, const
} }
else else
{ {
g_LoggerWindow->AddLog("Failed to load Shader", ImVec4(1.0f, 0.01f, 0.01f, 1.0f)); throw std::runtime_error("Failed to load shader: " + path);
} }
break;
} }
case AssetType::MODEL: case AssetType::MODEL:
{ {
@ -86,15 +84,12 @@ AssetManager::AssetVariant AssetManager::loadAssetFromDisk(AssetType type, const
} }
else else
{ {
g_LoggerWindow->AddLog("Failed to load model: %s", ImVec4(1.0f, 0.01f, 0.01f, 1.0f), path.c_str()); throw std::runtime_error("Failed to load model: " + path);
} }
break;
} }
default: default:
g_LoggerWindow->AddLog("Unknown Asset Type", ImVec4(1.0f, 0.01f, 0.01f, 1.0f)); throw std::invalid_argument("Unknown AssetType");
break;
} }
throw std::runtime_error("Failed to load Asset: " + path);
} }
std::string AssetManager::generateKey(AssetType type, const std::string &path) std::string AssetManager::generateKey(AssetType type, const std::string &path)

View File

@ -213,25 +213,19 @@ public:
//} //}
// 3) Not loaded yet // 3) Not loaded yet
AssetVariant assetData = loadAssetFromDisk(type, path);
try if (assetData.valueless_by_exception())
{ {
AssetVariant assetData = loadAssetFromDisk(type, path); DEBUG_PRINT("[AssetManager] Failed to load asset: %s", path.c_str());
return nullptr; // For smart pointers, return nullptr on failure
if (assetData.valueless_by_exception())
{
DEBUG_PRINT("[AssetManager] Failed to load asset: %s", path.c_str());
return nullptr; // For smart pointers, return nullptr on failure
}
m_AssetMap[key] = assetData;
return std::get<std::shared_ptr<T>>(assetData);
}
catch (const std::exception &e)
{
std::cout << "Exception caught: " << e.what() << '\n';
} }
return nullptr; // 4) Store in cache
m_AssetMap[key] = assetData;
// 5) Return the loaded asset
return std::get<std::shared_ptr<T>>(assetData);
} }
void DebugAssetMap(); void DebugAssetMap();

File diff suppressed because it is too large Load Diff

View File

@ -6,8 +6,6 @@
#include <vector> #include <vector>
#include "Icons.h"
extern std::vector<GameObject> g_GameObjects; extern std::vector<GameObject> g_GameObjects;
extern GameObject *g_SelectedObject; // Pointer to the currently selected object extern GameObject *g_SelectedObject; // Pointer to the currently selected object
extern std::shared_ptr<CameraComponent> g_RuntimeCameraObject; extern std::shared_ptr<CameraComponent> g_RuntimeCameraObject;
@ -23,7 +21,7 @@ void InspectorWindow::Show()
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(6, 4)); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(6, 4));
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(10, 10)); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(10, 10));
if (ImGui::Begin(ICON_FA_MAGNIFYING_GLASS " Inspector##InspectorWindow")) if (ImGui::Begin("Inspector##InspectorWindow"))
{ {
// Title label (white text) // Title label (white text)
if (g_SelectedObject) if (g_SelectedObject)
@ -35,8 +33,6 @@ void InspectorWindow::Show()
return; return;
} }
ImVec2 size = ImGui::GetContentRegionAvail();
// Display object name and component count // Display object name and component count
ImGui::Text("Editing Object: %s", g_SelectedObject->name.c_str()); ImGui::Text("Editing Object: %s", g_SelectedObject->name.c_str());
ImGui::Text("Components: %d", g_SelectedObject->GetComponentCount()); ImGui::Text("Components: %d", g_SelectedObject->GetComponentCount());
@ -90,7 +86,7 @@ void InspectorWindow::Show()
// Create a Combo Box for component selection // Create a Combo Box for component selection
ImGui::Combo(" ##ComponentCombo", &selectedComponent, componentOptions, componentCount); ImGui::Combo("##ComponentCombo", &selectedComponent, componentOptions, componentCount);
// Add Button to add the selected component // Add Button to add the selected component
if (ImGui::Button("Add")) if (ImGui::Button("Add"))
@ -175,12 +171,13 @@ void InspectorWindow::Show()
{ {
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 1.0f, 1.0f, 1.0f));
bool transformOpen = ImGui::CollapsingHeader(ICON_FA_CIRCLE_NODES " Transform##Main", ImGuiTreeNodeFlags_DefaultOpen); bool transformOpen = ImGui::CollapsingHeader("Transform##Main", ImGuiTreeNodeFlags_DefaultOpen);
ImGui::PopStyleColor(); ImGui::PopStyleColor();
// Transform* transform = &g_SelectedObject->transform; // Transform* transform = &g_SelectedObject->transform;
// printf("%p\n", &transform); // printf("%p\n", &transform);
if (transformOpen) if (transformOpen)
{ {
if (ImGui::IsItemHovered()) if (ImGui::IsItemHovered())
{ {
ImGui::BeginTooltip(); ImGui::BeginTooltip();
@ -188,62 +185,196 @@ void InspectorWindow::Show()
ImGui::EndTooltip(); ImGui::EndTooltip();
} }
const char *axisNames[3] = {"X", "Y", "Z"}; // -----------------------------------
static const ImVec4 colX = ImVec4(1.0f, 0.4f, 0.4f, 1.0f); // Position
static const ImVec4 colY = ImVec4(0.4f, 1.0f, 0.4f, 1.0f); // -----------------------------------
static const ImVec4 colZ = ImVec4(0.4f, 0.4f, 1.0f, 1.0f); ImGui::TextUnformatted("Position");
ImGui::Spacing();
static const ImVec4 colXHover = ImVec4(1.0f, 0.6f, 0.6f, 1.0f);
static const ImVec4 colYHover = ImVec4(0.6f, 1.0f, 0.6f, 1.0f);
static const ImVec4 colZHover = ImVec4(0.6f, 0.6f, 1.0f, 1.0f);
static const ImVec4 colXActive = ImVec4(1.0f, 0.2f, 0.2f, 1.0f);
static const ImVec4 colYActive = ImVec4(0.2f, 1.0f, 0.2f, 1.0f);
static const ImVec4 colZActive = ImVec4(0.2f, 0.2f, 1.0f, 1.0f);
int ittr = 0;
auto drawTransformRow = [&](const char *label, float *values)
{ {
ImGui::TextUnformatted(label); // We'll assign colors for X, Y, Z buttons
ImGui::SameLine(90); // Align labels to a fixed width // (normal, hovered, active)
static const ImVec4 colX = ImVec4(1.0f, 0.4f, 0.4f, 1.0f);
static const ImVec4 colXHover = ImVec4(1.0f, 0.6f, 0.6f, 1.0f);
static const ImVec4 colXActive = ImVec4(1.0f, 0.2f, 0.2f, 1.0f);
ImVec4 colors[3][3] = { static const ImVec4 colY = ImVec4(0.4f, 1.0f, 0.4f, 1.0f);
{colX, colXHover, colXActive}, static const ImVec4 colYHover = ImVec4(0.6f, 1.0f, 0.6f, 1.0f);
{colY, colYHover, colYActive}, static const ImVec4 colYActive = ImVec4(0.2f, 1.0f, 0.2f, 1.0f);
{colZ, colZHover, colZActive}};
static const ImVec4 colZ = ImVec4(0.4f, 0.4f, 1.0f, 1.0f);
static const ImVec4 colZHover = ImVec4(0.6f, 0.6f, 1.0f, 1.0f);
static const ImVec4 colZActive = ImVec4(0.2f, 0.2f, 1.0f, 1.0f);
const char *axisNames[3] = {"X", "Y", "Z"};
// We'll reference transform.position here
float *pos = glm::value_ptr(transform->position);
ImGui::PushID("PositionRow");
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
{ {
ImGui::PushStyleColor(ImGuiCol_Button, colors[i][0]); // Determine color set
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, colors[i][1]); ImVec4 col, colH, colA;
ImGui::PushStyleColor(ImGuiCol_ButtonActive, colors[i][2]); if (i == 0)
std::string name = std::string(axisNames[i]) + "##" + std::to_string(ittr);
if (ImGui::Button(name.c_str(), ImVec2(20, 0)))
{ {
// No action on click col = colX;
colH = colXHover;
colA = colXActive;
}
else if (i == 1)
{
col = colY;
colH = colYHover;
colA = colYActive;
}
else
{
col = colZ;
colH = colZHover;
colA = colZActive;
}
// Push color style for button
ImGui::PushStyleColor(ImGuiCol_Button, col);
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, colH);
ImGui::PushStyleColor(ImGuiCol_ButtonActive, colA);
// Small button with the axis name
if (ImGui::Button(axisNames[i], ImVec2(20, 0)))
{
// No action on click, but we have a box with color
}
ImGui::PopStyleColor(3);
ImGui::SameLine();
ImGui::SetNextItemWidth(60.0f);
ImGui::DragFloat((std::string("##Pos") + axisNames[i]).c_str(), &pos[i], 0.1f);
if (i < 2)
ImGui::SameLine(0, 15);
}
ImGui::PopID();
}
ImGui::Spacing();
ImGui::Separator();
// -----------------------------------
// Rotation
// -----------------------------------
ImGui::TextUnformatted("Rotation");
ImGui::Spacing();
{
// Same approach, but referencing transform.rotation
const char *axisNames[3] = {"X", "Y", "Z"};
float *rot = glm::value_ptr(transform->rotation);
// We can reuse the same color sets
ImGui::PushID("RotationRow");
for (int i = 0; i < 3; i++)
{
// Decide color sets for X, Y, Z
ImVec4 col, colH, colA;
if (i == 0)
{
col = ImVec4(1.0f, 0.4f, 0.4f, 1.0f);
colH = ImVec4(1.0f, 0.6f, 0.6f, 1.0f);
colA = ImVec4(1.0f, 0.2f, 0.2f, 1.0f);
}
else if (i == 1)
{
col = ImVec4(0.4f, 1.0f, 0.4f, 1.0f);
colH = ImVec4(0.6f, 1.0f, 0.6f, 1.0f);
colA = ImVec4(0.2f, 1.0f, 0.2f, 1.0f);
}
else
{
col = ImVec4(0.4f, 0.4f, 1.0f, 1.0f);
colH = ImVec4(0.6f, 0.6f, 1.0f, 1.0f);
colA = ImVec4(0.2f, 0.2f, 1.0f, 1.0f);
}
ImGui::PushStyleColor(ImGuiCol_Button, col);
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, colH);
ImGui::PushStyleColor(ImGuiCol_ButtonActive, colA);
if (ImGui::Button(axisNames[i], ImVec2(20, 0)))
{
// No action
} }
ImGui::PopStyleColor(3); ImGui::PopStyleColor(3);
ImGui::SameLine(); ImGui::SameLine();
ImGui::SetNextItemWidth(60.0f); // Adjust field width to be more compact ImGui::SetNextItemWidth(60.0f);
ImGui::DragFloat((std::string("##") + label + axisNames[i]).c_str(), &values[i], 0.1f); ImGui::DragFloat((std::string("##Rot") + axisNames[i]).c_str(), &rot[i], 0.1f);
if (i < 2) if (i < 2)
ImGui::SameLine(0, 5); // Reduce spacing between fields ImGui::SameLine(0, 15);
} }
}; ImGui::PopID();
}
// Position Row ImGui::Spacing();
drawTransformRow("Position", glm::value_ptr(transform->position)); ImGui::Separator();
ittr += 1;
// Rotation Row // -----------------------------------
drawTransformRow("Rotation", glm::value_ptr(transform->rotation)); // Scale
ittr += 1; // -----------------------------------
ImGui::TextUnformatted("Scale");
ImGui::Spacing();
// Scale Row {
drawTransformRow("Scale", glm::value_ptr(transform->scale)); const char *axisNames[3] = {"X", "Y", "Z"};
float *scl = glm::value_ptr(transform->scale);
ImGui::PushID("ScaleRow");
for (int i = 0; i < 3; i++)
{
// same color approach
ImVec4 col, colH, colA;
if (i == 0)
{
col = ImVec4(1.0f, 0.4f, 0.4f, 1.0f);
colH = ImVec4(1.0f, 0.6f, 0.6f, 1.0f);
colA = ImVec4(1.0f, 0.2f, 0.2f, 1.0f);
}
else if (i == 1)
{
col = ImVec4(0.4f, 1.0f, 0.4f, 1.0f);
colH = ImVec4(0.6f, 1.0f, 0.6f, 1.0f);
colA = ImVec4(0.2f, 1.0f, 0.2f, 1.0f);
}
else
{
col = ImVec4(0.4f, 0.4f, 1.0f, 1.0f);
colH = ImVec4(0.6f, 0.6f, 1.0f, 1.0f);
colA = ImVec4(0.2f, 0.2f, 1.0f, 1.0f);
}
ImGui::PushStyleColor(ImGuiCol_Button, col);
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, colH);
ImGui::PushStyleColor(ImGuiCol_ButtonActive, colA);
if (ImGui::Button(axisNames[i], ImVec2(20, 0)))
{
// No action
}
ImGui::PopStyleColor(3);
ImGui::SameLine();
ImGui::SetNextItemWidth(60.0f);
ImGui::DragFloat((std::string("##Scl") + axisNames[i]).c_str(), &scl[i], 0.1f);
if (i < 2)
ImGui::SameLine(0, 15);
}
ImGui::PopID();
}
ImGui::Spacing();
ImGui::Separator();
} }
} }
@ -253,7 +384,7 @@ void InspectorWindow::Show()
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 1.0f, 1.0f, 1.0f));
// Create a collapsing header for the Camera component // Create a collapsing header for the Camera component
bool cameraOpen = ImGui::CollapsingHeader(ICON_FA_CAMERA "Camera##CamerInspector", ImGuiTreeNodeFlags_DefaultOpen); bool cameraOpen = ImGui::CollapsingHeader("Camera##CamerInspector", ImGuiTreeNodeFlags_DefaultOpen);
ImGui::PopStyleColor(); // Revert text color ImGui::PopStyleColor(); // Revert text color
if (cameraOpen) if (cameraOpen)
@ -410,7 +541,7 @@ void InspectorWindow::Show()
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 1.0f, 1.0f, 1.0f));
// Create a collapsing header for the MeshComponent // Create a collapsing header for the MeshComponent
bool meshOpen = ImGui::CollapsingHeader(ICON_FA_CUBE " Mesh##Main", ImGuiTreeNodeFlags_DefaultOpen); bool meshOpen = ImGui::CollapsingHeader("Mesh##Main", ImGuiTreeNodeFlags_DefaultOpen);
ImGui::PopStyleColor(); ImGui::PopStyleColor();
if (meshOpen) if (meshOpen)
@ -430,90 +561,81 @@ void InspectorWindow::Show()
} }
// --- Submeshes Information --- // --- Submeshes Information ---
ImGui::Indent(); ImGui::Separator();
if (ImGui::CollapsingHeader("Submeshes", ImGuiTreeNodeFlags_None)) ImGui::Text("Submeshes:");
// Check if the model is loaded
if (mesh)
{ {
// Iterate through each Submesh
// Check if the model is loaded for (size_t sm = 0; sm < mesh->submeshes.size(); ++sm)
if (mesh)
{ {
// Iterate through each Submesh const Submesh &submesh = mesh->submeshes[sm];
ImGui::Indent(); std::string header = "Submesh " + std::to_string(sm + 1) + "##Submesh" + std::to_string(sm);
for (size_t sm = 0; sm < mesh->submeshes.size(); ++sm) // Create a collapsing header for each Submesh
if (ImGui::CollapsingHeader(header.c_str(), ImGuiTreeNodeFlags_DefaultOpen))
{ {
const Submesh &submesh = mesh->submeshes[sm]; // --- Submesh VAO (Read-Only) ---
std::string header = "Submesh " + std::to_string(sm + 1) + "##Submesh" + std::to_string(sm); ImGui::Text("VAO: %d", static_cast<int>(submesh.vao));
// Create a collapsing header for each Submesh // --- Submesh Index Count (Read-Only) ---
if (ImGui::CollapsingHeader(header.c_str(), ImGuiTreeNodeFlags_None)) ImGui::Text("Index Count: %d", static_cast<int>(submesh.indices.size()));
// --- Textures Associated with the Submesh ---
ImGui::Separator();
ImGui::Text("Textures:");
// Iterate through each Texture in the Submesh
for (size_t i = 0; i < submesh.textures.size(); ++i)
{ {
ImGui::Indent(); const Texture &texture = submesh.textures[i];
size = ImGui::GetContentRegionAvail(); std::string texHeader = "Texture " + std::to_string(i + 1) + "##Submesh" + std::to_string(sm) + "_Texture" + std::to_string(i);
// Create a collapsing header for each Texture
// --- Submesh VAO (Read-Only) --- if (ImGui::CollapsingHeader(texHeader.c_str(), ImGuiTreeNodeFlags_DefaultOpen))
ImGui::Text("VAO: %d", static_cast<int>(submesh.vao));
// --- Submesh Index Count (Read-Only) ---
ImGui::Text("Index Count: %d", static_cast<int>(submesh.indices.size()));
// --- Textures Associated with the Submesh ---
ImGui::Separator();
ImGui::Text("Textures:");
// Iterate through each Texture in the Submesh
for (size_t i = 0; i < submesh.textures.size(); ++i)
{ {
const Texture &texture = submesh.textures[i]; // --- Texture Type (Read-Only) ---
std::string texHeader = "Texture " + std::to_string(i + 1) + "##Submesh" + std::to_string(sm) + "_Texture" + std::to_string(i); ImGui::Text("Type: %s", texture.type.c_str());
// Create a collapsing header for each Texture // --- Texture ID (Read-Only) ---
if (ImGui::CollapsingHeader(texHeader.c_str(), ImGuiTreeNodeFlags_DefaultOpen)) ImGui::Text("Texture ID: %d", static_cast<int>(texture.id));
// --- Texture Path (Read-Only) ---
ImGui::Text("Path: %s", texture.path.c_str());
// --- Texture Preview ---
if (texture.id != 0)
{ {
// --- Texture Type (Read-Only) --- // Adjust the size as needed
ImGui::Text("Type: %s", texture.type.c_str()); ImVec2 imageSize = ImVec2(100, 100); // Example size
ImGui::Image(static_cast<ImTextureID>(texture.id), imageSize, ImVec2(0, 0), ImVec2(1, 1));
// --- Texture ID (Read-Only) --- }
ImGui::Text("Texture ID: %d", static_cast<int>(texture.id)); else
{
// --- Texture Path (Read-Only) --- ImGui::Text("No texture bound.");
ImGui::Text("Path: %s", texture.path.c_str());
// --- Texture Preview ---
if (texture.id != 0)
{
// Adjust the size as needed
ImGui::Image(static_cast<ImTextureID>(texture.id), ImVec2(size.x, size.x), ImVec2(0, 0), ImVec2(1, 1));
}
else
{
ImGui::Text("No texture bound.");
}
ImGui::Separator();
} }
}
ImGui::Unindent();
ImGui::Separator(); ImGui::Separator();
}
} }
ImGui::Separator();
} }
ImGui::Unindent();
}
else
{
ImGui::TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "No model loaded.");
} }
} }
ImGui::Unindent(); else
{
ImGui::TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "No model loaded.");
}
} }
ImGui::Separator();
} }
if (script && g_SelectedObject) if (script && g_SelectedObject)
{ {
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 1.0f, 1.0f, 1.0f));
bool scriptOpen = ImGui::CollapsingHeader(ICON_FA_SCROLL " Script##Main", ImGuiTreeNodeFlags_DefaultOpen); bool scriptOpen = ImGui::CollapsingHeader("Script##Main", ImGuiTreeNodeFlags_DefaultOpen);
ImGui::PopStyleColor(); ImGui::PopStyleColor();
if (scriptOpen) if (scriptOpen)

View File

@ -4,7 +4,6 @@
#include "imgui.h" #include "imgui.h"
#include <cstdarg> #include <cstdarg>
#include <cstdio> #include <cstdio>
#include "Icons.h"
// Helper function to format strings // 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) {
@ -34,7 +33,7 @@ void LoggerWindow::AddLog(const char* fmt, std::optional<ImVec4> color, ...) {
} }
void LoggerWindow::Show() { void LoggerWindow::Show() {
ImGui::Begin(ICON_FA_TERMINAL " Logger##logger"); ImGui::Begin("Logger##logger");
if (ImGui::Button("Clear")) { if (ImGui::Button("Clear")) {
m_Logs.clear(); m_Logs.clear();

View File

@ -3,7 +3,6 @@
#include <algorithm> #include <algorithm>
#include <string> #include <string>
#include <iostream> // For debug statements #include <iostream> // For debug statements
#include "Icons.h"
// Constructor // Constructor
ProfilerWindow::ProfilerWindow() ProfilerWindow::ProfilerWindow()
@ -99,7 +98,7 @@ void ProfilerWindow::Show()
} }
// Begin ImGui window with improved styling // Begin ImGui window with improved styling
ImGui::Begin(ICON_FA_GAUGE " Profiler", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_HorizontalScrollbar); ImGui::Begin("Profiler", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_HorizontalScrollbar);
const auto &data = Profiler::Get().GetLastFrameData(); const auto &data = Profiler::Get().GetLastFrameData();

View File

@ -24,8 +24,6 @@ extern std::vector<std::shared_ptr<GameObject>> g_GameObjects;
#include "Engine/AssetManager.h" #include "Engine/AssetManager.h"
#include "Rendering/Shader.h" #include "Rendering/Shader.h"
#include "Icons.h"
// Extern reference to our global (or extern) asset manager // Extern reference to our global (or extern) asset manager
extern AssetManager g_AssetManager; extern AssetManager g_AssetManager;
@ -252,7 +250,7 @@ bool PlayPauseButton(const char *label, bool *isPlaying, ImVec2 Size)
void RenderWindow::Show(bool *GameRunning) void RenderWindow::Show(bool *GameRunning)
{ {
ImGui::Begin(ICON_FA_GAMEPAD " Editor##EditorWindow"); ImGui::Begin("Editor##EditorWindow");
if (!m_Initialized) if (!m_Initialized)
{ {