SceneHierarchyPanel
- Added Panel - Added SceneHierarchyPanel
This commit is contained in:
		
							parent
							
								
									8367150145
								
							
						
					
					
						commit
						fb4ba5c8bc
					
				
					 6 changed files with 122 additions and 10 deletions
				
			
		| 
						 | 
				
			
			@ -29,6 +29,8 @@ namespace Light {
 | 
			
		|||
		{
 | 
			
		||||
			return m_Scene->m_Registry.get<T>(m_Handle);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		operator uint32_t() { return (uint32_t)m_Handle; }
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -15,6 +15,7 @@ namespace Light {
 | 
			
		|||
	class Scene
 | 
			
		||||
	{
 | 
			
		||||
		friend class Entity;
 | 
			
		||||
		friend class SceneHierarchyPanel;
 | 
			
		||||
	private:
 | 
			
		||||
		entt::registry m_Registry;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,7 @@
 | 
			
		|||
#include <LightEngine.h>
 | 
			
		||||
 | 
			
		||||
#include "Panels/SceneHierarchyPanel.h"
 | 
			
		||||
 | 
			
		||||
#include <glm/gtc/matrix_transform.hpp>
 | 
			
		||||
 | 
			
		||||
namespace Light {
 | 
			
		||||
| 
						 | 
				
			
			@ -14,7 +16,9 @@ namespace Light {
 | 
			
		|||
 | 
			
		||||
		Ref<Framebuffer> m_Framebuffer;
 | 
			
		||||
 | 
			
		||||
		Scene m_Scene;
 | 
			
		||||
		Ref<Scene> 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>(Framebuffer::Create({ 800u, 600u, 1u }, GraphicsContext::GetSharedContext()));
 | 
			
		||||
 | 
			
		||||
			m_CameraEntity = m_Scene.CreateEntity("camera", glm::mat4(1.0f));
 | 
			
		||||
			m_CameraEntity.AddComponent<CameraComponent>(SceneCamera(), true);
 | 
			
		||||
			
 | 
			
		||||
			m_Scene = CreateRef<Scene>();
 | 
			
		||||
 | 
			
		||||
			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<SpriteRendererComponent>(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<SpriteRendererComponent>(m_AwesomefaceTexture);
 | 
			
		||||
				quad.AddComponent<TagComponent>("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<CameraComponent>(SceneCamera(), true);
 | 
			
		||||
			m_CameraEntity.AddComponent<TagComponent>("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<SpriteRendererComponent>(m_AwesomefaceTexture);
 | 
			
		||||
			m_NativeScriptEntity.AddComponent<TagComponent>("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<TransformComponent>();
 | 
			
		||||
			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();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								Mirror/src/Panels/Panel.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								Mirror/src/Panels/Panel.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
#pragma once
 | 
			
		||||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	class Panel
 | 
			
		||||
	{
 | 
			
		||||
	public:
 | 
			
		||||
		Panel() = default;
 | 
			
		||||
		virtual ~Panel() = default;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										53
									
								
								Mirror/src/Panels/SceneHierarchyPanel.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								Mirror/src/Panels/SceneHierarchyPanel.cpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,53 @@
 | 
			
		|||
#include "SceneHierarchyPanel.h"
 | 
			
		||||
 | 
			
		||||
#include "Scene/Components.h"
 | 
			
		||||
 | 
			
		||||
#include <entt.hpp>
 | 
			
		||||
 | 
			
		||||
#include <imgui.h>
 | 
			
		||||
 | 
			
		||||
namespace Light {
 | 
			
		||||
 | 
			
		||||
	SceneHierarchyPanel::SceneHierarchyPanel(Ref<Scene> context)
 | 
			
		||||
		: m_Context(context)
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void SceneHierarchyPanel::SetContext(Ref<Scene> 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<TagComponent>();
 | 
			
		||||
 | 
			
		||||
			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();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										30
									
								
								Mirror/src/Panels/SceneHierarchyPanel.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								Mirror/src/Panels/SceneHierarchyPanel.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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<Scene> m_Context;
 | 
			
		||||
		Entity m_SelectionContext;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		SceneHierarchyPanel() = default;
 | 
			
		||||
		SceneHierarchyPanel(Ref<Scene> context);
 | 
			
		||||
 | 
			
		||||
		void SetContext(Ref<Scene> context);
 | 
			
		||||
 | 
			
		||||
		void OnUserInterfaceUpdate();
 | 
			
		||||
 | 
			
		||||
	private:
 | 
			
		||||
		void DrawNode(Entity entity, const std::string& label);
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		
		Reference in a new issue