From af65c60844d499ec879d83454587be167edc9456 Mon Sep 17 00:00:00 2001 From: Emanuel Rabina Date: Mon, 6 May 2024 23:01:36 +1200 Subject: [PATCH] Fix render to screen when ImGui windows disabled --- .../redhorizon/engine/Application.groovy | 28 ++++++------------- .../engine/graphics/imgui/ImGuiLayer.groovy | 8 ++++++ .../graphics/pipeline/RenderPipeline.groovy | 14 ++++------ 3 files changed, 23 insertions(+), 27 deletions(-) diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/Application.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/Application.groovy index 5af087ee..cc13186e 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/Application.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/Application.groovy @@ -170,26 +170,16 @@ class Application implements EventTarget { engine.waitUntilStopped() // Check we closed everything - var activeFramebuffers = debugOverlay.activeFramebuffers.get() - if (activeFramebuffers > 0) { - logger.debug('Not all active framebuffers closed') - } - var activeMeshes = debugOverlay.activeMeshes.get() - if (activeMeshes > 0) { - logger.debug('Not all meshes closed, {} remaining', activeMeshes) - } - var activeTextures = debugOverlay.activeTextures.get() - if (activeMeshes > 0) { - logger.debug('Not all textures closed, {} remaining', activeTextures) - } - var activeSources = debugOverlay.activeSources.get() - if (activeMeshes > 0) { - logger.debug('Not all sources closed, {} remaining', activeSources) - } - var activeBuffers = debugOverlay.activeBuffers.get() - if (activeMeshes > 0) { - logger.debug('Not all buffers closed, {} remaining', activeBuffers) + var check = { int resourceCount, String resourceName -> + if (resourceCount > 0) { + logger.warn("Not all ${resourceName} closed, {} remaining", resourceCount) + } } + check(debugOverlay.activeFramebuffers.get(), 'framebuffers') + check(debugOverlay.activeMeshes.get(), 'meshes') + check(debugOverlay.activeTextures.get(), 'textures') + check(debugOverlay.activeSources.get(), 'sources') + check(debugOverlay.activeBuffers.get(), 'buffers') } /** diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/imgui/ImGuiLayer.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/imgui/ImGuiLayer.groovy index 532a436f..dd389738 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/imgui/ImGuiLayer.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/imgui/ImGuiLayer.groovy @@ -192,6 +192,14 @@ class ImGuiLayer implements AutoCloseable, InputSource { imGuiGl3.renderDrawData(ImGui.getDrawData()) } + /** + * Return whether or not ImGui is the render target. + */ + boolean isEnabled() { + + return drawUiElements + } + /** * Build the docking window into which the app will be rendered. */ diff --git a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/RenderPipeline.groovy b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/RenderPipeline.groovy index 158b480f..d191efff 100644 --- a/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/RenderPipeline.groovy +++ b/redhorizon-engine/source/nz/net/ultraq/redhorizon/engine/graphics/pipeline/RenderPipeline.groovy @@ -58,6 +58,7 @@ class RenderPipeline implements Closeable { private final Mesh fullScreenQuad private final List renderPasses = [] + private ScreenRenderPass screenRenderPass /** * Constructor, configure the rendering pipeline. @@ -120,11 +121,11 @@ class RenderPipeline implements Closeable { } // Final pass to emit the result to the screen - renderPasses << new ScreenRenderPass( + screenRenderPass = new ScreenRenderPass( renderer.createShader(new ScreenShader()), - !config.startWithChrome, window ) + renderPasses << screenRenderPass } /** @@ -136,6 +137,8 @@ class RenderPipeline implements Closeable { imGuiLayer.frame { -> renderer.clear() + screenRenderPass.enabled = !imGuiLayer.enabled + // Perform all rendering passes var sceneResult = renderPasses.inject(null) { lastResult, renderPass -> if (renderPass.enabled) { @@ -247,15 +250,10 @@ class RenderPipeline implements Closeable { /** * Constructor, create a basic material that covers the screen yet responds * to changes in output/window resolution. - * - * @param shader - * @param enabled - * @param window */ - ScreenRenderPass(Shader shader, boolean enabled, Window window) { + ScreenRenderPass(Shader shader, Window window) { this.shader = shader - this.enabled = enabled transform.set(calculateScreenModelMatrix(window.framebufferSize, window.targetResolution)) window.on(FramebufferSizeEvent) { event ->