From 656f1c070fd6644cd5ee8da01b5d90699459b544 Mon Sep 17 00:00:00 2001 From: OusmBlueNinja <89956790+OusmBlueNinja@users.noreply.github.com> Date: Tue, 27 May 2025 13:32:20 -0500 Subject: [PATCH] Adds basic scene management Implements a basic scene management system with GameObject and Component structure. Adds initial support for TagComponent serialization. Includes Scene class in Core and an AssetManager profiling scope. --- src/core/Core.h | 3 +++ src/core/systems/AssetManager.cpp | 8 +++++++ .../systems/Scene/Components/TagComponent.h | 2 +- src/core/systems/Scene/GameObject.cpp | 22 ++++++++++++++----- src/core/systems/Scene/GameObject.h | 12 +++++----- src/core/systems/Scene/Scene.cpp | 1 - src/core/systems/Scene/Scene.h | 2 +- src/editor/Windows/FileBrowser.cpp | 4 ++++ 8 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/core/Core.h b/src/core/Core.h index 8fc9691..2c5bae7 100644 --- a/src/core/Core.h +++ b/src/core/Core.h @@ -14,6 +14,7 @@ #include "systems/Profiler.h" #include "systems/WindowManager.h" #include "systems/MACROS.h" +#include "systems/Scene/Scene.h" #define OX_ENGINE_VERSION "Onyx Engine (2025.1)" @@ -54,6 +55,8 @@ namespace OX WindowManager window; Renderer renderer; + Scene m_activeScene; + bool m_running = false; std::string m_name = "Application"; }; diff --git a/src/core/systems/AssetManager.cpp b/src/core/systems/AssetManager.cpp index 3010f0e..5b0664e 100644 --- a/src/core/systems/AssetManager.cpp +++ b/src/core/systems/AssetManager.cpp @@ -7,6 +7,9 @@ #include #include #include +#include + +#include "Profiler.h" namespace fs = std::filesystem; @@ -69,6 +72,10 @@ namespace OX s_TotalTexturesToLoad.store(0); s_LoadedTexturesCount.store(0); s_ScanThread = std::thread(BackgroundScan); + + + + } void AssetManager::BackgroundScan() @@ -144,6 +151,7 @@ namespace OX void AssetManager::Tick() { + OX_PROFILE_FUNCTION(); std::lock_guard qlock(s_QueueMutex); while (!s_TextureQueue.empty()) { auto pending = s_TextureQueue.front(); diff --git a/src/core/systems/Scene/Components/TagComponent.h b/src/core/systems/Scene/Components/TagComponent.h index 9fa2175..30e0a6b 100644 --- a/src/core/systems/Scene/Components/TagComponent.h +++ b/src/core/systems/Scene/Components/TagComponent.h @@ -1,4 +1,4 @@ -// src/h/Components/TagComponent.h + #pragma once #include diff --git a/src/core/systems/Scene/GameObject.cpp b/src/core/systems/Scene/GameObject.cpp index 500ebb9..6b6c276 100644 --- a/src/core/systems/Scene/GameObject.cpp +++ b/src/core/systems/Scene/GameObject.cpp @@ -1,6 +1,9 @@ -// src/GameObject.cpp + #include "GameObject.h" +#include "Components/TagComponent.h" +#include "systems/Logger.h" + namespace OX { GameObject::GameObject(const std::string &name) @@ -69,11 +72,18 @@ namespace OX if (node["components"]) { for (auto &cnode: node["components"]) { - // e.g.: - // std::string type = cnode["type"].as(); - // auto comp = ComponentFactory::Create(type); - // comp->Deserialize(cnode); - // addComponent(std::move(comp)); + std::string type = cnode["type"].as(); + if (type == "TagComponent") { + auto name = cnode["name"].as(); + std::unique_ptr comp = std::make_unique(name); + addComponent(std::move(comp)); + } else if (type == "TransformComponent") { + //auto name = cnode["name"].as(); + //std::unique_ptr comp = std::make_unique(name); + //addComponent(std::move(comp)); + } else { + Logger::LogError("Invalid Component: '%s'", type.c_str()); + } } } diff --git a/src/core/systems/Scene/GameObject.h b/src/core/systems/Scene/GameObject.h index 5b06c13..8fed450 100644 --- a/src/core/systems/Scene/GameObject.h +++ b/src/core/systems/Scene/GameObject.h @@ -1,4 +1,4 @@ -// src/h/GameObject.h + #pragma once #include @@ -19,16 +19,16 @@ namespace OX // Name void setName(const std::string &name); - const std::string &name() const; + [[nodiscard]] const std::string &name() const; // Hierarchy - GameObject *parent() const; + [[nodiscard]] GameObject *parent() const; void addChild(std::unique_ptr child); std::unique_ptr removeChild(GameObject *child); - const std::vector > &children() const; + [[nodiscard]] const std::vector > &children() const; // Components void addComponent(std::unique_ptr comp); @@ -39,10 +39,10 @@ namespace OX template std::unique_ptr removeComponent(); - const std::vector > &components() const; + [[nodiscard]] const std::vector > &components() const; // Serialization - YAML::Node Serialize() const; + [[nodiscard]] YAML::Node Serialize() const; void Deserialize(const YAML::Node &node); diff --git a/src/core/systems/Scene/Scene.cpp b/src/core/systems/Scene/Scene.cpp index 2b579de..64f575b 100644 --- a/src/core/systems/Scene/Scene.cpp +++ b/src/core/systems/Scene/Scene.cpp @@ -1,4 +1,3 @@ -// src/Scene.cpp #include "Scene.h" #include // for std::find_if diff --git a/src/core/systems/Scene/Scene.h b/src/core/systems/Scene/Scene.h index 8e73605..d5c85ac 100644 --- a/src/core/systems/Scene/Scene.h +++ b/src/core/systems/Scene/Scene.h @@ -1,4 +1,4 @@ -// src/h/Scene.h + #pragma once #include diff --git a/src/editor/Windows/FileBrowser.cpp b/src/editor/Windows/FileBrowser.cpp index 6d830a0..c126976 100644 --- a/src/editor/Windows/FileBrowser.cpp +++ b/src/editor/Windows/FileBrowser.cpp @@ -93,6 +93,10 @@ namespace OX } else { if (ImGui::Button("Grid View")) _gridMode = true; } + ImGui::SameLine(); + if (ImGui::Button("Rescan")) { + AssetManager::Rescan(); + } size_t total = AssetManager::GetTotalTexturesToLoad(); size_t loaded = AssetManager::GetLoadedTexturesCount();