SetCursorCaptured / IsCursorCaptured / GetMouseDelta / ConsumeScrollDelta now route through the Input facade, so the editor camera no longer takes a Window& at all: Camera::Update and EditorCamera::Update lose their window parameter and SandboxApp calls Update(dt) directly. App layer now has zero Window/GLFW usage for input - everything goes through Engine::Input.
80 lines
3.3 KiB
C++
80 lines
3.3 KiB
C++
//
|
||
// Created by atdunbg on 2026/10/3.
|
||
//
|
||
// EditorCamera:Scene view 专用相机(UE FEditorViewportClient 语义)。
|
||
//
|
||
// 与场景相机实体是两个东西——它是视口 UI 状态,不属于场景:
|
||
// - 位姿自有(内嵌 TransformComponent,无父层级),空场景/无相机
|
||
// 实体也可用,永在不可删
|
||
// - 交互复用 Camera 控制器(RMB 飞行 / MMB 环绕 / 滚轮推拉),输入
|
||
// 直接写回自有 transform——位姿单一事实源不变(transform 即位姿)
|
||
// - 渲染源分派在 SceneRenderer::BuildFrame:编辑器形态恒用本类,
|
||
// 游戏形态用场景 primary 相机实体(游戏逻辑所有,本类不参与,
|
||
// 不 Update 即静止)
|
||
//
|
||
|
||
#ifndef HELLOVULKAN_EDITORCAMERA_H
|
||
#define HELLOVULKAN_EDITORCAMERA_H
|
||
|
||
#include <Engine/Renderer/Camera.h>
|
||
#include <Engine/ECS/Components.h>
|
||
#include <glm/glm.hpp>
|
||
|
||
namespace Engine {
|
||
|
||
class EditorCamera {
|
||
public:
|
||
EditorCamera()
|
||
{
|
||
// 出场位姿:俯视场中央(与旧沙盒 MainCamera 出场一致,
|
||
// 空场景也有可看的初始视角)
|
||
m_Transform.SetPosition({0.0f, 12.0f, 22.0f});
|
||
m_Transform.SetRotation({-25.0f, 0.0f, 0.0f});
|
||
m_Transform.Compose();
|
||
}
|
||
|
||
// 每帧输入驱动(编辑器形态由 Application 调用;游戏形态不调
|
||
// 即静止)。flyRequiresRMB 恒 true:编辑器移动键只在 RMB 按住
|
||
// 时生效(W/E/R 归 Gizmo,UE 语义)。暂停(timeScale=0)时
|
||
// 仍可飞行——调用方传 unscaled dt。键鼠/光标捕获统一走 Input
|
||
void Update(f32 deltaTime)
|
||
{
|
||
m_Controller.Update(m_Transform, deltaTime,
|
||
/*flyRequiresRMB=*/true);
|
||
m_Transform.Compose(); // World() 是渲染/Gizmo 读源,随写随算
|
||
}
|
||
|
||
// 跳转(对齐视口):把相机实体(或任意实体)位姿复制过来,
|
||
// Scene view 立即从该位置观看(UE "Pilot This Camera" 的
|
||
// 一次性对齐版)。环绕 pivot 已失效,清除待 MMB 重建
|
||
void AlignTo(const ECS::TransformComponent& target)
|
||
{
|
||
// world 位姿复制(目标实体可能在层级子树下)
|
||
m_Transform.SetPosition(target.GetWorldPosition());
|
||
m_Transform.SetRotationQuat(target.GetWorldRotationQuat());
|
||
m_Transform.Compose();
|
||
m_Controller.ResetOrbit();
|
||
}
|
||
|
||
// 焦点选中(F 键):pivot 设为 point,沿当前视线平移对准
|
||
void FocusOn(const glm::vec3& point)
|
||
{
|
||
m_Controller.FocusOn(m_Transform, point);
|
||
}
|
||
|
||
// 视图 = 自有 transform 世界矩阵的逆(要求已 Compose——
|
||
// Update/AlignTo/ctor 三个写入口都收尾 Compose)
|
||
glm::mat4 GetView() const { return m_Controller.GetView(m_Transform); }
|
||
|
||
ECS::TransformComponent& GetTransform() { return m_Transform; }
|
||
Camera& GetController() { return m_Controller; }
|
||
|
||
private:
|
||
ECS::TransformComponent m_Transform; // 自有位姿(非场景实体)
|
||
Camera m_Controller; // 交互控制器(环绕状态在此)
|
||
};
|
||
|
||
} // namespace Engine
|
||
|
||
#endif //HELLOVULKAN_EDITORCAMERA_H
|