From fb4ba5c8bc13d295df17a1e80fb84eea708056e7 Mon Sep 17 00:00:00 2001 From: Light Date: Sat, 31 Jul 2021 11:03:31 +0430 Subject: [PATCH] SceneHierarchyPanel - Added Panel - Added SceneHierarchyPanel --- Engine/src/Engine/Scene/Entity.h | 2 + Engine/src/Engine/Scene/Scene.h | 1 + Mirror/src/MirrorLayer.h | 34 ++++++++++----- Mirror/src/Panels/Panel.h | 12 +++++ Mirror/src/Panels/SceneHierarchyPanel.cpp | 53 +++++++++++++++++++++++ Mirror/src/Panels/SceneHierarchyPanel.h | 30 +++++++++++++ 6 files changed, 122 insertions(+), 10 deletions(-) create mode 100644 Mirror/src/Panels/Panel.h create mode 100644 Mirror/src/Panels/SceneHierarchyPanel.cpp create mode 100644 Mirror/src/Panels/SceneHierarchyPanel.h diff --git a/Engine/src/Engine/Scene/Entity.h b/Engine/src/Engine/Scene/Entity.h index 41284fa..424deb2 100644 --- a/Engine/src/Engine/Scene/Entity.h +++ b/Engine/src/Engine/Scene/Entity.h @@ -29,6 +29,8 @@ namespace Light { { return m_Scene->m_Registry.get(m_Handle); } + + operator uint32_t() { return (uint32_t)m_Handle; } }; } \ No newline at end of file diff --git a/Engine/src/Engine/Scene/Scene.h b/Engine/src/Engine/Scene/Scene.h index bbed072..0843cea 100644 --- a/Engine/src/Engine/Scene/Scene.h +++ b/Engine/src/Engine/Scene/Scene.h @@ -15,6 +15,7 @@ namespace Light { class Scene { friend class Entity; + friend class SceneHierarchyPanel; private: entt::registry m_Registry; diff --git a/Mirror/src/MirrorLayer.h b/Mirror/src/MirrorLayer.h index 916e251..6b2b804 100644 --- a/Mirror/src/MirrorLayer.h +++ b/Mirror/src/MirrorLayer.h @@ -1,5 +1,7 @@ #include +#include "Panels/SceneHierarchyPanel.h" + #include namespace Light { @@ -14,7 +16,9 @@ namespace Light { Ref m_Framebuffer; - Scene m_Scene; + Ref m_Scene; + SceneHierarchyPanel m_SceneHierarchyPanel; + Entity m_CameraEntity; Entity m_NativeScriptEntity; @@ -26,21 +30,28 @@ namespace Light { m_AwesomefaceTexture = ResourceManager::GetTexture("awesomeface"); m_Framebuffer = std::shared_ptr(Framebuffer::Create({ 800u, 600u, 1u }, GraphicsContext::GetSharedContext())); - - m_CameraEntity = m_Scene.CreateEntity("camera", glm::mat4(1.0f)); - m_CameraEntity.AddComponent(SceneCamera(), true); + + m_Scene = CreateRef(); for (int i = 0; i < 250; i++) { glm::vec3 position = glm::vec3(rand() % 3000 - 1400.0f, rand() % 3000 - 1400.0f, 0.0f); glm::vec2 size = glm::vec2(250.0f, 250.0f); - m_Scene.CreateEntity("quad", glm::translate(glm::mat4(1.0f), { position.x, position.y, 0.0f }) * - glm::scale(glm::mat4(1.0f), { size.x, size.y, 1.0f})).AddComponent(m_AwesomefaceTexture); + Entity quad = m_Scene->CreateEntity("quad", glm::translate(glm::mat4(1.0f), { position.x, position.y, 0.0f }) * + glm::scale(glm::mat4(1.0f), { size.x, size.y, 1.0f})); + quad.AddComponent(m_AwesomefaceTexture); + quad.AddComponent("quad"); + } - m_NativeScriptEntity = m_Scene.CreateEntity("nsc", glm::translate(glm::mat4(1.0f), glm::vec3(0.0f)) * glm::scale(glm::mat4(1.0f), glm::vec3(250.0f, 250.0f, 1.0f))); + m_CameraEntity = m_Scene->CreateEntity("camera", glm::mat4(1.0f)); + m_CameraEntity.AddComponent(SceneCamera(), true); + m_CameraEntity.AddComponent("Camera"); + + m_NativeScriptEntity = m_Scene->CreateEntity("nsc", glm::translate(glm::mat4(1.0f), glm::vec3(0.0f)) * glm::scale(glm::mat4(1.0f), glm::vec3(250.0f, 250.0f, 1.0f))); m_NativeScriptEntity.AddComponent(m_AwesomefaceTexture); + m_NativeScriptEntity.AddComponent("NativeScript"); class SampleNativeScript : public Light::NativeScript { @@ -54,7 +65,8 @@ namespace Light { // create native scripts - m_Scene.OnCreate(); + m_Scene->OnCreate(); + m_SceneHierarchyPanel.SetContext(m_Scene); } void OnUpdate(float deltaTime) override @@ -76,12 +88,12 @@ namespace Light { auto& transform = m_CameraEntity.GetComponent(); transform = glm::translate(transform.transform, glm::vec3(m_Direction * m_Speed * deltaTime, 0.0)); - m_Scene.OnUpdate(deltaTime); + m_Scene->OnUpdate(deltaTime); } void OnRender() override { - m_Scene.OnRender(m_Framebuffer); + m_Scene->OnRender(m_Framebuffer); } void OnUserInterfaceUpdate() @@ -111,6 +123,8 @@ namespace Light { } ImGui::End(); + + m_SceneHierarchyPanel.OnUserInterfaceUpdate(); } }; diff --git a/Mirror/src/Panels/Panel.h b/Mirror/src/Panels/Panel.h new file mode 100644 index 0000000..f21ab4d --- /dev/null +++ b/Mirror/src/Panels/Panel.h @@ -0,0 +1,12 @@ +#pragma once + +namespace Light { + + class Panel + { + public: + Panel() = default; + virtual ~Panel() = default; + }; + +} \ No newline at end of file diff --git a/Mirror/src/Panels/SceneHierarchyPanel.cpp b/Mirror/src/Panels/SceneHierarchyPanel.cpp new file mode 100644 index 0000000..e6b7e1e --- /dev/null +++ b/Mirror/src/Panels/SceneHierarchyPanel.cpp @@ -0,0 +1,53 @@ +#include "SceneHierarchyPanel.h" + +#include "Scene/Components.h" + +#include + +#include + +namespace Light { + + SceneHierarchyPanel::SceneHierarchyPanel(Ref context) + : m_Context(context) + { + } + + void SceneHierarchyPanel::SetContext(Ref context) + { + m_Context = context; + } + + void SceneHierarchyPanel::OnUserInterfaceUpdate() + { + ImGui::Begin("Hierarchy"); + + m_Context->m_Registry. + each([&](auto& entityID) + { + Entity entity(entityID, m_Context.get()); + const std::string& tag = entity.GetComponent(); + + DrawNode(entity, tag); + }); + + ImGui::End(); + } + + void SceneHierarchyPanel::DrawNode(Entity entity, const std::string& label) + { + ImGuiTreeNodeFlags flags = (m_SelectionContext == entity ? ImGuiTreeNodeFlags_Selected : NULL) | ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_SpanFullWidth; + + bool expanded = ImGui::TreeNodeEx((void*)(uint64_t)(uint32_t)(entity), flags, label.c_str()); + + if (ImGui::IsItemClicked()) + m_SelectionContext = entity; + + if(expanded) + { + ImGui::Text("TEST_OPENED_TREE!"); + ImGui::TreePop(); + } + } + +} \ No newline at end of file diff --git a/Mirror/src/Panels/SceneHierarchyPanel.h b/Mirror/src/Panels/SceneHierarchyPanel.h new file mode 100644 index 0000000..20ec6fa --- /dev/null +++ b/Mirror/src/Panels/SceneHierarchyPanel.h @@ -0,0 +1,30 @@ +#pragma once + +#include "Panel.h" + +#include "Base/Base.h" + +#include "Scene/Entity.h" +#include "Scene/Scene.h" + +namespace Light { + + class SceneHierarchyPanel : public Panel + { + private: + Ref m_Context; + Entity m_SelectionContext; + + public: + SceneHierarchyPanel() = default; + SceneHierarchyPanel(Ref context); + + void SetContext(Ref context); + + void OnUserInterfaceUpdate(); + + private: + void DrawNode(Entity entity, const std::string& label); + }; + +} \ No newline at end of file