diff --git a/kraken/KRPipeline.cpp b/kraken/KRPipeline.cpp index c22ac75..f0ef758 100644 --- a/kraken/KRPipeline.cpp +++ b/kraken/KRPipeline.cpp @@ -634,12 +634,15 @@ void KRPipeline::updatePushConstants(KRNode::RenderInfo& ri, const Matrix4& matM { KRModelView modelView(ri.viewport, matModel); - std::vector objects = { - &modelView, - ri.viewport, - &ri.camera->settings - }; - setPushConstants(objects); + ri.reflectedObjects.push_back(&modelView); + ri.reflectedObjects.push_back(ri.viewport); + ri.reflectedObjects.push_back(&ri.camera->settings); + + setPushConstants(ri.reflectedObjects); + + ri.reflectedObjects.pop_back(); + ri.reflectedObjects.pop_back(); + ri.reflectedObjects.pop_back(); setPushConstant(ShaderValue::absolute_time, getContext().getAbsoluteTime()); diff --git a/kraken/nodes/KRNode.h b/kraken/nodes/KRNode.h index 9a95d37..ceb404b 100755 --- a/kraken/nodes/KRNode.h +++ b/kraken/nodes/KRNode.h @@ -35,6 +35,7 @@ #include "KRViewport.h" #include "KROctreeNode.h" #include "KRBehavior.h" +#include "KRShaderReflection.h" using namespace kraken; @@ -62,7 +63,9 @@ class XMLNode; class XMLAttribute; } -class KRNode : public KRContextObject +class KRNode + : public KRContextObject + , public KRReflectedObject { public: @@ -94,6 +97,8 @@ public: KRViewport* viewport; KRRenderPass* renderPass; KRPipeline* pipeline; + + std::vector reflectedObjects; }; static void InitNodeInfo(KrNodeInfo* nodeInfo); diff --git a/kraken/resources/material/KRMaterial.cpp b/kraken/resources/material/KRMaterial.cpp index 9ea6d09..bd6f405 100755 --- a/kraken/resources/material/KRMaterial.cpp +++ b/kraken/resources/material/KRMaterial.cpp @@ -412,7 +412,6 @@ void KRMaterial::bind(KRNode::RenderInfo& ri, ModelFormat modelFormat, __uint32_ } } - pShader->setPushConstant(ShaderValue::material_ambient, m_ambientColor + ri.camera->settings.ambient_intensity); if (ri.renderPass->getType() == RenderPassType::RENDER_PASS_FORWARD_OPAQUE) { @@ -429,19 +428,6 @@ void KRMaterial::bind(KRNode::RenderInfo& ri, ModelFormat modelFormat, __uint32_ pShader->setPushConstant(ShaderValue::material_specular, m_specularColor); } - pShader->setPushConstant(ShaderValue::material_shininess, m_ns); - pShader->setPushConstant(ShaderValue::material_reflection, m_reflectionColor); - pShader->setPushConstant(ShaderValue::diffusetexture_scale, m_diffuseMapScale); - pShader->setPushConstant(ShaderValue::speculartexture_scale, m_specularMapScale); - pShader->setPushConstant(ShaderValue::reflectiontexture_scale, m_reflectionMapScale); - pShader->setPushConstant(ShaderValue::normaltexture_scale, m_normalMapScale); - pShader->setPushConstant(ShaderValue::diffusetexture_offset, m_diffuseMapOffset); - pShader->setPushConstant(ShaderValue::speculartexture_offset, m_specularMapOffset); - pShader->setPushConstant(ShaderValue::reflectiontexture_offset, m_reflectionMapOffset); - pShader->setPushConstant(ShaderValue::normaltexture_offset, m_normalMapOffset); - - pShader->setPushConstant(ShaderValue::material_alpha, m_tr); - if (bDiffuseMap) { m_pDiffuseMap->resetPoolExpiry(lod_coverage, KRTexture::TEXTURE_USAGE_DIFFUSE_MAP); pShader->setImageBinding("diffuseTexture", m_pDiffuseMap, getContext().getSamplerManager()->DEFAULT_WRAPPING_SAMPLER); @@ -467,7 +453,9 @@ void KRMaterial::bind(KRNode::RenderInfo& ri, ModelFormat modelFormat, __uint32_ pShader->setImageBinding("reflectionTexture", m_pReflectionMap, getContext().getSamplerManager()->DEFAULT_CLAMPED_SAMPLER); } + ri.reflectedObjects.push_back(this); pShader->bind(ri, matModel); + ri.reflectedObjects.pop_back(); } const std::string& KRMaterial::getName() const @@ -475,3 +463,57 @@ const std::string& KRMaterial::getName() const return m_name; } + +bool KRMaterial::getShaderValue(ShaderValue value, float* output) const +{ + switch (value) { + case ShaderValue::material_alpha: + *output = m_tr; + return true; + case ShaderValue::material_shininess: + *output = m_ns; + return true; + } + return false; +} + +bool KRMaterial::getShaderValue(ShaderValue value, hydra::Vector2* output) const +{ + switch (value) { + case ShaderValue::diffusetexture_scale: + *output = m_diffuseMapScale; + return true; + case ShaderValue::speculartexture_scale: + *output = m_specularMapScale; + return true; + case ShaderValue::reflectiontexture_scale: + *output = m_reflectionMapScale; + return true; + case ShaderValue::normaltexture_scale: + *output = m_normalMapScale; + return true; + case ShaderValue::diffusetexture_offset: + *output = m_diffuseMapOffset; + return true; + case ShaderValue::speculartexture_offset: + *output = m_specularMapOffset; + return true; + case ShaderValue::reflectiontexture_offset: + *output = m_reflectionMapOffset; + return true; + case ShaderValue::normaltexture_offset: + *output = m_normalMapOffset; + return true; + } + return false; +} + +bool KRMaterial::getShaderValue(ShaderValue value, hydra::Vector3* output) const +{ + switch (value) { + case ShaderValue::material_reflection: + *output = m_reflectionColor; + return true; + } + return false; +} \ No newline at end of file diff --git a/kraken/resources/material/KRMaterial.h b/kraken/resources/material/KRMaterial.h index da91fbd..ca9e1e9 100755 --- a/kraken/resources/material/KRMaterial.h +++ b/kraken/resources/material/KRMaterial.h @@ -42,6 +42,7 @@ #include "resources/KRResource.h" #include "resources/scene/KRScene.h" #include "nodes/KRBone.h" +#include "KRShaderReflection.h" enum class CullMode : __uint32_t; enum class ModelFormat : __uint8_t; @@ -50,7 +51,9 @@ class KRTextureManager; class KRContext; class KRSurface; -class KRMaterial : public KRResource +class KRMaterial + : public KRResource + , public KRReflectedObject { public: typedef enum @@ -137,4 +140,9 @@ 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; + bool getShaderValue(ShaderValue value, hydra::Vector3* output) const final; };