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."); 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();

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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