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.");
|
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::Text("Performance");
|
||||||
ImGui::Separator();
|
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) {
|
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)
|
if(_current_screen != nullptr && button == 0)
|
||||||
_current_screen->process_mouse(offset.x, offset.y);
|
_current_screen->process_mouse(offset.x, offset.y);
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,6 +110,14 @@ public:
|
||||||
|
|
||||||
bool reloading_shader = false;
|
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:
|
private:
|
||||||
void createDummyTexture();
|
void createDummyTexture();
|
||||||
void create_render_target_resources(RenderTarget& target);
|
void create_render_target_resources(RenderTarget& target);
|
||||||
|
|
|
@ -81,7 +81,8 @@ void ImGuiPass::render_post(GFXCommandBuffer* command_buffer, const int index) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Expects(draw_data != nullptr);
|
if(draw_data == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
if(draw_data->TotalIdxCount == 0 || draw_data->TotalVtxCount == 0)
|
if(draw_data->TotalIdxCount == 0 || draw_data->TotalVtxCount == 0)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -124,7 +124,9 @@ RenderTarget* Renderer::allocate_render_target(const prism::Extent extent) {
|
||||||
|
|
||||||
resize_render_target(*target, 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) {
|
void Renderer::resize_render_target(RenderTarget& target, const prism::Extent extent) {
|
||||||
|
@ -769,6 +771,7 @@ void Renderer::create_render_target_resources(RenderTarget& target) {
|
||||||
|
|
||||||
target.offscreenFramebuffer = gfx->create_framebuffer(framebufferInfo);
|
target.offscreenFramebuffer = gfx->create_framebuffer(framebufferInfo);
|
||||||
|
|
||||||
|
if(postPipeline == nullptr) {
|
||||||
GFXGraphicsPipelineCreateInfo pipelineInfo = {};
|
GFXGraphicsPipelineCreateInfo pipelineInfo = {};
|
||||||
pipelineInfo.label = "Post";
|
pipelineInfo.label = "Post";
|
||||||
|
|
||||||
|
@ -791,7 +794,6 @@ void Renderer::create_render_target_resources(RenderTarget& target) {
|
||||||
|
|
||||||
postPipeline = gfx->create_graphics_pipeline(pipelineInfo);
|
postPipeline = gfx->create_graphics_pipeline(pipelineInfo);
|
||||||
|
|
||||||
if(renderToTexturePipeline == nullptr) {
|
|
||||||
pipelineInfo.label = "Render to Texture";
|
pipelineInfo.label = "Render to Texture";
|
||||||
pipelineInfo.render_pass = offscreenRenderPass;
|
pipelineInfo.render_pass = offscreenRenderPass;
|
||||||
|
|
||||||
|
|
|
@ -129,7 +129,7 @@ public:
|
||||||
virtual void asset_selected([[maybe_unused]] std::filesystem::path path, [[maybe_unused]] AssetType type) {}
|
virtual void asset_selected([[maybe_unused]] std::filesystem::path path, [[maybe_unused]] AssetType type) {}
|
||||||
|
|
||||||
void createDockArea();
|
void createDockArea();
|
||||||
void drawViewport();
|
void drawViewport(Scene* scene);
|
||||||
void drawAssets();
|
void drawAssets();
|
||||||
|
|
||||||
// options
|
// options
|
||||||
|
@ -299,6 +299,14 @@ public:
|
||||||
|
|
||||||
int viewport_width = 1, viewport_height = 1;
|
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:
|
private:
|
||||||
void load_options();
|
void load_options();
|
||||||
void save_options();
|
void save_options();
|
||||||
|
@ -335,8 +343,6 @@ private:
|
||||||
void edit_asset_mesh(const char* name, AssetPtr<Mesh>& asset);
|
void edit_asset_mesh(const char* name, AssetPtr<Mesh>& asset);
|
||||||
void edit_asset_texture(const char* name, AssetPtr<Texture>& asset);
|
void edit_asset_texture(const char* name, AssetPtr<Texture>& asset);
|
||||||
void edit_asset_material(const char* name, AssetPtr<Material>& 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) {
|
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);
|
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 size = ImGui::GetContentRegionAvail();
|
||||||
const auto real_size = ImVec2(size.x * platform::get_window_dpi(0), size.y * platform::get_window_dpi(0));
|
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)
|
if(real_size.x <= 0 || real_size.y <= 0)
|
||||||
return;
|
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)) {
|
||||||
if(viewport_render_targets.count(window_id)) {
|
ViewportRenderTarget new_target;
|
||||||
target = viewport_render_targets[window_id];
|
new_target.target = engine->get_renderer()->allocate_render_target(real_size);
|
||||||
|
|
||||||
if(real_size.x != target->extent.width || real_size.y != target->extent.height)
|
viewport_render_targets[window_id] = new_target;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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_width = size.x;
|
||||||
viewport_height = size.y;
|
viewport_height = size.y;
|
||||||
|
|
||||||
|
@ -733,7 +736,7 @@ void CommonEditor::drawViewport() {
|
||||||
viewport_x = mouse_pos.x - real_pos.x;
|
viewport_x = mouse_pos.x - real_pos.x;
|
||||||
viewport_y = mouse_pos.y - real_pos.y;
|
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();
|
accepting_viewport_input = ImGui::IsWindowHovered();
|
||||||
|
|
||||||
|
|
|
@ -184,7 +184,7 @@ void MaterialEditor::draw(CommonEditor* editor) {
|
||||||
if(scene != nullptr) {
|
if(scene != nullptr) {
|
||||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
|
||||||
if(begin("Viewport"))
|
if(begin("Viewport"))
|
||||||
editor->drawViewport();
|
editor->drawViewport(scene);
|
||||||
|
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ void PrefabEditor::draw(CommonEditor* editor) {
|
||||||
|
|
||||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
|
||||||
if(begin("Viewport"))
|
if(begin("Viewport"))
|
||||||
editor->drawViewport();
|
editor->drawViewport(scene);
|
||||||
|
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
|
|
||||||
|
|
|
@ -177,8 +177,8 @@ void PrismEditor::open_asset(const file::Path path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrismEditor::renderEditor(GFXCommandBuffer* command_buffer) {
|
void PrismEditor::renderEditor(GFXCommandBuffer* command_buffer) {
|
||||||
for (auto& editor : editors) {
|
for(auto [id, render_target] : viewport_render_targets) {
|
||||||
//editor->renderer->render(command_buffer, editor->get_scene(), -1);
|
engine->get_renderer()->render(command_buffer, render_target.scene, *render_target.target, -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -156,7 +156,7 @@ void SceneEditor::draw(CommonEditor* editor) {
|
||||||
if(showViewport) {
|
if(showViewport) {
|
||||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
|
||||||
if(begin("Viewport", &showViewport))
|
if(begin("Viewport", &showViewport))
|
||||||
editor->drawViewport();
|
editor->drawViewport(scene);
|
||||||
|
|
||||||
ImGui::PopStyleVar();
|
ImGui::PopStyleVar();
|
||||||
|
|
||||||
|
|
Reference in a new issue