diff --git a/.idea/.name b/.idea/.name index 7a68be2..24be0bf 100644 --- a/.idea/.name +++ b/.idea/.name @@ -1 +1 @@ -CreatePBR \ No newline at end of file +Onyx \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index b45cf49..442afcc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,6 +103,8 @@ file(GLOB_RECURSE CORE_SOURCES CONFIGURE_DEPENDS add_library(Core STATIC ${CORE_SOURCES} src/core/systems/MACROS.h + src/core/renderer/Renderer.cpp + src/core/renderer/Renderer.h ) target_include_directories(Core PUBLIC src/core) @@ -124,6 +126,8 @@ add_executable(Editor ${APP_SOURCES} src/editor/Editor.h src/editor/Windows/LoggerWindow.cpp src/editor/Windows/LoggerWindow.h + src/editor/Windows/Viewport.cpp + src/editor/Windows/Viewport.h ) target_include_directories(Editor PRIVATE diff --git a/main.cpp b/main.cpp index ee813ec..4265ee5 100644 --- a/main.cpp +++ b/main.cpp @@ -8,12 +8,9 @@ int main() { + OX::Core core{}; - constexpr const char* VERSION = "0.1.0"; // Format: 0. - - OX::Core core(std::string(OX_ENGINE_VERSION) + " (" + VERSION + ")"); - - core.AddLayer(std::make_unique("Obsidian Editor")); + core.AddLayer(std::make_unique(OX_EDITOR_VERSION)); //core.AddLayer(std::make_unique("Dummy Layer")); diff --git a/src/core/Core.cpp b/src/core/Core.cpp index 4d4bfaf..93a9f53 100644 --- a/src/core/Core.cpp +++ b/src/core/Core.cpp @@ -33,6 +33,7 @@ namespace OX for (const auto &layer : m_layers) { + Logger::LogDebug("Initializing Layer: '%s'", layer->GetName().c_str()); layer->Init(*this); } diff --git a/src/core/Core.h b/src/core/Core.h index 0539d72..8fc9691 100644 --- a/src/core/Core.h +++ b/src/core/Core.h @@ -9,6 +9,7 @@ #include #include #include "Layer.h" +#include "renderer/Renderer.h" #include "systems/Logger.h" #include "systems/Profiler.h" #include "systems/WindowManager.h" @@ -25,6 +26,10 @@ namespace OX { }; + Core() : m_name(OX_ENGINE_VERSION) + { + }; + ~Core() = default; void Init(); @@ -35,7 +40,7 @@ namespace OX WindowManager &GetWindow() { return window; } - + Renderer &GetRenderer() { return renderer; } void AddLayer(std::unique_ptr layer); @@ -47,6 +52,7 @@ namespace OX std::vector > m_layers; WindowManager window; + Renderer renderer; bool m_running = false; std::string m_name = "Application"; @@ -78,8 +84,5 @@ namespace OX Logger::LogDebug("%s Shutdown", m_name.c_str()); } }; - - - } #endif // CORE_H diff --git a/src/core/renderer/Renderer.cpp b/src/core/renderer/Renderer.cpp new file mode 100644 index 0000000..19a79ad --- /dev/null +++ b/src/core/renderer/Renderer.cpp @@ -0,0 +1,8 @@ +// +// Created by spenc on 5/21/2025. +// + +#include "Renderer.h" + +namespace OX { +} // OX \ No newline at end of file diff --git a/src/core/renderer/Renderer.h b/src/core/renderer/Renderer.h new file mode 100644 index 0000000..01b3efc --- /dev/null +++ b/src/core/renderer/Renderer.h @@ -0,0 +1,26 @@ +// +// Created by spenc on 5/21/2025. +// + +#ifndef RENDERER_H +#define RENDERER_H + +#include "glfw/glfw3.h" +#include "glm/glm.hpp" + +namespace OX { + +class Renderer { +public: + Renderer() = default; + ~Renderer() = default; + + [[nodiscard]] GLuint GetRenderTarget() const {return m_renderTarget; } + +private: + GLuint m_renderTarget; +}; + +} // OX + +#endif //RENDERER_H diff --git a/src/editor/Editor.cpp b/src/editor/Editor.cpp index 4323ca0..12fa705 100644 --- a/src/editor/Editor.cpp +++ b/src/editor/Editor.cpp @@ -7,8 +7,9 @@ #include #include #include -#include "Windows/LoggerWindow.h" +#include "Windows/LoggerWindow.h" +#include "Windows/Viewport.h" namespace OX { @@ -33,6 +34,8 @@ namespace OX { ImGui_ImplGlfw_InitForOpenGL(core.GetWindow().GetHandle(), true); ImGui_ImplOpenGL3_Init("#version 330 core"); + + primaryViewport = new Viewport(); // The first time ive ever use the new keywork... } void Editor::Update(Core& core) @@ -72,6 +75,7 @@ namespace OX { ImGui::DockSpace(dockspaceID, ImVec2(0.0f, 0.0f), ImGuiDockNodeFlags_PassthruCentralNode); LoggerWindow::Draw(); + primaryViewport->Draw(core); ImGui::Begin("Profiler"); @@ -127,6 +131,11 @@ namespace OX { void Editor::Shutdown(Core& core) { + + delete primaryViewport; + primaryViewport = nullptr; + + Logger::LogOk("Editor::Shutdown"); ImGui_ImplOpenGL3_Shutdown(); ImGui_ImplGlfw_Shutdown(); diff --git a/src/editor/Editor.h b/src/editor/Editor.h index 1f688a6..eef8f72 100644 --- a/src/editor/Editor.h +++ b/src/editor/Editor.h @@ -4,24 +4,31 @@ #ifndef EDITOR_H #define EDITOR_H +#define OX_EDITOR_VERSION "Obsidian Editor (0.3.2)" #include "Layer.h" #include "Core.h" -namespace OX { +namespace OX +{ + class Viewport; -class Editor final : public Layer { -public: - using Layer::Layer; + class Editor final : public Layer + { + public: + using Layer::Layer; - void Init(Core& core) override; - void Update(Core& core) override; - void Draw(Core& core) override; - void Shutdown(Core& core) override; -}; + void Init(Core &core) override; + void Update(Core &core) override; + void Draw(Core &core) override; + void Shutdown(Core &core) override; + + private: + Viewport* primaryViewport; + }; } // OX #endif //EDITOR_H diff --git a/src/editor/Windows/Viewport.cpp b/src/editor/Windows/Viewport.cpp new file mode 100644 index 0000000..ce269d9 --- /dev/null +++ b/src/editor/Windows/Viewport.cpp @@ -0,0 +1,37 @@ +// +// Created by spenc on 5/21/2025. +// + +#include "Viewport.h" +#include + +namespace OX +{ + int Viewport::s_nextID = 0; + + void Viewport::Draw(Core &core) const + { + // Construct title + std::string title = m_name + " (" + std::to_string(m_id) + ")"; + + // Remove window padding + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); + + // Begin full viewport window + ImGui::Begin(title.c_str(), nullptr, ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse); + + // Get size of available region + ImVec2 viewportSize = ImGui::GetContentRegionAvail(); + + // === Fullscreen image === + GLuint textureID = core.GetRenderer().GetRenderTarget(); // You must define this method + if (textureID != 0) { + ImGui::Image(textureID, viewportSize, ImVec2(0, 1), ImVec2(1, 0)); + } else { + ImGui::Text("No Render Target."); + } + + ImGui::End(); + ImGui::PopStyleVar(); // Restore padding + } +}; diff --git a/src/editor/Windows/Viewport.h b/src/editor/Windows/Viewport.h new file mode 100644 index 0000000..e934c98 --- /dev/null +++ b/src/editor/Windows/Viewport.h @@ -0,0 +1,36 @@ +// +// Created by spenc on 5/21/2025. +// + +#ifndef VIEWPORT_H +#define VIEWPORT_H + +#include +#include "Core.h" + +namespace OX +{ + class Viewport + { + public: + explicit Viewport(std::string name = "Viewport") + : m_name(std::move(name)) + { + m_id = s_nextID++; + } + + void Draw(Core& core) const; + + [[nodiscard]] int GetID() const { return m_id; } + [[nodiscard]] const std::string& GetName() const { return m_name; } + + private: + int m_id; + std::string m_name; + + static int s_nextID; + }; + +}; + +#endif