Streamlined resource handling in Pre-Stream with KRResourceBinding::submitRequest

This commit is contained in:
2025-11-17 00:55:50 -08:00
parent 61cc889880
commit b146886691
15 changed files with 93 additions and 81 deletions

View File

@@ -33,14 +33,16 @@
#include "KRResourceBinding.h"
#include "KRContext.h"
KRResourceBinding::KRResourceBinding(const std::string& name)
KRResourceBinding::KRResourceBinding(const std::string& name, uint64_t usage)
: m_name(name)
, m_resource(nullptr)
, m_usage(usage)
{
}
KRResourceBinding::KRResourceBinding()
KRResourceBinding::KRResourceBinding(uint64_t usage)
: m_resource(nullptr)
, m_usage(usage)
{
}
@@ -50,6 +52,14 @@ KRResourceBinding::~KRResourceBinding()
m_name.clear();
}
void KRResourceBinding::submitRequest(KRContext* context, std::list<KRResourceRequest>& resourceRequests, float lodCoverage)
{
bind(context);
if (isBound()) {
resourceRequests.emplace_back(get(), m_usage, lodCoverage);
}
}
KRResource* KRResourceBinding::get()
{
return m_resource;

View File

@@ -33,6 +33,7 @@
#include "KREngine-common.h"
#include "KRContextObject.h"
#include "KRResourceRequest.h"
class KRResource;
class KRContext;
@@ -40,10 +41,12 @@ class KRContext;
class KRResourceBinding
{
public:
KRResourceBinding(const std::string& name);
KRResourceBinding();
KRResourceBinding(const std::string& name, uint64_t usage);
KRResourceBinding(uint64_t usage);
~KRResourceBinding();
void submitRequest(KRContext* context, std::list<KRResourceRequest>& resourceRequests, float lodCoverage = 0.f);
KRResource* get();
void set(KRResource* resource);
void set(const std::string& name);
@@ -58,4 +61,5 @@ public:
protected:
KRResource* m_resource;
std::string m_name;
uint64_t m_usage;
};

View File

@@ -37,14 +37,15 @@ class KRResource;
class KRResourceRequest
{
public:
KRResourceRequest(KRResource* resource, uint32_t usage, float lodCoverage = 0.0f)
KRResourceRequest(KRResource* resource, uint64_t usage, float lodCoverage = 0.0f)
: resource(resource)
, usage(usage)
, coverage(static_cast<uint8_t>(KRCLAMP(lodCoverage / 1.0f * 255.f, 0, 255.f)))
{
}
KRResource* resource;
unsigned int usage : 24;
uint64_t usage : 56;
uint8_t coverage : 8;
};

View File

@@ -36,6 +36,17 @@
#include "KRAudioSample.h"
#include "KRAudioManager.h"
KRAudioSampleBinding::KRAudioSampleBinding()
: KRResourceBinding(0)
{
}
KRAudioSampleBinding::KRAudioSampleBinding(const std::string& name)
: KRResourceBinding(name, 0)
{
}
KRAudioSample* KRAudioSampleBinding::get()
{

View File

@@ -39,6 +39,8 @@ class KRAudioSample;
class KRAudioSampleBinding : public KRResourceBinding
{
public:
KRAudioSampleBinding();
KRAudioSampleBinding(const std::string& name);
KRAudioSample* get();
bool bind(KRContext* context) override final;

View File

@@ -40,7 +40,14 @@
using namespace mimir;
using namespace hydra;
KRMaterial::KRMaterial(KRContext& context, const char* szName) : KRResource(context, szName)
KRMaterial::KRMaterial(KRContext& context, const char* szName)
: KRResource(context, szName)
, m_ambientMap(KRTextureBinding(KRTexture::TEXTURE_USAGE_AMBIENT_MAP))
, m_diffuseMap(KRTexture::TEXTURE_USAGE_DIFFUSE_MAP)
, m_specularMap(KRTexture::TEXTURE_USAGE_NORMAL_MAP)
, m_reflectionMap(KRTexture::TEXTURE_USAGE_REFLECTION_MAP)
, m_reflectionCube(KRTexture::TEXTURE_USAGE_REFECTION_CUBE)
, m_normalMap(KRTexture::TEXTURE_USAGE_NORMAL_MAP)
{
m_name = szName;
m_ambientColor = Vector3::Zero();
@@ -230,40 +237,18 @@ bool KRMaterial::isTransparent()
void KRMaterial::preStream(std::list<KRResourceRequest>& resourceRequests, float lodCoverage)
{
getTextures();
if (m_ambientMap.isBound()) {
resourceRequests.emplace_back(m_ambientMap.get(), KRTexture::TEXTURE_USAGE_AMBIENT_MAP);
}
if (m_diffuseMap.isBound()) {
resourceRequests.emplace_back(m_diffuseMap.get(), KRTexture::TEXTURE_USAGE_DIFFUSE_MAP);
}
if (m_normalMap.isBound()) {
resourceRequests.emplace_back(m_normalMap.get(), KRTexture::TEXTURE_USAGE_NORMAL_MAP);
}
if (m_specularMap.isBound()) {
resourceRequests.emplace_back(m_specularMap.get(), KRTexture::TEXTURE_USAGE_SPECULAR_MAP);
}
if (m_reflectionMap.isBound()) {
resourceRequests.emplace_back(m_reflectionMap.get(), KRTexture::TEXTURE_USAGE_REFLECTION_MAP);
}
if (m_reflectionCube.isBound()) {
resourceRequests.emplace_back(m_reflectionCube.get(), KRTexture::TEXTURE_USAGE_REFECTION_CUBE);
}
m_ambientMap.submitRequest(&getContext(), resourceRequests, lodCoverage);
m_diffuseMap.submitRequest(&getContext(), resourceRequests, lodCoverage);
m_normalMap.submitRequest(&getContext(), resourceRequests, lodCoverage);
m_specularMap.submitRequest(&getContext(), resourceRequests, lodCoverage);
m_reflectionMap.submitRequest(&getContext(), resourceRequests, lodCoverage);
m_reflectionCube.submitRequest(&getContext(), resourceRequests, lodCoverage);
}
kraken_stream_level KRMaterial::getStreamLevel()
{
kraken_stream_level stream_level = kraken_stream_level::STREAM_LEVEL_IN_HQ;
getTextures();
if (m_ambientMap.isBound()) {
stream_level = KRMIN(stream_level, m_ambientMap.get()->getStreamLevel());
}
@@ -291,22 +276,10 @@ kraken_stream_level KRMaterial::getStreamLevel()
return stream_level;
}
void KRMaterial::getTextures()
{
m_ambientMap.bind(&getContext());
m_diffuseMap.bind(&getContext());
m_normalMap.bind(&getContext());
m_specularMap.bind(&getContext());
m_reflectionMap.bind(&getContext());
m_reflectionCube.bind(&getContext());
}
void KRMaterial::bind(KRNode::RenderInfo& ri, ModelFormat modelFormat, __uint32_t vertexAttributes, CullMode cullMode, const std::vector<KRBone*>& bones, const std::vector<Matrix4>& bind_poses, const Matrix4& matModel, KRTexture* pLightMap, float lod_coverage)
{
bool bLightMap = pLightMap && ri.camera->settings.bEnableLightMap;
getTextures();
Vector2 default_scale = Vector2::One();
Vector2 default_offset = Vector2::Zero();

View File

@@ -134,8 +134,6 @@ private:
alpha_mode_type m_alpha_mode;
void getTextures();
private:
bool getShaderValue(ShaderValue value, float* output) const final;
bool getShaderValue(ShaderValue value, hydra::Vector2* output) const final;

View File

@@ -34,6 +34,18 @@
#include "KRMesh.h"
#include "KRMeshBinding.h"
KRMeshBinding::KRMeshBinding()
: KRResourceBinding(0)
{
}
KRMeshBinding::KRMeshBinding(const std::string& name)
: KRResourceBinding(name, 0)
{
}
KRMesh* KRMeshBinding::get()
{
return static_cast<KRMesh*>(m_resource);

View File

@@ -39,6 +39,8 @@ class KRMesh;
class KRMeshBinding : public KRResourceBinding
{
public:
KRMeshBinding();
KRMeshBinding(const std::string& name);
KRMesh* get();
bool bind(KRContext* context) override final;

View File

@@ -34,6 +34,18 @@
#include "KRTexture.h"
#include "KRTextureBinding.h"
KRTextureBinding::KRTextureBinding(const std::string& name, KRTexture::texture_usage_t usage)
: KRResourceBinding(name, static_cast<uint64_t>(usage))
{
}
KRTextureBinding::KRTextureBinding(KRTexture::texture_usage_t usage)
: KRResourceBinding(static_cast<uint64_t>(usage))
{
}
KRTexture* KRTextureBinding::get()
{
return static_cast<KRTexture*>(m_resource);

View File

@@ -33,12 +33,15 @@
#include "KREngine-common.h"
#include "resources/KRResourceBinding.h"
#include "resources/texture/KRTexture.h"
class KRTexture;
class KRTextureBinding : public KRResourceBinding
{
public:
KRTextureBinding(const std::string& name, KRTexture::texture_usage_t usage);
KRTextureBinding(KRTexture::texture_usage_t usage);
KRTexture* get();
bool bind(KRContext* context) override final;