zengine/engine/src/editor/window/editor_main_window.cpp
2024-12-26 21:54:38 +08:00

90 lines
3.0 KiB
C++

#include "editor/window/editor_main_window.h"
#include "ui/ui_render_device.h"
#include "event/event_system.h"
#include "data/global.h"
#include <NoesisPCH.h>
namespace api {
using namespace Noesis;
void EditorMainUIWindow::InitializeComponent()
{
for (int i = 0; i < 1000; i++) {
int j = 1;
}
}
EditorMainWindow::EditorMainWindow()
{
Ptr<FrameworkElement> xaml = GUI::LoadXaml<FrameworkElement>("/editor_noesis/Menu.xaml");
mView = GUI::CreateView(xaml);
mView->SetFlags(RenderFlags_PPAA | RenderFlags_LCD);
mView->SetSize(1024, 768);
mView->GetRenderer()->Init(UIRenderDevice::Ptr());
}
void EditorMainWindow::DrawNoesisUI()
{
mView->Update(0.033);
IRenderer* renderer = mView->GetRenderer();
renderer->UpdateRenderTree();
renderer->RenderOffscreen();
renderer->Render();
}
TextureSampler sampler{
.filterMag = SamplerMagFilter::LINEAR,
.filterMin = SamplerMinFilter::LINEAR,
.wrapS = SamplerWrapMode::CLAMP_TO_EDGE,
.wrapT = SamplerWrapMode::CLAMP_TO_EDGE,
.wrapR = SamplerWrapMode::CLAMP_TO_EDGE,
.compareMode = SamplerCompareMode::COMPARE_TO_TEXTURE,
.compareFunc = SamplerCompareFunc::GE,
};
ImTextureID TextureIDList[10] = {};
void InitRenderSurface(FrameGraph& graph, uint32_t frameCount) {
static bool sInit = false;
if (sInit)
return;
sInit = true;
TextureDesc desc{};
desc.width = 512;
desc.height = 512;
desc.format = TinyImageFormat_B8G8R8A8_SRGB;
desc.state = ResourceState::UNDEFINED;
desc.sampleCount = SampleCount::SAMPLE_COUNT_1;
desc.arraySize = 1;
desc.mipLevel = 1;
desc.depth = 1;
desc.dimension = TextureDimension::TEX_2D;
desc.usage = TextureUsage::COLOR_ATTACHMENT | TextureUsage::SAMPLEABLE;
for (uint32_t i = 0; i < frameCount; i++) {
graph.SetResourceTexture(desc, FrameGraph::NameEditorSurface, i);
}
}
void EditorMainWindow::Draw(FrameGraph& graph, RenderEditorContext& ctx)
{
static float my_float = 0.5f;
TextureDesc renderSurface = graph.GetRenderSurface();
ImGuiViewport* viewport = ImGui::GetMainViewport();
ImGui::SetNextWindowViewport(viewport->ID);
// 设置窗口的大小为屏幕的分辨率
ImGui::SetNextWindowSize(ImVec2(renderSurface.width, renderSurface.height));
// 设置窗口位置为左上角
ImGui::SetNextWindowPos(viewport->Pos);
ImGui::Begin("MainWindow", NULL, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar);
ImGui::Text("This is some useful text.");
ImGui::SliderFloat("float", &my_float, 0.0f, 1.0f);
if (gEngineConfig.IsRenderEditorSurface) {
TextureDesc surface = graph.GetSurface();
if (!TextureIDList[ctx.frame]) {
TextureIDList[ctx.frame] = ctx->AddTexture(graph, surface, sampler);
}
// 每帧渲染时都可以通过 ImTextureID 使用
ImGui::Image(TextureIDList[ctx.frame], ImVec2(surface.width, surface.height));
}
else {
gEngineConfig.IsRenderEditorSurface = true;
InitRenderSurface(graph, ctx.frameCount);
}
ImGui::End();
DrawNoesisUI();
}
}