refactor: 实体句柄表皮——实体自己管理组件的 API 形态
- 新增 EntityHandle:e.AddComponent<T>() / e.GetComponent<T>() / e.Destroy() / e.GetUUID(),转发 entt registry,零存储开销 - Scene::CreateEntity 返回 EntityHandle;Scene 层组件接口保留 (给渲染器/系统批量遍历用) - 语义分层:应用层"实体管组件"(句柄表皮), 数据层组件存储仍集中在 registry(ECS 性能根基)
This commit is contained in:
+19
-20
@@ -12,6 +12,7 @@
|
||||
#include <Engine/Core/Log.h>
|
||||
#include <Engine/Core/Stats.h>
|
||||
#include <Engine/ECS/Scene.h>
|
||||
#include <Engine/ECS/EntityHandle.h>
|
||||
#include <Engine/ECS/Components.h>
|
||||
#include <Engine/Assets/AssetManager.h>
|
||||
|
||||
@@ -42,56 +43,54 @@ protected:
|
||||
auto backpack = GetAssets().LoadModel("assets/models/backpack/backpack.obj");
|
||||
|
||||
// 相机实体(primary = 当前渲染视角)
|
||||
m_CameraEntity = scene.CreateEntity("MainCamera");
|
||||
auto& camera = scene.AddComponent<CameraComponent>(m_CameraEntity);
|
||||
m_Camera = scene.CreateEntity("MainCamera");
|
||||
auto& camera = m_Camera.AddComponent<CameraComponent>();
|
||||
camera.primary = true;
|
||||
camera.camera.SetPosition(glm::vec3(0.0f, 0.0f, 7.0f));
|
||||
|
||||
// 背包实体 × 3
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
Entity e = scene.CreateEntity("Backpack" + std::to_string(i));
|
||||
auto e = scene.CreateEntity("Backpack" + std::to_string(i));
|
||||
|
||||
auto& transform = scene.AddComponent<TransformComponent>(e);
|
||||
transform.world = glm::translate(
|
||||
e.AddComponent<TransformComponent>().world = glm::translate(
|
||||
glm::mat4(1.0f),
|
||||
glm::vec3((i - 1) * 1.5f, 0.0f, 0.0f));
|
||||
|
||||
scene.AddComponent<MeshRendererComponent>(e, MeshRendererComponent{backpack});
|
||||
e.AddComponent<MeshRendererComponent>(MeshRendererComponent{backpack});
|
||||
|
||||
m_Spinners.push_back(e);
|
||||
}
|
||||
|
||||
// 灯光实体
|
||||
Entity keyLight = scene.CreateEntity("KeyLight");
|
||||
scene.AddComponent<LightComponent>(keyLight,
|
||||
LightComponent{glm::vec3(-0.5f, -1.0f, -0.3f),
|
||||
glm::vec4(1.0f, 0.95f, 0.9f, 1.0f)});
|
||||
scene.CreateEntity("KeyLight")
|
||||
.AddComponent<LightComponent>(
|
||||
LightComponent{glm::vec3(-0.5f, -1.0f, -0.3f),
|
||||
glm::vec4(1.0f, 0.95f, 0.9f, 1.0f)});
|
||||
|
||||
Entity fillLight = scene.CreateEntity("FillLight");
|
||||
scene.AddComponent<LightComponent>(fillLight,
|
||||
LightComponent{glm::vec3(0.5f, -0.5f, 0.3f),
|
||||
glm::vec4(0.3f, 0.5f, 1.0f, 0.8f)});
|
||||
scene.CreateEntity("FillLight")
|
||||
.AddComponent<LightComponent>(
|
||||
LightComponent{glm::vec3(0.5f, -0.5f, 0.3f),
|
||||
glm::vec4(0.3f, 0.5f, 1.0f, 0.8f)});
|
||||
}
|
||||
|
||||
void OnUpdate(f32 deltaTime) override
|
||||
{
|
||||
Scene& scene = GetScene();
|
||||
m_Time += deltaTime;
|
||||
|
||||
// 相机(WASD/Space/Shift 移动)
|
||||
scene.GetComponent<CameraComponent>(m_CameraEntity)
|
||||
m_Camera.GetComponent<CameraComponent>()
|
||||
.camera.Update(GetWindow(), deltaTime);
|
||||
|
||||
// 旋转动画:直接写实体组件
|
||||
for (size_t i = 0; i < m_Spinners.size(); ++i) {
|
||||
f32 angle = m_Time * glm::radians(60.0f) + static_cast<f32>(i) * 0.7f;
|
||||
|
||||
auto& transform = scene.GetComponent<TransformComponent>(m_Spinners[i]);
|
||||
auto& transform = m_Spinners[i].GetComponent<TransformComponent>();
|
||||
glm::mat4 t = glm::translate(
|
||||
glm::mat4(1.0f),
|
||||
glm::vec3((static_cast<f32>(i) - 1.0f) * 1.5f, 0.0f, 0.0f));
|
||||
glm::mat4 r = glm::rotate(glm::mat4(1.0f), angle, glm::vec3(0.0f, 1.0f, 0.0f));
|
||||
glm::mat4 s = glm::scale(glm::mat4(1.0f), glm::vec3(0.5));
|
||||
glm::mat4 s = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f));
|
||||
|
||||
transform.world = t * r * s;
|
||||
}
|
||||
@@ -115,8 +114,8 @@ protected:
|
||||
}
|
||||
|
||||
private:
|
||||
Entity m_CameraEntity{entt::null}; // 注意:entt::entity{} 是 0 号实体,空句柄要用 entt::null
|
||||
std::vector<Entity> m_Spinners;
|
||||
EntityHandle m_Camera{}; // Scene::CreateEntity 之前为空
|
||||
std::vector<EntityHandle> m_Spinners;
|
||||
f32 m_Time = 0.0f;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user