Entity运算¶
重载运算符:仅当handle和scene相同时相等
operator uint32_t() const { return (uint32_t)m_EntityHandle; }
bool operator==(const Entity& other) const
{
return m_EntityHandle == other.m_EntityHandle && m_Scene == other.m_Scene;
}
bool operator!=(const Entity& other) const
{
return !(*this == other);
}
Panel¶
新建一个文件夹,用来存放不同的界面逻辑
SceneHierarchyPanel¶
public - 设置上下文 - imgui渲染 private: - 绘制entity的节点函数: - 拿到Tag组件,利用ImGui的TreeNodeFlags设置相关参数显示tag。 - 判断是否Click,如果有click则设置entity为当前选择的上下文 - 判断是否为打开(open)状态,如果打开就继续创建节点 - 如果被展开,结束层次
#pragma once
#include "CryDust/Core/Base.h"
#include "CryDust/Core/Log.h"
#include "CryDust/Scene/Scene.h"
#include "CryDust/Scene/Entity.h"
namespace CryDust {
class SceneHierarchyPanel
{
public:
SceneHierarchyPanel() = default;
SceneHierarchyPanel(const Ref<Scene>& scene);
void SetContext(const Ref<Scene>& scene);
void OnImGuiRender();
private:
void DrawEntityNode(Entity entity);
private:
Ref<Scene> m_Context;
Entity m_SelectionContext;
};
}
EditorLayer¶
实例化层次面板对象
在cpp中将上下文设置为当前场景 并调用DrawIMGUI绘制面板
设置组件显示¶
按空的地方应该把上下文关上,当有上下文的时候才显示组件。
- 在绘制Tag的时候设置一个缓冲区来绘制
- 绘制Transform
#include <glm/gtc/type_ptr.hpp>
....
if (ImGui::IsMouseDown(0) && ImGui::IsWindowHovered())
m_SelectionContext = {};
ImGui::End();
ImGui::Begin("Properties");
if (m_SelectionContext)
DrawComponents(m_SelectionContext);
···
void SceneHierarchyPanel::DrawComponents(Entity entity)
{
if (entity.HasComponent<TagComponent>())
{
auto& tag = entity.GetComponent<TagComponent>().Tag;
char buffer[256];
memset(buffer, 0, sizeof(buffer));
strcpy_s(buffer, sizeof(buffer), tag.c_str());
if (ImGui::InputText("Tag", buffer, sizeof(buffer)))
{
tag = std::string(buffer);
}
}
if (entity.HasComponent<TransformComponent>())
{
if (ImGui::TreeNodeEx((void*)typeid(TransformComponent).hash_code(), ImGuiTreeNodeFlags_DefaultOpen, "Transform"))
{
auto& transform = entity.GetComponent<TransformComponent>().Transform;
ImGui::DragFloat3("Position", glm::value_ptr(transform[3]), 0.1f);
ImGui::TreePop();
}
}
}