diff --git a/kraken/nodes/KRAmbientZone.cpp b/kraken/nodes/KRAmbientZone.cpp index 1364043..74dfa19 100755 --- a/kraken/nodes/KRAmbientZone.cpp +++ b/kraken/nodes/KRAmbientZone.cpp @@ -123,8 +123,6 @@ void KRAmbientZone::setZone(const std::string& zone) void KRAmbientZone::render(RenderInfo& ri) { - if (m_lod_visible <= LOD_VISIBILITY_PRESTREAM) return; - KRNode::render(ri); bool bVisualize = ri.camera->settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_SIREN_AMBIENT_ZONES; diff --git a/kraken/nodes/KRAudioSource.cpp b/kraken/nodes/KRAudioSource.cpp index 00e2766..2f61566 100755 --- a/kraken/nodes/KRAudioSource.cpp +++ b/kraken/nodes/KRAudioSource.cpp @@ -192,9 +192,6 @@ void KRAudioSource::queueBuffer() void KRAudioSource::render(RenderInfo& ri) { - - if (m_lod_visible <= LOD_VISIBILITY_PRESTREAM) return; - KRNode::render(ri); bool bVisualize = false; diff --git a/kraken/nodes/KRBone.cpp b/kraken/nodes/KRBone.cpp index 33a6471..132012f 100755 --- a/kraken/nodes/KRBone.cpp +++ b/kraken/nodes/KRBone.cpp @@ -75,8 +75,6 @@ AABB KRBone::getBounds() void KRBone::render(RenderInfo& ri) { - if (m_lod_visible <= LOD_VISIBILITY_PRESTREAM) return; - KRNode::render(ri); bool bVisualize = ri.camera->settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_BONES; diff --git a/kraken/nodes/KRCollider.cpp b/kraken/nodes/KRCollider.cpp index 0bc4397..1543e46 100755 --- a/kraken/nodes/KRCollider.cpp +++ b/kraken/nodes/KRCollider.cpp @@ -210,8 +210,6 @@ void KRCollider::setAudioOcclusion(float audio_occlusion) void KRCollider::render(RenderInfo& ri) { - if (m_lod_visible <= LOD_VISIBILITY_PRESTREAM) return; - KRNode::render(ri); if (ri.renderPass->getType() == RenderPassType::RENDER_PASS_FORWARD_TRANSPARENT && ri.camera->settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_COLLIDERS) { diff --git a/kraken/nodes/KRLight.cpp b/kraken/nodes/KRLight.cpp index 16ebbf0..15d9d23 100755 --- a/kraken/nodes/KRLight.cpp +++ b/kraken/nodes/KRLight.cpp @@ -223,9 +223,6 @@ float KRLight::getDecayStart() const void KRLight::render(RenderInfo& ri) { - - if (m_lod_visible <= LOD_VISIBILITY_PRESTREAM) return; - KRNode::render(ri); ri.reflectedObjects.push_back(this); diff --git a/kraken/nodes/KRModel.cpp b/kraken/nodes/KRModel.cpp index bda65eb..4dc840f 100755 --- a/kraken/nodes/KRModel.cpp +++ b/kraken/nodes/KRModel.cpp @@ -254,13 +254,6 @@ void KRModel::loadModel() void KRModel::render(KRNode::RenderInfo& ri) { - if (ri.renderPass->getType() == RenderPassType::RENDER_PASS_PRESTREAM) { - if (m_lod_visible >= LOD_VISIBILITY_PRESTREAM) { - preStream(*ri.viewport); - } - } - if (m_lod_visible <= LOD_VISIBILITY_PRESTREAM) return; - ri.reflectedObjects.push_back(this); KRNode::render(ri); @@ -328,6 +321,7 @@ void KRModel::render(KRNode::RenderInfo& ri) void KRModel::preStream(const KRViewport& viewport) { + KRNode::preStream(viewport); loadModel(); float lod_coverage = viewport.coverage(getBounds()); diff --git a/kraken/nodes/KRModel.h b/kraken/nodes/KRModel.h index ca04e51..c2d03d6 100755 --- a/kraken/nodes/KRModel.h +++ b/kraken/nodes/KRModel.h @@ -63,6 +63,7 @@ public: virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent); virtual void render(KRNode::RenderInfo& ri) override; + virtual void preStream(const KRViewport& viewport) override; virtual hydra::AABB getBounds(); @@ -77,7 +78,6 @@ public: virtual kraken_stream_level getStreamLevel(const KRViewport& viewport); private: - void preStream(const KRViewport& viewport); std::array m_meshes; std::array, kMeshLODCount> m_bones; // Connects model to set of bones diff --git a/kraken/nodes/KRNode.cpp b/kraken/nodes/KRNode.cpp index b17ed39..15be250 100755 --- a/kraken/nodes/KRNode.cpp +++ b/kraken/nodes/KRNode.cpp @@ -684,10 +684,13 @@ KRNode* KRNode::LoadXML(KRScene& scene, tinyxml2::XMLElement* e) return new_node; } +void KRNode::preStream(const KRViewport& viewport) +{ + +} + void KRNode::render(RenderInfo& ri) { - if (m_lod_visible <= LOD_VISIBILITY_PRESTREAM) return; - m_lastRenderFrame = getContext().getCurrentFrame(); } diff --git a/kraken/nodes/KRNode.h b/kraken/nodes/KRNode.h index 6989c46..b6ad220 100755 --- a/kraken/nodes/KRNode.h +++ b/kraken/nodes/KRNode.h @@ -216,6 +216,7 @@ public: KRScene& getScene(); + virtual void preStream(const KRViewport& viewport); virtual void render(RenderInfo& ri); virtual void physicsUpdate(float deltaTime); diff --git a/kraken/nodes/KRParticleSystemNewtonian.cpp b/kraken/nodes/KRParticleSystemNewtonian.cpp index ce6a6bf..d715ca6 100755 --- a/kraken/nodes/KRParticleSystemNewtonian.cpp +++ b/kraken/nodes/KRParticleSystemNewtonian.cpp @@ -82,9 +82,6 @@ bool KRParticleSystemNewtonian::hasPhysics() void KRParticleSystemNewtonian::render(RenderInfo& ri) { - - if (m_lod_visible <= LOD_VISIBILITY_PRESTREAM) return; - ri.reflectedObjects.push_back(this); KRNode::render(ri); diff --git a/kraken/nodes/KRReverbZone.cpp b/kraken/nodes/KRReverbZone.cpp index 37e76e7..f276b56 100755 --- a/kraken/nodes/KRReverbZone.cpp +++ b/kraken/nodes/KRReverbZone.cpp @@ -121,8 +121,6 @@ void KRReverbZone::setZone(const std::string& zone) void KRReverbZone::render(RenderInfo& ri) { - if (m_lod_visible <= LOD_VISIBILITY_PRESTREAM) return; - KRNode::render(ri); bool bVisualize = ri.camera->settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_SIREN_REVERB_ZONES; diff --git a/kraken/nodes/KRSprite.cpp b/kraken/nodes/KRSprite.cpp index 3828b53..605b58c 100755 --- a/kraken/nodes/KRSprite.cpp +++ b/kraken/nodes/KRSprite.cpp @@ -112,24 +112,24 @@ AABB KRSprite::getBounds() } +void KRSprite::preStream(const KRViewport& viewport) +{ + KRNode::preStream(viewport); + + // Pre-stream sprites, even if the alpha is zero + m_spriteTexture.load(&getContext()); + + if (m_spriteTexture.isLoaded()) { + m_spriteTexture.get()->resetPoolExpiry(0.0f, KRTexture::TEXTURE_USAGE_SPRITE); + } +} + void KRSprite::render(RenderInfo& ri) { - if (m_lod_visible >= LOD_VISIBILITY_PRESTREAM && ri.renderPass->getType() == RenderPassType::RENDER_PASS_PRESTREAM) { - // Pre-stream sprites, even if the alpha is zero - m_spriteTexture.load(&getContext()); - - if (m_spriteTexture.isLoaded()) { - m_spriteTexture.get()->resetPoolExpiry(0.0f, KRTexture::TEXTURE_USAGE_SPRITE); - } - } - - if (m_lod_visible <= LOD_VISIBILITY_PRESTREAM) return; - ri.reflectedObjects.push_back(this); KRNode::render(ri); - if (ri.renderPass->getType() == RenderPassType::RENDER_PASS_ADDITIVE_PARTICLES) { if (m_spriteAlpha > 0.0f) { if (m_spriteTexture.isLoaded()) { diff --git a/kraken/nodes/KRSprite.h b/kraken/nodes/KRSprite.h index 69e3d8e..7d75a20 100755 --- a/kraken/nodes/KRSprite.h +++ b/kraken/nodes/KRSprite.h @@ -52,6 +52,7 @@ public: void setSpriteAlpha(float alpha); float getSpriteAlpha() const; + virtual void preStream(const KRViewport& viewport) override; virtual void render(RenderInfo& ri) override; virtual hydra::AABB getBounds() override; diff --git a/kraken/resources/scene/KRScene.cpp b/kraken/resources/scene/KRScene.cpp index 4af4915..0130909 100755 --- a/kraken/resources/scene/KRScene.cpp +++ b/kraken/resources/scene/KRScene.cpp @@ -151,7 +151,15 @@ void KRScene::render(KRNode::RenderInfo& ri) // Render outer nodes for (std::set::iterator itr = outerNodes.begin(); itr != outerNodes.end(); itr++) { KRNode* node = (*itr); - node->render(ri); + if (ri.renderPass->getType() == RenderPassType::RENDER_PASS_PRESTREAM) { + if ((*itr)->getLODVisibility() >= KRNode::LOD_VISIBILITY_PRESTREAM) { + node->preStream(*ri.viewport); + } + } else { + if ((*itr)->getLODVisibility() > KRNode::LOD_VISIBILITY_PRESTREAM) { + node->render(ri); + } + } } std::vector remainingOctrees; @@ -346,7 +354,16 @@ void KRScene::render(KRNode::RenderInfo& ri, KROctreeNode* pOctreeNode, std::vec // Render objects that are at this octree level for (std::set::iterator itr = pOctreeNode->getSceneNodes().begin(); itr != pOctreeNode->getSceneNodes().end(); itr++) { //assert(pOctreeNode->getBounds().contains((*itr)->getBounds())); // Sanity check - (*itr)->render(ri); + if (ri.renderPass->getType() == RenderPassType::RENDER_PASS_PRESTREAM) { + if ((*itr)->getLODVisibility() >= KRNode::LOD_VISIBILITY_PRESTREAM) { + (*itr)->preStream(*ri.viewport); + } + } else { + if ((*itr)->getLODVisibility() > KRNode::LOD_VISIBILITY_PRESTREAM) + { + (*itr)->render(ri); + } + } } // Render child octrees