Archived
1
Fork 0

Support new render target api in editor

This commit is contained in:
redstrate 2021-02-17 00:15:59 -05:00
parent a6a46abb36
commit 8e781f3b5c
11 changed files with 72 additions and 49 deletions

View file

@ -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();

View file

@ -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);
}

View file

@ -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);

View file

@ -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;

View file

@ -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;

View file

@ -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) {

View file

@ -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();

View file

@ -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();

View file

@ -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();

View file

@ -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);
}
}

View file

@ -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();