feat: ImGui docking Editor + 显示链/帧同步/输入语义重构
- App/editor: Hierarchy/Inspector/Viewport/Stats 四面板 + DockBuilder 默认布局,main.cpp 瘦身为场景搭建与生命周期 - 显示链: Tonemap→PresentTarget 经 ImGui::Image 呈现(零色偏),backbuffer 仅承载 ImGui;Direct/Viewport 双显示模式 + 面板分辨率上报 - 帧首同步 BeginFrameSync: resize/vsync/尺寸/模式意图统一帧首落定(修描述符悬垂);修复 vsync 意图未落 swapchain 导致的每帧重建交换链 - 输入: Editor 每帧判定键盘/鼠标归属(打字让位、Viewport hover/focus 放行、Fullscreen 全放行) - 材质: roughness 独立槽位 + 非 glTF 金属/粗糙贴图映射;透明队列 depthWrite=FALSE + translucent 独立 shader + scratch 清帧 - FBX: 非蒙皮网格烘焙节点链全局变换(Z-up 旋转/单位换算落顶点) - Hierarchy 行 ImGui ID 以 UUID 作用域(重名不冲突、改名不丢选中)
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
//
|
||||
// ViewportPanel.cpp:显示模式单选 + ImGui::Image + 分辨率上报。
|
||||
// 逻辑照搬原 main.cpp 的 Viewport 窗口(行为不变)。
|
||||
//
|
||||
|
||||
#include "ViewportPanel.h"
|
||||
|
||||
#include <imgui.h>
|
||||
|
||||
#include <vulkan/vulkan.h> // vk::Extent2D 经 Renderer 头已带入,显式无妨
|
||||
|
||||
using namespace Engine; // u32 / f32(Engine/Core/Types.h)
|
||||
|
||||
void ViewportPanel::Draw(const EditorContext &ctx, ViewportInputState &out) {
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
|
||||
{
|
||||
ImGui::Begin("Viewport", nullptr, ImGuiWindowFlags_NoCollapse);
|
||||
|
||||
// 输入焦点上报(悬停计入遮挡:模态框盖住时不误报)
|
||||
out.hovered = ImGui::IsWindowHovered();
|
||||
out.focused = ImGui::IsWindowFocused();
|
||||
|
||||
auto &renderer = *ctx.renderer;
|
||||
const int mode = renderer.GetDisplayMode();
|
||||
|
||||
const void *sceneTex = renderer.GetSceneTexture();
|
||||
if (sceneTex != nullptr && mode == kDisplayViewport) {
|
||||
// 面板可用区域(物理像素)上报为渲染分辨率 → 画面精确填满
|
||||
// 面板;下一帧帧首 BeginFrameSync 生效(一帧延迟,不可见)
|
||||
const ImVec2 avail = ImGui::GetContentRegionAvail();
|
||||
const ImVec2 fb = ImGui::GetIO().DisplayFramebufferScale;
|
||||
const u32 wantW = static_cast<u32>(avail.x * fb.x + 0.5f);
|
||||
const u32 wantH = static_cast<u32>(avail.y * fb.y + 0.5f);
|
||||
if (wantW >= 16 && wantH >= 16) {
|
||||
renderer.SetViewportSize(wantW, wantH);
|
||||
}
|
||||
|
||||
// 纹理 = 渲染分辨率:等比适配面板可用区域
|
||||
const vk::Extent2D ext = renderer.GetRenderExtent();
|
||||
const f32 aspect =
|
||||
ext.height != 0 ? f32(ext.width) / f32(ext.height) : 1.0f;
|
||||
ImVec2 size = avail;
|
||||
if (avail.x / avail.y > aspect) size.x = avail.y * aspect;
|
||||
else size.y = avail.x / aspect;
|
||||
ImGui::Image((ImTextureID) (intptr_t) sceneTex, size);
|
||||
} else {
|
||||
ImGui::TextDisabled("(scene texture not ready)");
|
||||
}
|
||||
|
||||
ImGui::End();
|
||||
}
|
||||
ImGui::PopStyleVar();
|
||||
}
|
||||
Reference in New Issue
Block a user