Implemented getResourceBindings methods to recursively collect resource bindings from nodes and resource-to-resource connections. Replaced many KRNode::preStream() overrides with a generic handler in KRNode::preStream() that walks the resource binding tree.

This commit is contained in:
2025-11-17 19:40:51 -08:00
parent b146886691
commit 9b20d1ef1d
19 changed files with 307 additions and 157 deletions

View File

@@ -146,12 +146,12 @@ const std::string KRCamera::getSkyBox() const
return m_skyBox.getName();
}
void KRCamera::preStream(const KRViewport& viewport, std::list<KRResourceRequest>& resourceRequests)
void KRCamera::getResourceBindings(std::list<KRResourceBinding*>& bindings)
{
KRNode::preStream(viewport, resourceRequests);
KRNode::getResourceBindings(bindings);
m_skyBox.submitRequest(&getContext(), resourceRequests);
m_fontTexture.submitRequest(&getContext(), resourceRequests);
bindings.push_back(&m_skyBox);
bindings.push_back(&m_fontTexture);
}
void KRCamera::render(KRNode::RenderInfo& ri)

View File

@@ -61,7 +61,7 @@ public:
void renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeSurface, KRRenderGraph& renderGraph);
void preStream(const KRViewport& viewport, std::list<KRResourceRequest>& resourceRequests) final;
void getResourceBindings(std::list<KRResourceBinding*>& bindings) final;
void render(KRNode::RenderInfo& ri) final;
KRRenderSettings settings;

View File

@@ -223,12 +223,11 @@ float KRLight::getDecayStart() const
return m_decayStart;
}
void KRLight::preStream(const KRViewport& viewport, std::list<KRResourceRequest>& resourceRequests)
void KRLight::getResourceBindings(std::list<KRResourceBinding*>& bindings)
{
KRNode::preStream(viewport, resourceRequests);
KRNode::getResourceBindings(bindings);
// Pre-stream sprites, even if the alpha is zero
m_flareTexture.submitRequest(&getContext(), resourceRequests);
bindings.push_back(&m_flareTexture);
}
void KRLight::render(RenderInfo& ri)

View File

@@ -65,7 +65,7 @@ public:
void setFlareOcclusionSize(float occlusion_size);
void deleteBuffers();
virtual void preStream(const KRViewport& viewport, std::list<KRResourceRequest>& resourceRequests) override;
virtual void getResourceBindings(std::list<KRResourceBinding*>& bindings) override;
virtual void render(RenderInfo& ri) override;
int getShadowBufferCount();

View File

@@ -306,20 +306,29 @@ void KRModel::render(KRNode::RenderInfo& ri)
}
}
void KRModel::getResourceBindings(std::list<KRResourceBinding*>& bindings)
{
KRNode::getResourceBindings(bindings);
for (int i = 0; i < kMeshLODCount; i++) {
bindings.push_back(&m_meshes[i]);
}
bindings.push_back(&m_lightMap);
}
void KRModel::preStream(const KRViewport& viewport, std::list<KRResourceRequest>& resourceRequests)
{
KRNode::preStream(viewport, resourceRequests);
loadModel();
float lod_coverage = viewport.coverage(getBounds());
for (int i = 0; i < kMeshLODCount; i++) {
m_meshes[i].submitRequest(&getContext(), resourceRequests, lod_coverage);
if (m_meshes[i].isBound()) {
m_meshes[i].get()->preStream();
}
}
m_lightMap.submitRequest(&getContext(), resourceRequests);
}
kraken_stream_level KRModel::getStreamLevel(const KRViewport& viewport)
{
kraken_stream_level stream_level = KRNode::getStreamLevel(viewport);

View File

@@ -63,6 +63,7 @@ public:
virtual tinyxml2::XMLElement* saveXML(tinyxml2::XMLNode* parent);
virtual void render(KRNode::RenderInfo& ri) override;
virtual void getResourceBindings(std::list<KRResourceBinding*>& bindings) override;
virtual void preStream(const KRViewport& viewport, std::list<KRResourceRequest>& resourceRequests) override;
virtual hydra::AABB getBounds();

View File

@@ -685,6 +685,28 @@ KRNode* KRNode::LoadXML(KRScene& scene, tinyxml2::XMLElement* e)
}
void KRNode::preStream(const KRViewport& viewport, std::list<KRResourceRequest>& resourceRequests)
{
float lod_coverage = viewport.coverage(getBounds());
// Walk through the resource tree recursively, submitting a resource request for each
// resource that is bound
std::list<KRResourceBinding*> bindings[2];
getResourceBindings(bindings[0]);
int bufferRead = 0;
while (!bindings[bufferRead].empty()) {
int bufferWrite = bufferRead ? 0 : 1;
for (KRResourceBinding* binding : bindings[bufferRead]) {
binding->submitRequest(&getContext(), resourceRequests, lod_coverage);
if (binding->isBound()) {
binding->get()->getResourceBindings(bindings[bufferWrite]);
}
}
bindings[bufferRead].clear();
bufferRead = bufferWrite;
}
}
void KRNode::getResourceBindings(std::list<KRResourceBinding*>& bindings)
{
}

View File

@@ -52,6 +52,7 @@ class KRTextureManager;
class KRContext;
class KRScene;
class KRSurface;
class KRResourceBinding;
class KRNode;
class KRPointLight;
@@ -218,6 +219,7 @@ public:
KRScene& getScene();
virtual void preStream(const KRViewport& viewport, std::list<KRResourceRequest>& resourceRequests);
virtual void getResourceBindings(std::list<KRResourceBinding*>& bindings);
virtual void render(RenderInfo& ri);
virtual void physicsUpdate(float deltaTime);

View File

@@ -113,13 +113,11 @@ AABB KRSprite::getBounds()
return AABB::Create(-Vector3::One() * 0.5f, Vector3::One() * 0.5f, getModelMatrix());
}
void KRSprite::preStream(const KRViewport& viewport, std::list<KRResourceRequest>& resourceRequests)
void KRSprite::getResourceBindings(std::list<KRResourceBinding*>& bindings)
{
KRNode::preStream(viewport, resourceRequests);
KRNode::getResourceBindings(bindings);
// Pre-stream sprites, even if the alpha is zero
m_spriteTexture.submitRequest(&getContext(), resourceRequests);
bindings.push_back(&m_spriteTexture);
}
void KRSprite::render(RenderInfo& ri)

View File

@@ -52,7 +52,7 @@ public:
void setSpriteAlpha(float alpha);
float getSpriteAlpha() const;
virtual void preStream(const KRViewport& viewport, std::list<KRResourceRequest>& resourceRequests) override;
virtual void getResourceBindings(std::list<KRResourceBinding*>& bindings) override;
virtual void render(RenderInfo& ri) override;
virtual hydra::AABB getBounds() override;