diff --git a/kraken/KRViewport.cpp b/kraken/KRViewport.cpp index a0dd89f..aa76b4f 100755 --- a/kraken/KRViewport.cpp +++ b/kraken/KRViewport.cpp @@ -34,6 +34,8 @@ #include "KRViewport.h" +const long KRENGINE_OCCLUSION_TEST_EXPIRY = 10; + using namespace hydra; KRViewport::KRViewport() @@ -283,7 +285,19 @@ bool KRViewport::visible(const AABB& b) const return is_visible; } - - - +void KRViewport::expireOcclusionResults(long frame) +{ + // Expire cached occlusion test results. + // Cached "failed" results are expired on the next frame (marked with .second of -1) + // Cached "success" results are expired after KRENGINE_OCCLUSION_TEST_EXPIRY frames (marked with .second of the last frame + std::set expired_visible_bounds; + for (unordered_map::iterator visible_bounds_itr = m_visibleBounds.begin(); visible_bounds_itr != m_visibleBounds.end(); visible_bounds_itr++) { + if ((*visible_bounds_itr).second == -1 || (*visible_bounds_itr).second + KRENGINE_OCCLUSION_TEST_EXPIRY < frame) { + expired_visible_bounds.insert((*visible_bounds_itr).first); + } + } + for (std::set::iterator expired_visible_bounds_itr = expired_visible_bounds.begin(); expired_visible_bounds_itr != expired_visible_bounds.end(); expired_visible_bounds_itr++) { + m_visibleBounds.erase(*expired_visible_bounds_itr); + } +} diff --git a/kraken/KRViewport.h b/kraken/KRViewport.h index 79ce33e..53e4697 100755 --- a/kraken/KRViewport.h +++ b/kraken/KRViewport.h @@ -70,6 +70,7 @@ public: bool visible(const hydra::AABB& b) const; float coverage(const hydra::AABB& b) const; + void expireOcclusionResults(long frame); private: hydra::Vector2 m_size; diff --git a/kraken/nodes/KRCamera.cpp b/kraken/nodes/KRCamera.cpp index c78d49c..8f3729e 100755 --- a/kraken/nodes/KRCamera.cpp +++ b/kraken/nodes/KRCamera.cpp @@ -179,6 +179,8 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS scene.updateOctree(m_viewport); + + m_viewport.expireOcclusionResults(getContext().getCurrentFrame()); // ----====---- Pre-stream resources ----====---- KRNode::RenderInfo ri(commandBuffer); @@ -187,13 +189,13 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_PRESTREAM); ri.surface = &compositeSurface; - scene.render(ri, true); + scene.render(ri); // ----====---- Generate Shadowmaps for Lights ----====---- if (settings.m_cShadowBuffers > 0) { GL_PUSH_GROUP_MARKER("Generate Shadowmaps"); ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_SHADOWMAP); - scene.render(ri, false /*settings.bEnableDeferredLighting*/); + scene.render(ri); GL_POP_GROUP_MARKER; } @@ -208,7 +210,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS ri.renderPass->begin(commandBuffer, compositeSurface); // Render the geometry - scene.render(ri, false); + scene.render(ri); // End render pass ri.renderPass->end(commandBuffer); @@ -234,7 +236,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS // Render the geometry ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_DEFERRED_LIGHTS); ri.renderPass->begin(commandBuffer, compositeSurface); - scene.render(ri, false); + scene.render(ri); ri.renderPass->end(commandBuffer); GL_POP_GROUP_MARKER; @@ -252,7 +254,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS // Render the geometry // TODO: At this point, we only want to render octree nodes that produced fragments during the 1st pass into the GBuffer - scene.render(ri, false); + scene.render(ri); // End render pass ri.renderPass->end(commandBuffer); @@ -267,7 +269,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS ri.renderPass->begin(commandBuffer, compositeSurface); // Render the geometry - scene.render(ri, false); + scene.render(ri); GL_POP_GROUP_MARKER; @@ -334,7 +336,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS // Render all transparent geometry ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_FORWARD_TRANSPARENT); ri.renderPass->begin(commandBuffer, compositeSurface); - scene.render(ri, false); + scene.render(ri); ri.renderPass->end(commandBuffer); GL_POP_GROUP_MARKER; @@ -346,7 +348,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_PARTICLE_OCCLUSION); if (ri.renderPass) { ri.renderPass->begin(commandBuffer, compositeSurface); - scene.render(ri, false); + scene.render(ri); ri.renderPass->end(commandBuffer); } @@ -360,7 +362,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_ADDITIVE_PARTICLES); if (ri.renderPass) { ri.renderPass->begin(commandBuffer, compositeSurface); - scene.render(ri, false); + scene.render(ri); ri.renderPass->end(commandBuffer); } @@ -395,7 +397,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE); ri.viewport = &volumetricLightingViewport; ri.renderPass->begin(commandBuffer, compositeSurface); - scene.render(ri, false); + scene.render(ri); ri.renderPass->end(commandBuffer); ri.viewport = &m_viewport; GL_POP_GROUP_MARKER; diff --git a/kraken/nodes/KRLight.cpp b/kraken/nodes/KRLight.cpp index 6da2d07..429ae66 100755 --- a/kraken/nodes/KRLight.cpp +++ b/kraken/nodes/KRLight.cpp @@ -544,7 +544,8 @@ void KRLight::renderShadowBuffers(RenderInfo& ri) ri.viewport = &m_shadowViewports[iShadow]; shadowShader->bind(ri, Matrix4()); - getScene().render(ri, true); + m_shadowViewports[iShadow].expireOcclusionResults(m_pContext->getCurrentFrame()); + getScene().render(ri); } } ri.viewport = prevViewport; diff --git a/kraken/resources/scene/KRScene.cpp b/kraken/resources/scene/KRScene.cpp index 474e336..8c2aaed 100755 --- a/kraken/resources/scene/KRScene.cpp +++ b/kraken/resources/scene/KRScene.cpp @@ -44,8 +44,6 @@ using namespace mimir; using namespace hydra; -const long KRENGINE_OCCLUSION_TEST_EXPIRY = 10; - KRScene::KRScene(KRContext& context, std::string name) : KRResource(context, name) { m_pFirstLight = NULL; @@ -103,23 +101,8 @@ std::set& KRScene::getLights() return m_lights; } -void KRScene::render(KRNode::RenderInfo& ri, bool new_frame) +void KRScene::render(KRNode::RenderInfo& ri) { - unordered_map& visibleBounds = ri.viewport->getVisibleBounds(); - if (new_frame) { - // Expire cached occlusion test results. - // Cached "failed" results are expired on the next frame (marked with .second of -1) - // Cached "success" results are expired after KRENGINE_OCCLUSION_TEST_EXPIRY frames (marked with .second of the last frame - std::set expired_visible_bounds; - for (unordered_map::iterator visible_bounds_itr = visibleBounds.begin(); visible_bounds_itr != visibleBounds.end(); visible_bounds_itr++) { - if ((*visible_bounds_itr).second == -1 || (*visible_bounds_itr).second + KRENGINE_OCCLUSION_TEST_EXPIRY < getContext().getCurrentFrame()) { - expired_visible_bounds.insert((*visible_bounds_itr).first); - } - } - for (std::set::iterator expired_visible_bounds_itr = expired_visible_bounds.begin(); expired_visible_bounds_itr != expired_visible_bounds.end(); expired_visible_bounds_itr++) { - visibleBounds.erase(*expired_visible_bounds_itr); - } - } if (getFirstLight() == NULL) { addDefaultLights(); diff --git a/kraken/resources/scene/KRScene.h b/kraken/resources/scene/KRScene.h index 2804ace..247a5ce 100755 --- a/kraken/resources/scene/KRScene.h +++ b/kraken/resources/scene/KRScene.h @@ -71,7 +71,7 @@ public: bool sphereCast(const hydra::Vector3& v0, const hydra::Vector3& v1, float radius, hydra::HitInfo& hitinfo, unsigned int layer_mask); void renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface, float deltaTime); - void render(KRNode::RenderInfo& ri, bool new_frame); + void render(KRNode::RenderInfo& ri); void updateOctree(const KRViewport& viewport); void buildOctreeForTheFirstTime();