From 8e781f3b5c16f17d77f3e3b8dafb11b80020714e Mon Sep 17 00:00:00 2001 From: redstrate <54911369+redstrate@users.noreply.github.com> Date: Wed, 17 Feb 2021 00:15:59 -0500 Subject: [PATCH] Support new render target api in editor --- engine/core/src/debug.cpp | 6 ++++ engine/core/src/engine.cpp | 3 -- engine/renderer/include/renderer.hpp | 8 +++++ engine/renderer/src/imguipass.cpp | 5 +-- engine/renderer/src/renderer.cpp | 50 ++++++++++++++------------- tools/common/include/commoneditor.hpp | 12 +++++-- tools/common/src/commoneditor.cpp | 27 ++++++++------- tools/editor/src/materialeditor.cpp | 2 +- tools/editor/src/prefabeditor.cpp | 2 +- tools/editor/src/prismeditor.cpp | 4 +-- tools/editor/src/sceneeditor.cpp | 2 +- 11 files changed, 72 insertions(+), 49 deletions(-) diff --git a/engine/core/src/debug.cpp b/engine/core/src/debug.cpp index bcbeec2..6a09bf7 100644 --- a/engine/core/src/debug.cpp +++ b/engine/core/src/debug.cpp @@ -102,6 +102,12 @@ void draw_renderer() { ImGui::TextDisabled("No scene loaded for budgeting."); } + auto targets = engine->get_renderer()->get_all_render_targets(); + for(auto target : targets) { + ImGui::Text("%i %i", target->extent.width, target->extent.height); + ImGui::Image(target->offscreenColorTexture, ImVec2(100, 100)); + } + ImGui::Text("Performance"); ImGui::Separator(); diff --git a/engine/core/src/engine.cpp b/engine/core/src/engine.cpp index fd5e98c..040cbac 100755 --- a/engine/core/src/engine.cpp +++ b/engine/core/src/engine.cpp @@ -468,9 +468,6 @@ void Engine::process_key_up(const unsigned int keyCode) { } void Engine::process_mouse_down(const int button, const prism::Offset offset) { - Expects(offset.x >= 0); - Expects(offset.y >= 0); - if(_current_screen != nullptr && button == 0) _current_screen->process_mouse(offset.x, offset.y); } diff --git a/engine/renderer/include/renderer.hpp b/engine/renderer/include/renderer.hpp index 1a38007..ce2a341 100755 --- a/engine/renderer/include/renderer.hpp +++ b/engine/renderer/include/renderer.hpp @@ -110,6 +110,14 @@ public: bool reloading_shader = false; + std::vector get_all_render_targets() const { + std::vector targets; + for(auto& target : render_targets) + targets.push_back(target.get()); + + return targets; + } + private: void createDummyTexture(); void create_render_target_resources(RenderTarget& target); diff --git a/engine/renderer/src/imguipass.cpp b/engine/renderer/src/imguipass.cpp index 1335424..9399eff 100755 --- a/engine/renderer/src/imguipass.cpp +++ b/engine/renderer/src/imguipass.cpp @@ -80,8 +80,9 @@ void ImGuiPass::render_post(GFXCommandBuffer* command_buffer, const int index) { draw_data = io.Viewports[i]->DrawData; } } - - Expects(draw_data != nullptr); + + if(draw_data == nullptr) + return; if(draw_data->TotalIdxCount == 0 || draw_data->TotalVtxCount == 0) return; diff --git a/engine/renderer/src/renderer.cpp b/engine/renderer/src/renderer.cpp index 2b35b1c..4e3fc41 100755 --- a/engine/renderer/src/renderer.cpp +++ b/engine/renderer/src/renderer.cpp @@ -124,12 +124,14 @@ RenderTarget* Renderer::allocate_render_target(const prism::Extent extent) { resize_render_target(*target, extent); - return render_targets.emplace_back(std::move(target)).get();; + render_targets.push_back(std::move(target)); + + return render_targets.back().get(); } void Renderer::resize_render_target(RenderTarget& target, const prism::Extent extent) { target.extent = extent; - + create_render_target_resources(target); smaaPass->create_render_target_resources(target); createPostPipeline(); @@ -769,29 +771,29 @@ void Renderer::create_render_target_resources(RenderTarget& target) { target.offscreenFramebuffer = gfx->create_framebuffer(framebufferInfo); - GFXGraphicsPipelineCreateInfo pipelineInfo = {}; - pipelineInfo.label = "Post"; + if(postPipeline == nullptr) { + GFXGraphicsPipelineCreateInfo pipelineInfo = {}; + pipelineInfo.label = "Post"; + + pipelineInfo.shaders.vertex_src = file::Path("post.vert"); + pipelineInfo.shaders.fragment_src = file::Path("post.frag"); + + pipelineInfo.shader_input.bindings = { + {4, GFXBindingType::PushConstant}, + {1, GFXBindingType::Texture}, + {2, GFXBindingType::Texture}, + {3, GFXBindingType::Texture}, + {5, GFXBindingType::Texture}, + {6, GFXBindingType::Texture}, + {7, GFXBindingType::Texture} + }; + + pipelineInfo.shader_input.push_constants = { + {sizeof(PostPushConstants), 0} + }; + + postPipeline = gfx->create_graphics_pipeline(pipelineInfo); - pipelineInfo.shaders.vertex_src = file::Path("post.vert"); - pipelineInfo.shaders.fragment_src = file::Path("post.frag"); - - pipelineInfo.shader_input.bindings = { - {4, GFXBindingType::PushConstant}, - {1, GFXBindingType::Texture}, - {2, GFXBindingType::Texture}, - {3, GFXBindingType::Texture}, - {5, GFXBindingType::Texture}, - {6, GFXBindingType::Texture}, - {7, GFXBindingType::Texture} - }; - - pipelineInfo.shader_input.push_constants = { - {sizeof(PostPushConstants), 0} - }; - - postPipeline = gfx->create_graphics_pipeline(pipelineInfo); - - if(renderToTexturePipeline == nullptr) { pipelineInfo.label = "Render to Texture"; pipelineInfo.render_pass = offscreenRenderPass; diff --git a/tools/common/include/commoneditor.hpp b/tools/common/include/commoneditor.hpp index df49d60..3f2dbcb 100755 --- a/tools/common/include/commoneditor.hpp +++ b/tools/common/include/commoneditor.hpp @@ -129,7 +129,7 @@ public: virtual void asset_selected([[maybe_unused]] std::filesystem::path path, [[maybe_unused]] AssetType type) {} void createDockArea(); - void drawViewport(); + void drawViewport(Scene* scene); void drawAssets(); // options @@ -299,6 +299,14 @@ public: int viewport_width = 1, viewport_height = 1; +protected: + struct ViewportRenderTarget { + Scene* scene = nullptr; + RenderTarget* target = nullptr; + }; + + std::unordered_map viewport_render_targets; + private: void load_options(); void save_options(); @@ -335,8 +343,6 @@ private: void edit_asset_mesh(const char* name, AssetPtr& asset); void edit_asset_texture(const char* name, AssetPtr& asset); void edit_asset_material(const char* name, AssetPtr& asset); - - std::unordered_map viewport_render_targets; }; inline void editPath(const char* label, std::string& path, bool editable = true, const std::function on_selected = nullptr) { diff --git a/tools/common/src/commoneditor.cpp b/tools/common/src/commoneditor.cpp index 6118001..6204dbb 100755 --- a/tools/common/src/commoneditor.cpp +++ b/tools/common/src/commoneditor.cpp @@ -703,27 +703,30 @@ void CommonEditor::createDockArea() { ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), ImGuiDockNodeFlags_PassthruCentralNode); } -void CommonEditor::drawViewport() { +void CommonEditor::drawViewport(Scene* scene) { const auto size = ImGui::GetContentRegionAvail(); const auto real_size = ImVec2(size.x * platform::get_window_dpi(0), size.y * platform::get_window_dpi(0)); if(real_size.x <= 0 || real_size.y <= 0) return; - auto window_id = ImGui::GetCurrentWindow()->ID; + auto window = ImGui::GetCurrentWindowRead(); + auto window_id = window->ID; - RenderTarget* target = nullptr; - if(viewport_render_targets.count(window_id)) { - target = viewport_render_targets[window_id]; + if(!viewport_render_targets.count(window_id)) { + ViewportRenderTarget new_target; + new_target.target = engine->get_renderer()->allocate_render_target(real_size); - if(real_size.x != target->extent.width || real_size.y != target->extent.height) - engine->get_renderer()->resize_render_target(*target, real_size); - } else { - target = engine->get_renderer()->allocate_render_target(real_size); - - viewport_render_targets[window_id] = target; + viewport_render_targets[window_id] = new_target; } + auto target = &viewport_render_targets[window_id]; + + if(real_size.x != target->target->extent.width || real_size.y != target->target->extent.height) + engine->get_renderer()->resize_render_target(*target->target, real_size); + + target->scene = scene; + viewport_width = size.x; viewport_height = size.y; @@ -733,7 +736,7 @@ void CommonEditor::drawViewport() { viewport_x = mouse_pos.x - real_pos.x; viewport_y = mouse_pos.y - real_pos.y; - ImGui::Image((ImTextureID)target->offscreenColorTexture, size); + ImGui::Image((ImTextureID)target->target->offscreenColorTexture, size); accepting_viewport_input = ImGui::IsWindowHovered(); diff --git a/tools/editor/src/materialeditor.cpp b/tools/editor/src/materialeditor.cpp index 41e04b3..35c3f34 100755 --- a/tools/editor/src/materialeditor.cpp +++ b/tools/editor/src/materialeditor.cpp @@ -184,7 +184,7 @@ void MaterialEditor::draw(CommonEditor* editor) { if(scene != nullptr) { ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); if(begin("Viewport")) - editor->drawViewport(); + editor->drawViewport(scene); ImGui::End(); diff --git a/tools/editor/src/prefabeditor.cpp b/tools/editor/src/prefabeditor.cpp index 6559211..c614e50 100755 --- a/tools/editor/src/prefabeditor.cpp +++ b/tools/editor/src/prefabeditor.cpp @@ -92,7 +92,7 @@ void PrefabEditor::draw(CommonEditor* editor) { ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); if(begin("Viewport")) - editor->drawViewport(); + editor->drawViewport(scene); ImGui::End(); diff --git a/tools/editor/src/prismeditor.cpp b/tools/editor/src/prismeditor.cpp index e26e08f..07116ec 100755 --- a/tools/editor/src/prismeditor.cpp +++ b/tools/editor/src/prismeditor.cpp @@ -177,8 +177,8 @@ void PrismEditor::open_asset(const file::Path path) { } void PrismEditor::renderEditor(GFXCommandBuffer* command_buffer) { - for (auto& editor : editors) { - //editor->renderer->render(command_buffer, editor->get_scene(), -1); + for(auto [id, render_target] : viewport_render_targets) { + engine->get_renderer()->render(command_buffer, render_target.scene, *render_target.target, -1); } } diff --git a/tools/editor/src/sceneeditor.cpp b/tools/editor/src/sceneeditor.cpp index f8c76c5..c5ab0be 100755 --- a/tools/editor/src/sceneeditor.cpp +++ b/tools/editor/src/sceneeditor.cpp @@ -156,7 +156,7 @@ void SceneEditor::draw(CommonEditor* editor) { if(showViewport) { ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); if(begin("Viewport", &showViewport)) - editor->drawViewport(); + editor->drawViewport(scene); ImGui::PopStyleVar();