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:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user