- HitProxy 拾取:RG 管线渲染实体 id → host readback,点击帧 PickEntity 精确命中;拾取按视觉几何(Model 联合包围球射线求交), 与 Collider 解耦(UE/Unity 编辑器语义),命中打印实体名+碰撞体参数 - 选中描边(UE 语义):SelectionMask pass(R8Unorm 完整投影轮廓, 无深度测试透墙可见)→ Outline pass(边缘检测 + alpha 叠加, 必须注册在 Tonemap 后);edgeCut 贴视口边缘;widthPx=6 可调 - shader object 实证修复:VUID-08879 同程序 set layouts 超集一致、 VUID-10065 push block 4×float 平铺、新 pass 析构销毁 VkShaderEXT - RG:SideEffect() 保活"产出无 RG 内消费者"的 pass 链 - Editor:层次面板点击选中、Inspector 姿态编辑、Stats 面板拾取信息 - 相机 Update 改 const(姿态写入 Transform 引用,Camera 本身无状态变更)
44 lines
1.7 KiB
C++
44 lines
1.7 KiB
C++
//
|
||
// ViewportPanel:场景渲染输出面板。
|
||
//
|
||
// tonemap 输出经 ImGui::Image 显示(Editor 模式),并提供
|
||
// Editor Viewport / Fullscreen 显示模式切换。面板可用区域
|
||
// (物理像素)上报为渲染分辨率 → 画面精确填满面板。
|
||
//
|
||
// 点击拾取(UE 式 GPU HitProxy):单击 → NDC 请求 id 渲染;结果
|
||
// 由 Draw 每帧轮询取走(像素级,与视觉画面一致)。
|
||
//
|
||
|
||
#ifndef HELLOVULKAN_VIEWPORTPANEL_H
|
||
#define HELLOVULKAN_VIEWPORTPANEL_H
|
||
|
||
#include "EditorContext.h"
|
||
|
||
#include <imgui.h> // ImVec2(RequestPickAt 签名)
|
||
#include <entt/entt.hpp>
|
||
#include <optional>
|
||
|
||
// Viewport 面板每帧上报的输入焦点状态(Hazel 模式:编辑器据此决定
|
||
// 游戏侧输入是否放行——悬停/持焦 Viewport 才拥有 WASD/鼠标)
|
||
struct ViewportInputState {
|
||
bool hovered = false; // 鼠标悬停在 Viewport 面板上
|
||
bool focused = false; // Viewport 面板持有键盘焦点
|
||
};
|
||
|
||
class ViewportPanel {
|
||
public:
|
||
// 返回值:本帧拾取命中的实体(无点击/未命中 = nullopt 或 null);
|
||
// Editor 据此 SelectEntity(面板不持有选中状态)
|
||
std::optional<entt::entity> Draw(const EditorContext& ctx, ViewportInputState& out) const;
|
||
|
||
private:
|
||
// Image 区域内的鼠标位置 → NDC → Renderer::RequestPick
|
||
//(结果下一帧由 Draw 轮询 TakePickResult 取走)
|
||
void RequestPickAt(const EditorContext& ctx, const ImVec2& size) const;
|
||
|
||
// 命中打印:实体名 + collider 参数对照(诊断物理盒 ≠ 视觉用)
|
||
static void LogPick(const EditorContext& ctx, entt::entity e);
|
||
};
|
||
|
||
#endif //HELLOVULKAN_VIEWPORTPANEL_H
|