Support new render target api in editor
This commit is contained in:
parent
a6a46abb36
commit
8e781f3b5c
11 changed files with 72 additions and 49 deletions
|
@ -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();
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -110,6 +110,14 @@ public:
|
|||
|
||||
bool reloading_shader = false;
|
||||
|
||||
std::vector<RenderTarget*> get_all_render_targets() const {
|
||||
std::vector<RenderTarget*> targets;
|
||||
for(auto& target : render_targets)
|
||||
targets.push_back(target.get());
|
||||
|
||||
return targets;
|
||||
}
|
||||
|
||||
private:
|
||||
void createDummyTexture();
|
||||
void create_render_target_resources(RenderTarget& target);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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<ImGuiID, ViewportRenderTarget> viewport_render_targets;
|
||||
|
||||
private:
|
||||
void load_options();
|
||||
void save_options();
|
||||
|
@ -335,8 +343,6 @@ private:
|
|||
void edit_asset_mesh(const char* name, AssetPtr<Mesh>& asset);
|
||||
void edit_asset_texture(const char* name, AssetPtr<Texture>& asset);
|
||||
void edit_asset_material(const char* name, AssetPtr<Material>& asset);
|
||||
|
||||
std::unordered_map<ImGuiID, RenderTarget*> viewport_render_targets;
|
||||
};
|
||||
|
||||
inline void editPath(const char* label, std::string& path, bool editable = true, const std::function<void()> on_selected = nullptr) {
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
Reference in a new issue