跳转至

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