editor camera: dedicated Scene-view camera decoupled from camera entities
EditorCamera (UE FEditorViewportClient semantics) owned by SceneRenderer:
own TransformComponent + reused Camera controller. BuildFrame dispatches
render source by display mode — editor form always renders from the
editor camera (usable in empty scenes), game form renders from the
scene's primary camera entity. AlignTo copies an entity pose into the
editor camera ("Align Viewport to Camera" button in Inspector). F focus
and viewport gizmo now follow the same dispatch. main.cpp stripped of
dangling sandbox camera/spinner state; onSceneLoaded hook removed.
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
|
||||
#include <Engine/Renderer/Renderer.h>
|
||||
#include <Engine/Renderer/SceneRenderer.h>
|
||||
#include <Engine/Renderer/EditorCamera.h>
|
||||
#include <Engine/Renderer/VulkanAssetUploader.h>
|
||||
#include <Engine/Renderer/Passes/SceneGpu.h>
|
||||
#include <Engine/Renderer/Passes/FullscreenGpu.h>
|
||||
@@ -233,6 +234,11 @@ namespace Engine
|
||||
m_SceneRenderer->SetDisplayMode(mode);
|
||||
}
|
||||
|
||||
EditorCamera& Renderer::GetEditorCamera()
|
||||
{
|
||||
return m_SceneRenderer->GetEditorCamera();
|
||||
}
|
||||
|
||||
const FrameSceneData &Renderer::GetFrameSceneData() const
|
||||
{
|
||||
return m_SceneRenderer->Frame();
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <Engine/ECS/Scene.h>
|
||||
#include <Engine/ECS/Components.h>
|
||||
#include <Engine/Renderer/Camera.h>
|
||||
#include <Engine/Renderer/EditorCamera.h>
|
||||
#include <Engine/Renderer/Frustum.h>
|
||||
#include <Engine/Renderer/Model.h>
|
||||
#include <Engine/Renderer/Mesh.h>
|
||||
@@ -258,14 +259,21 @@ namespace Engine
|
||||
ubo.prevView = m_LastView;
|
||||
ubo.prevProj = m_LastProjNoJitter;
|
||||
|
||||
// ---- 1. 相机(位姿单一事实源 = 相机实体的 Transform)----
|
||||
TransformComponent* camTransform = nullptr;
|
||||
auto* cameraComp = scene.GetPrimaryCamera(&camTransform);
|
||||
if (!cameraComp || !camTransform) {
|
||||
// 无相机:本帧跳过(正常场景必有相机,安全网)
|
||||
// ---- 1. 相机:渲染源按显示模式分派(UE 语义)。编辑器形态
|
||||
// Scene view 恒用编辑器相机(视口 UI 状态,空场景可用);
|
||||
// 游戏形态用场景 primary 相机实体(游戏逻辑所有)----
|
||||
ECS::TransformComponent* camTransform = nullptr;
|
||||
const Camera* camera = nullptr;
|
||||
if (m_DisplayMode == kDisplayViewport) {
|
||||
camTransform = &m_EditorCamera.GetTransform();
|
||||
camera = &m_EditorCamera.GetController();
|
||||
} else if (auto* cameraComp = scene.GetPrimaryCamera(&camTransform)) {
|
||||
camera = &cameraComp->camera;
|
||||
}
|
||||
if (!camera || !camTransform) {
|
||||
// 游戏形态无 primary 相机:本帧跳过(安全网)
|
||||
return false; // 拾取请求未消费,留待下一帧重试
|
||||
}
|
||||
const Camera& camera = cameraComp->camera;
|
||||
|
||||
// 拾取请求落帧(一次性消费:本帧 HitProxy 渲染 + 像素拷贝)。
|
||||
// 放在相机校验之后:跳帧时请求保留,不丢点击
|
||||
@@ -276,8 +284,8 @@ namespace Engine
|
||||
|
||||
const f32 aspect = static_cast<f32>(targetExtent.width) /
|
||||
static_cast<f32>(targetExtent.height);
|
||||
ubo.view = camera.GetView(*camTransform);
|
||||
ubo.proj = camera.GetProjection(aspect, 0.1f, 100.0f);
|
||||
ubo.view = camera->GetView(*camTransform);
|
||||
ubo.proj = camera->GetProjection(aspect, 0.1f, 100.0f);
|
||||
|
||||
// 未抖动投影:velocity 的当前帧 clip 位置用它(抖动不能进 velocity)
|
||||
ubo.projNoJitter = ubo.proj;
|
||||
|
||||
Reference in New Issue
Block a user