Files
HelloVulkan/Engine/include/Engine/Renderer/EditorCamera.h
T
atdunbg a3037cd401 Input facade: add cursor capture, mouse delta and scroll delta
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.
2026-10-05 11:45:57 +08:00

80 lines
3.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//
// 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