All material attributes are now exposed for shader reflection
Some checks failed
CMake on multiple platforms / build (Release, cl, cl, windows-latest) (push) Has been cancelled
CMake on multiple platforms / build (Release, clang, clang++, macos-latest) (push) Has been cancelled
CMake on multiple platforms / build (Release, clang, clang++, ubuntu-latest) (push) Has been cancelled
CMake on multiple platforms / build (Release, gcc, g++, ubuntu-latest) (push) Has been cancelled

This commit is contained in:
2026-05-06 23:39:18 -07:00
parent b68a056011
commit 1769850927
4 changed files with 313 additions and 28 deletions

View File

@@ -241,6 +241,11 @@ bool KRReflectedObject::getShaderValue(ShaderValue value, ShaderValueType type,
} }
} }
bool KRReflectedObject::getShaderValue(ShaderValue value, bool* output) const
{
return false;
}
bool KRReflectedObject::getShaderValue(ShaderValue value, int32_t* output) const bool KRReflectedObject::getShaderValue(ShaderValue value, int32_t* output) const
{ {
return false; return false;
@@ -290,3 +295,8 @@ bool KRReflectedObject::getShaderValue(ShaderValue value, hydra::Matrix4* output
{ {
return false; return false;
} }
bool KRReflectedObject::getShaderValue(ShaderValue value, KRResourceBinding* output) const
{
return false;
}

View File

@@ -35,6 +35,8 @@
#include <map> #include <map>
#include "hydra.h" #include "hydra.h"
class KRResourceBinding;
enum class ShaderValueType : uint8_t enum class ShaderValueType : uint8_t
{ {
type_null = 0, type_null = 0,
@@ -218,6 +220,7 @@ class KRReflectedObject
public: public:
bool getShaderValue(ShaderValue value, ShaderValueType type, void* output) const; bool getShaderValue(ShaderValue value, ShaderValueType type, void* output) const;
protected: protected:
virtual bool getShaderValue(ShaderValue value, bool* output) const;
virtual bool getShaderValue(ShaderValue value, int32_t* output) const; virtual bool getShaderValue(ShaderValue value, int32_t* output) const;
virtual bool getShaderValue(ShaderValue value, int64_t* output) const; virtual bool getShaderValue(ShaderValue value, int64_t* output) const;
virtual bool getShaderValue(ShaderValue value, float* output) const; virtual bool getShaderValue(ShaderValue value, float* output) const;
@@ -228,5 +231,6 @@ protected:
virtual bool getShaderValue(ShaderValue value, hydra::Matrix2* output) const; virtual bool getShaderValue(ShaderValue value, hydra::Matrix2* output) const;
virtual bool getShaderValue(ShaderValue value, hydra::Matrix2x3* output) const; virtual bool getShaderValue(ShaderValue value, hydra::Matrix2x3* output) const;
virtual bool getShaderValue(ShaderValue value, hydra::Matrix4* output) const; virtual bool getShaderValue(ShaderValue value, hydra::Matrix4* output) const;
virtual bool getShaderValue(ShaderValue value, KRResourceBinding* output) const;
}; };

View File

@@ -730,9 +730,98 @@ void KRMaterial::bind(KRNode::RenderInfo& ri, ModelFormat modelFormat, __uint32_
bool KRMaterial::getShaderValue(ShaderValue value, float* output) const bool KRMaterial::getShaderValue(ShaderValue value, float* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::material_baseColor_map_rotation:
*output = m_baseColorMap.rotation;
return true;
case ShaderValue::material_normal_map_rotation:
*output = m_normalMap.rotation;
return true;
case ShaderValue::material_normal_scale:
*output = m_normalScale;
return true;
case ShaderValue::material_emissive_map_rotation:
*output = m_emissiveMap.rotation;
return true;
case ShaderValue::material_occlusion_map_rotation:
*output = m_occlusionMap.rotation;
return true;
case ShaderValue::material_occlusion_strength:
*output = m_occlusionStrength;
return true;
case ShaderValue::material_metalicRoughness_map_rotation:
*output = m_metalicRoughnessMap.rotation;
return true;
case ShaderValue::material_metalic_factor:
*output = m_metalicFactor;
return true;
case ShaderValue::material_roughness_factor: case ShaderValue::material_roughness_factor:
*output = m_roughnessFactor; *output = m_roughnessFactor;
return true; return true;
case ShaderValue::material_alphaMode:
*output = m_alphaMode;
return true;
case ShaderValue::material_alphaCutoff:
*output = m_alphaCutoff;
return true;
case ShaderValue::material_ior:
*output = m_ior;
return true;
case ShaderValue::material_anisotropy_map_rotation:
*output = m_anisotropyMap.rotation;
return true;
case ShaderValue::material_anisotropy_strength:
*output = m_anisotropyStrength;
return true;
case ShaderValue::material_anisotropy_rotation:
*output = m_anisotropyRotation;
return true;
case ShaderValue::material_clearcoat_map_rotation:
*output = m_clearcoatMap.rotation;
return true;
case ShaderValue::material_clearcoat_factor:
*output = m_clearcoatFactor;
return true;
case ShaderValue::material_clearcoatRoughness_map_rotation:
*output = m_clearcoatRoughnessMap.rotation;
return true;
case ShaderValue::material_clearcoatRoughness_factor:
*output = m_clearcoatRoughnessFactor;
return true;
case ShaderValue::material_clearcoatNormal_map_rotation:
*output = m_clearcoatNormalMap.rotation;
return true;
case ShaderValue::material_clearcoatNormal_scale:
*output = m_clearcoatNormalScale;
return true;
case ShaderValue::material_dispersion:
*output = m_dispersion;
return true;
case ShaderValue::material_specular_map_rotation:
*output = m_specularMap.rotation;
return true;
case ShaderValue::material_specular_factor:
*output = m_specularFactor;
return true;
case ShaderValue::material_specularColor_map_rotation:
*output = m_specularColorMap.rotation;
return true;
case ShaderValue::material_thickness_map_rotation:
*output = m_thicknessMap.rotation;
return true;
case ShaderValue::material_thickness_factor:
*output = m_thicknessFactor;
return true;
case ShaderValue::material_attenuationDistance:
*output = m_attenuationDistance;
return true;
case ShaderValue::material_transmission_map_rotation:
*output = m_transmissionMap.rotation;
return true;
case ShaderValue::material_transmission_factor:
*output = m_transmissionFactor;
return true;
default:
return false;
} }
return false; return false;
} }
@@ -743,21 +832,83 @@ bool KRMaterial::getShaderValue(ShaderValue value, hydra::Vector2* output) const
case ShaderValue::material_baseColor_map_scale: case ShaderValue::material_baseColor_map_scale:
*output = m_baseColorMap.scale; *output = m_baseColorMap.scale;
return true; return true;
case ShaderValue::material_specularColor_map_scale: case ShaderValue::material_baseColor_map_offset:
*output = m_specularColorMap.scale; *output = m_baseColorMap.offset;
return true; return true;
case ShaderValue::material_normal_map_scale: case ShaderValue::material_normal_map_scale:
*output = m_normalMap.scale; *output = m_normalMap.scale;
return true; return true;
case ShaderValue::material_baseColor_map_offset: case ShaderValue::material_normal_map_offset:
*output = m_baseColorMap.offset; *output = m_normalMap.offset;
return true;
case ShaderValue::material_emissive_map_scale:
*output = m_emissiveMap.scale;
return true;
case ShaderValue::material_emissive_map_offset:
*output = m_emissiveMap.offset;
return true;
case ShaderValue::material_occlusion_map_scale:
*output = m_occlusionMap.scale;
return true;
case ShaderValue::material_occlusion_map_offset:
*output = m_occlusionMap.offset;
return true;
case ShaderValue::material_metalicRoughness_map_scale:
*output = m_metalicRoughnessMap.scale;
return true;
case ShaderValue::material_metalicRoughness_map_offset:
*output = m_metalicRoughnessMap.offset;
return true;
case ShaderValue::material_anisotropy_map_scale:
*output = m_anisotropyMap.scale;
return true;
case ShaderValue::material_anisotropy_map_offset:
*output = m_anisotropyMap.offset;
return true;
case ShaderValue::material_clearcoat_map_scale:
*output = m_clearcoatMap.scale;
return true;
case ShaderValue::material_clearcoat_map_offset:
*output = m_clearcoatMap.offset;
return true;
case ShaderValue::material_clearcoatRoughness_map_scale:
*output = m_clearcoatRoughnessMap.scale;
return true;
case ShaderValue::material_clearcoatRoughness_map_offset:
*output = m_clearcoatRoughnessMap.offset;
return true;
case ShaderValue::material_clearcoatNormal_map_scale:
*output = m_clearcoatNormalMap.scale;
return true;
case ShaderValue::material_clearcoatNormal_map_offset:
*output = m_clearcoatNormalMap.offset;
return true;
case ShaderValue::material_specular_map_scale:
*output = m_specularMap.scale;
return true;
case ShaderValue::material_specular_map_offset:
*output = m_specularMap.offset;
return true;
case ShaderValue::material_specularColor_map_scale:
*output = m_specularColorMap.scale;
return true; return true;
case ShaderValue::material_specularColor_map_offset: case ShaderValue::material_specularColor_map_offset:
*output = m_specularColorMap.offset; *output = m_specularColorMap.offset;
return true; return true;
case ShaderValue::material_normal_map_offset: case ShaderValue::material_thickness_map_scale:
*output = m_normalMap.offset; *output = m_thicknessMap.scale;
return true; return true;
case ShaderValue::material_thickness_map_offset:
*output = m_thicknessMap.offset;
return true;
case ShaderValue::material_transmission_map_scale:
*output = m_transmissionMap.scale;
return true;
case ShaderValue::material_transmission_map_offset:
*output = m_transmissionMap.offset;
return true;
default:
return false;
} }
return false; return false;
} }
@@ -765,9 +916,17 @@ bool KRMaterial::getShaderValue(ShaderValue value, hydra::Vector2* output) const
bool KRMaterial::getShaderValue(ShaderValue value, hydra::Vector3* output) const bool KRMaterial::getShaderValue(ShaderValue value, hydra::Vector3* output) const
{ {
switch (value) { switch (value) {
case ShaderValue::material_emissive_factor:
*output = m_emissiveFactor;
return true;
case ShaderValue::material_specularColor_factor: case ShaderValue::material_specularColor_factor:
*output = m_specularColorFactor; *output = m_specularColorFactor;
return true; return true;
case ShaderValue::material_attenuationColor:
*output = m_attenuationColor;
return true;
default:
return false;
} }
return false; return false;
} }
@@ -778,6 +937,115 @@ bool KRMaterial::getShaderValue(ShaderValue value, hydra::Vector4* output) const
case ShaderValue::material_baseColor_factor: case ShaderValue::material_baseColor_factor:
*output = m_baseColorFactor; *output = m_baseColorFactor;
return true; return true;
} default:
return false; return false;
}
}
bool KRMaterial::getShaderValue(ShaderValue value, KRResourceBinding* output) const
{
switch (value) {
case ShaderValue::material_baseColor_map_texture:
*output = m_baseColorMap.texture;
return true;
case ShaderValue::material_normal_map_texture:
*output = m_normalMap.texture;
return true;
case ShaderValue::material_emissive_map_texture:
*output = m_emissiveMap.texture;
return true;
case ShaderValue::material_anisotropy_map_texture:
*output = m_anisotropyMap.texture;
return true;
case ShaderValue::material_occlusion_map_texture:
*output = m_occlusionMap.texture;
return true;
case ShaderValue::material_metalicRoughness_map_texture:
*output = m_metalicRoughnessMap.texture;
return true;
case ShaderValue::material_specular_map_texture:
*output = m_specularMap.texture;
return true;
case ShaderValue::material_specularColor_map_texture:
*output = m_specularColorMap.texture;
return true;
case ShaderValue::material_clearcoat_map_texture:
*output = m_clearcoatMap.texture;
return true;
case ShaderValue::material_clearcoatRoughness_map_texture:
*output = m_clearcoatRoughnessMap.texture;
return true;
case ShaderValue::material_clearcoatNormal_map_texture:
*output = m_clearcoatNormalMap.texture;
return true;
case ShaderValue::material_thickness_map_texture:
*output = m_thicknessMap.texture;
return true;
case ShaderValue::material_transmission_map_texture:
*output = m_transmissionMap.texture;
return true;
default:
return false;
}
}
bool KRMaterial::getShaderValue(ShaderValue value, int64_t* output) const
{
switch (value) {
case ShaderValue::material_shadingModel:
*output = m_shadingModel;
return true;
case ShaderValue::material_baseColor_map_texCoord:
*output = m_baseColorMap.texCoord;
return true;
case ShaderValue::material_normal_map_texCoord:
*output = m_normalMap.texCoord;
return true;
case ShaderValue::material_emissive_map_texCoord:
*output = m_emissiveMap.texCoord;
return true;
case ShaderValue::material_occlusion_map_texCoord:
*output = m_occlusionMap.texCoord;
return true;
case ShaderValue::material_metalicRoughness_map_texCoord:
*output = m_metalicRoughnessMap.texCoord;
return true;
case ShaderValue::material_anisotropy_map_texCoord:
*output = m_anisotropyMap.texCoord;
return true;
case ShaderValue::material_clearcoat_map_texCoord:
*output = m_clearcoatMap.texCoord;
return true;
case ShaderValue::material_clearcoatRoughness_map_texCoord:
*output = m_clearcoatRoughnessMap.texCoord;
return true;
case ShaderValue::material_clearcoatNormal_map_texCoord:
*output = m_clearcoatNormalMap.texCoord;
return true;
case ShaderValue::material_specular_map_texCoord:
*output = m_specularMap.texCoord;
return true;
case ShaderValue::material_specularColor_map_texCoord:
*output = m_specularColorMap.texCoord;
return true;
case ShaderValue::material_thickness_map_texCoord:
*output = m_thicknessMap.texCoord;
return true;
case ShaderValue::material_transmission_map_texCoord:
*output = m_transmissionMap.texCoord;
return true;
default:
return false;
}
}
bool KRMaterial::getShaderValue(ShaderValue value, bool* output) const
{
switch (value) {
case ShaderValue::material_doubleSided:
*output = m_doubleSided;
return true;
default:
return false;
}
} }

View File

@@ -159,4 +159,7 @@ private:
bool getShaderValue(ShaderValue value, hydra::Vector2* output) const final; bool getShaderValue(ShaderValue value, hydra::Vector2* output) const final;
bool getShaderValue(ShaderValue value, hydra::Vector3* output) const final; bool getShaderValue(ShaderValue value, hydra::Vector3* output) const final;
bool getShaderValue(ShaderValue value, hydra::Vector4* output) const final; bool getShaderValue(ShaderValue value, hydra::Vector4* output) const final;
bool getShaderValue(ShaderValue value, KRResourceBinding* output) const final;
bool getShaderValue(ShaderValue value, int64_t* output) const final;
bool getShaderValue(ShaderValue value, bool* output) const final;
}; };