Move pre-streaming logic from KRNode and descendants to KRScene, simplifying KRNode render methods

This commit is contained in:
2025-11-13 22:01:24 -08:00
parent 614ce0a151
commit e029e0b3fc
14 changed files with 40 additions and 41 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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<KRMeshBinding, kMeshLODCount> m_meshes;
std::array<std::vector<KRBone*>, kMeshLODCount> m_bones; // Connects model to set of bones

View File

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

View File

@@ -216,6 +216,7 @@ public:
KRScene& getScene();
virtual void preStream(const KRViewport& viewport);
virtual void render(RenderInfo& ri);
virtual void physicsUpdate(float deltaTime);

View File

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

View File

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

View File

@@ -112,9 +112,10 @@ AABB KRSprite::getBounds()
}
void KRSprite::render(RenderInfo& ri)
void KRSprite::preStream(const KRViewport& viewport)
{
if (m_lod_visible >= LOD_VISIBILITY_PRESTREAM && ri.renderPass->getType() == RenderPassType::RENDER_PASS_PRESTREAM) {
KRNode::preStream(viewport);
// Pre-stream sprites, even if the alpha is zero
m_spriteTexture.load(&getContext());
@@ -123,13 +124,12 @@ void KRSprite::render(RenderInfo& ri)
}
}
if (m_lod_visible <= LOD_VISIBILITY_PRESTREAM) return;
void KRSprite::render(RenderInfo& ri)
{
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()) {

View File

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

View File

@@ -151,8 +151,16 @@ void KRScene::render(KRNode::RenderInfo& ri)
// Render outer nodes
for (std::set<KRNode*>::iterator itr = outerNodes.begin(); itr != outerNodes.end(); itr++) {
KRNode* node = (*itr);
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<KROctreeNode*> remainingOctrees;
std::vector<KROctreeNode*> remainingOctreesTestResults;
@@ -346,8 +354,17 @@ void KRScene::render(KRNode::RenderInfo& ri, KROctreeNode* pOctreeNode, std::vec
// Render objects that are at this octree level
for (std::set<KRNode*>::iterator itr = pOctreeNode->getSceneNodes().begin(); itr != pOctreeNode->getSceneNodes().end(); itr++) {
//assert(pOctreeNode->getBounds().contains((*itr)->getBounds())); // Sanity check
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
const int* childOctreeOrder = ri.renderPass->getType() == RenderPassType::RENDER_PASS_FORWARD_TRANSPARENT || ri.renderPass->getType() == RenderPassType::RENDER_PASS_ADDITIVE_PARTICLES || ri.renderPass->getType() == RenderPassType::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE ? ri.viewport->getBackToFrontOrder() : ri.viewport->getFrontToBackOrder();