SceneHierarchyPanel

- Added Panel
- Added SceneHierarchyPanel
This commit is contained in:
Light 2021-07-31 11:03:31 +04:30
parent 8367150145
commit fb4ba5c8bc
6 changed files with 122 additions and 10 deletions

View file

@ -29,6 +29,8 @@ namespace Light {
{
return m_Scene->m_Registry.get<T>(m_Handle);
}
operator uint32_t() { return (uint32_t)m_Handle; }
};
}

View file

@ -15,6 +15,7 @@ namespace Light {
class Scene
{
friend class Entity;
friend class SceneHierarchyPanel;
private:
entt::registry m_Registry;

View file

@ -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
View file

@ -0,0 +1,12 @@
#pragma once
namespace Light {
class Panel
{
public:
Panel() = default;
virtual ~Panel() = default;
};
}

View 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();
}
}
}

View 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);
};
}