From 9a5700addc43bc5aa7108540e246bbdcbd9efac7 Mon Sep 17 00:00:00 2001 From: Areloch Date: Thu, 19 Oct 2017 15:34:57 -0500 Subject: [PATCH] Handler binding on a scene level working --- .../materials/processedCustomMaterial.cpp | 2 +- .../materials/processedShaderMaterial.cpp | 83 ++++++++++++------- .../materials/processedShaderMaterial.h | 24 ++---- .../renderInstance/renderDeferredMgr.cpp | 4 + 4 files changed, 66 insertions(+), 47 deletions(-) diff --git a/Engine/source/materials/processedCustomMaterial.cpp b/Engine/source/materials/processedCustomMaterial.cpp index 365676d44..38a574099 100644 --- a/Engine/source/materials/processedCustomMaterial.cpp +++ b/Engine/source/materials/processedCustomMaterial.cpp @@ -245,7 +245,7 @@ bool ProcessedCustomMaterial::init( const FeatureSet &features, return false; } - rpd->shaderHandles.init( rpd->shader, mCustomMaterial ); + rpd->shaderHandles.init( rpd->shader, mCustomMaterial->mCustomShaderFeatures, mCustomMaterial ); _initMaterialParameters(); mDefaultParameters = allocMaterialParameters(); setMaterialParameters( mDefaultParameters, 0 ); diff --git a/Engine/source/materials/processedShaderMaterial.cpp b/Engine/source/materials/processedShaderMaterial.cpp index 4c1a2f7e9..2ad9d59b1 100644 --- a/Engine/source/materials/processedShaderMaterial.cpp +++ b/Engine/source/materials/processedShaderMaterial.cpp @@ -52,7 +52,7 @@ /// /// ShaderConstHandles /// -void ShaderConstHandles::init( GFXShader *shader, CustomMaterial* mat /*=NULL*/ ) +void ShaderConstHandles::init( GFXShader *shader, Vector customFeatureData, CustomMaterial* mat /*=NULL*/) { mDiffuseColorSC = shader->getShaderConstHandle("$diffuseMaterialColor"); mTexMatSC = shader->getShaderConstHandle(ShaderGenVars::texMat); @@ -118,21 +118,19 @@ void ShaderConstHandles::init( GFXShader *shader, CustomMaterial* mat /*=NULL*/ // Deferred Shading mMatInfoFlagsSC = shader->getShaderConstHandle(ShaderGenVars::matInfoFlags); -} -void CustomFeatureShaderConstHandles::init(GFXShader *shader, Vector customFeatureData) -{ - for (U32 f = 0; f < customFeatureData.size(); ++f) - { - for (U32 i = 0; i < customFeatureData[f]->mAddedShaderConstants.size(); ++i) - { - handleData newSC; - newSC.handle = shader->getShaderConstHandle(customFeatureData[f]->mAddedShaderConstants[i]); - newSC.handleName = customFeatureData[f]->mAddedShaderConstants[i]; + //custom features + for (U32 f = 0; f < customFeatureData.size(); ++f) + { + for (U32 i = 0; i < customFeatureData[f]->mAddedShaderConstants.size(); ++i) + { + customHandleData newSC; + newSC.handle = shader->getShaderConstHandle(String("$") + String(customFeatureData[f]->mAddedShaderConstants[i])); + newSC.handleName = customFeatureData[f]->mAddedShaderConstants[i]; - mHandles.push_back(newSC); - } - } + mCustomHandles.push_back(newSC); + } + } } /// @@ -674,10 +672,7 @@ bool ProcessedShaderMaterial::_addPass( ShaderRenderPassData &rpd, rpd.shader = SHADERGEN->getShader( rpd.mFeatureData, mMaterial->mCustomShaderFeatures, mVertexFormat, &mUserMacros, samplers ); if( !rpd.shader ) return false; - rpd.shaderHandles.init( rpd.shader ); - - //Store our customShaderFeature handles - rpd.customFeatureShaderHandles.init(rpd.shader, mMaterial->mCustomShaderFeatures); + rpd.shaderHandles.init( rpd.shader, mMaterial->mCustomShaderFeatures); // If a pass glows, we glow if( rpd.mGlow ) @@ -1216,6 +1211,31 @@ void ProcessedShaderMaterial::_setShaderConstants(SceneRenderState * state, cons shaderConsts->set( handles->mAccuCoverageSC, mMaterial->mAccuCoverage[stageNum] ); if( handles->mAccuSpecularSC->isValid() ) shaderConsts->set( handles->mAccuSpecularSC, mMaterial->mAccuSpecular[stageNum] ); + + /*for (U32 i = 0; i < sgData.customShaderData.size(); i++) + { + //roll through and try setting our data! + for (U32 h = 0; h < handles->mCustomHandles.size(); ++h) + { + StringTableEntry handleName = sgData.customShaderData[i]->getHandleName(); + StringTableEntry rpdHandleName = handles->mCustomHandles[h].handleName; + if (handles->mCustomHandles[h].handleName == sgData.customShaderData[i]->getHandleName()) + { + if (handles->mCustomHandles[h].handle->isValid()) + { + if (sgData.customShaderData[i]->getType() == CustomShaderBindingData::Float) + shaderConsts->setSafe(handles->mCustomHandles[h].handle, sgData.customShaderData[i]->getFloat()); + else if (sgData.customShaderData[i]->getType() == CustomShaderBindingData::Float2) + shaderConsts->setSafe(handles->mCustomHandles[h].handle, sgData.customShaderData[i]->getFloat2()); + else if (sgData.customShaderData[i]->getType() == CustomShaderBindingData::Float3) + shaderConsts->setSafe(handles->mCustomHandles[h].handle, sgData.customShaderData[i]->getFloat3()); + else if (sgData.customShaderData[i]->getType() == CustomShaderBindingData::Float4) + shaderConsts->setSafe(handles->mCustomHandles[h].handle, sgData.customShaderData[i]->getFloat4()); + break; + } + } + } + }*/ } bool ProcessedShaderMaterial::_hasCubemap(U32 pass) @@ -1320,21 +1340,24 @@ void ProcessedShaderMaterial::setSceneInfo(SceneRenderState * state, const Scene for (U32 i = 0; i < sgData.customShaderData.size(); i++) { //roll through and try setting our data! - for (U32 h = 0; h < rpd->customFeatureShaderHandles.mHandles.size(); ++h) + for (U32 h = 0; h < handles->mCustomHandles.size(); ++h) { StringTableEntry handleName = sgData.customShaderData[i]->getHandleName(); - StringTableEntry rpdHandleName = rpd->customFeatureShaderHandles.mHandles[h].handleName; - if (rpd->customFeatureShaderHandles.mHandles[h].handleName == sgData.customShaderData[i]->getHandleName()) + StringTableEntry rpdHandleName = handles->mCustomHandles[h].handleName; + if (handles->mCustomHandles[h].handleName == sgData.customShaderData[i]->getHandleName()) { - if(sgData.customShaderData[i]->getType() == CustomShaderBindingData::Float) - shaderConsts->setSafe(rpd->customFeatureShaderHandles.mHandles[h].handle, sgData.customShaderData[i]->getFloat()); - else if (sgData.customShaderData[i]->getType() == CustomShaderBindingData::Float2) - shaderConsts->setSafe(rpd->customFeatureShaderHandles.mHandles[h].handle, sgData.customShaderData[i]->getFloat2()); - else if (sgData.customShaderData[i]->getType() == CustomShaderBindingData::Float3) - shaderConsts->setSafe(rpd->customFeatureShaderHandles.mHandles[h].handle, sgData.customShaderData[i]->getFloat3()); - else if (sgData.customShaderData[i]->getType() == CustomShaderBindingData::Float4) - shaderConsts->setSafe(rpd->customFeatureShaderHandles.mHandles[h].handle, sgData.customShaderData[i]->getFloat4()); - break; + if (handles->mCustomHandles[h].handle->isValid()) + { + if (sgData.customShaderData[i]->getType() == CustomShaderBindingData::Float) + shaderConsts->setSafe(handles->mCustomHandles[h].handle, sgData.customShaderData[i]->getFloat()); + else if (sgData.customShaderData[i]->getType() == CustomShaderBindingData::Float2) + shaderConsts->setSafe(handles->mCustomHandles[h].handle, sgData.customShaderData[i]->getFloat2()); + else if (sgData.customShaderData[i]->getType() == CustomShaderBindingData::Float3) + shaderConsts->setSafe(handles->mCustomHandles[h].handle, sgData.customShaderData[i]->getFloat3()); + else if (sgData.customShaderData[i]->getType() == CustomShaderBindingData::Float4) + shaderConsts->setSafe(handles->mCustomHandles[h].handle, sgData.customShaderData[i]->getFloat4()); + break; + } } } } diff --git a/Engine/source/materials/processedShaderMaterial.h b/Engine/source/materials/processedShaderMaterial.h index f67204cc9..149dcfaed 100644 --- a/Engine/source/materials/processedShaderMaterial.h +++ b/Engine/source/materials/processedShaderMaterial.h @@ -96,24 +96,17 @@ public: GFXShaderConstHandle* mNodeTransforms; - void init( GFXShader* shader, CustomMaterial* mat = NULL ); + struct customHandleData + { + StringTableEntry handleName; + GFXShaderConstHandle* handle; + }; + Vector mCustomHandles; + + void init( GFXShader* shader, Vector customFeatureData, CustomMaterial* mat = NULL); }; -class CustomFeatureShaderConstHandles -{ -public: - struct handleData - { - StringTableEntry handleName; - GFXShaderConstHandle* handle; - }; - - Vector mHandles; - - void init(GFXShader *shader, Vector customFeatureData); -}; - class ShaderRenderPassData : public RenderPassData { typedef RenderPassData Parent; @@ -124,7 +117,6 @@ public: GFXShaderRef shader; ShaderConstHandles shaderHandles; - CustomFeatureShaderConstHandles customFeatureShaderHandles; Vector featureShaderHandles; virtual void reset(); diff --git a/Engine/source/renderInstance/renderDeferredMgr.cpp b/Engine/source/renderInstance/renderDeferredMgr.cpp index 434fd585a..b03a0997c 100644 --- a/Engine/source/renderInstance/renderDeferredMgr.cpp +++ b/Engine/source/renderInstance/renderDeferredMgr.cpp @@ -431,6 +431,10 @@ void RenderDeferredMgr::render( SceneRenderState *state ) mat->setNodeTransforms(passRI->mNodeTransforms, passRI->mNodeTransformCount); } + //-JR + //push along any overriden fields that are instance-specific as well + //mat->setCustomShaderHandles() + // If we're instanced then don't render yet. if ( mat->isInstanced() ) {