diff --git a/Engine/source/T3D/tsStatic.cpp b/Engine/source/T3D/tsStatic.cpp index 84b3b0797..9b0f934b1 100644 --- a/Engine/source/T3D/tsStatic.cpp +++ b/Engine/source/T3D/tsStatic.cpp @@ -305,7 +305,9 @@ bool TSStatic::onAdd() mCubeReflector.unregisterReflector(); if ( reflectorDesc ) - mCubeReflector.registerReflector( this, reflectorDesc ); + mCubeReflector.registerReflector( this, reflectorDesc ); + + strudelCSB = new CustomShaderBindingData(); } _updateShouldTick(); @@ -627,6 +629,11 @@ void TSStatic::prepRenderImage( SceneRenderState* state ) // Acculumation rdata.setAccuTex(mAccuTex); + //Various arbitrary shader render bits to add + strudelCSB->setFloat("strudel", 0.25); + + rdata.addCustomShaderBinding(strudelCSB); + // If we have submesh culling enabled then prepare // the object space frustum to pass to the shape. Frustum culler; diff --git a/Engine/source/T3D/tsStatic.h b/Engine/source/T3D/tsStatic.h index db1ff138c..04938650f 100644 --- a/Engine/source/T3D/tsStatic.h +++ b/Engine/source/T3D/tsStatic.h @@ -236,6 +236,8 @@ public: const Vector& getLOSDetails() const { return mLOSDetails; } + CustomShaderBindingData* strudelCSB; + }; typedef TSStatic::MeshType TSMeshType; diff --git a/Engine/source/materials/processedShaderMaterial.cpp b/Engine/source/materials/processedShaderMaterial.cpp index 2785dc429..2fff8e99b 100644 --- a/Engine/source/materials/processedShaderMaterial.cpp +++ b/Engine/source/materials/processedShaderMaterial.cpp @@ -41,6 +41,8 @@ #include "gfx/util/screenspace.h" #include "math/util/matrixSet.h" +#include "ts/tsRenderState.h" + // We need to include customMaterialDefinition for ShaderConstHandles::init #include "materials/customMaterialDefinition.h" @@ -118,6 +120,21 @@ void ShaderConstHandles::init( GFXShader *shader, CustomMaterial* mat /*=NULL*/ 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]; + + mHandles.push_back(newSC); + } + } +} + /// /// ShaderRenderPassData /// @@ -659,6 +676,9 @@ bool ProcessedShaderMaterial::_addPass( ShaderRenderPassData &rpd, return false; rpd.shaderHandles.init( rpd.shader ); + //Store our customShaderFeature handles + rpd.customFeatureShaderHandles.init(rpd.shader, mMaterial->mCustomShaderFeatures); + // If a pass glows, we glow if( rpd.mGlow ) mHasGlow = true; @@ -1297,6 +1317,20 @@ void ProcessedShaderMaterial::setSceneInfo(SceneRenderState * state, const Scene for ( U32 i=0; i < rpd->featureShaderHandles.size(); i++ ) rpd->featureShaderHandles[i]->setConsts( state, sgData, shaderConsts ); + 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) + { + if (rpd->customFeatureShaderHandles.mHandles[h].handleName == sgData.customShaderData[i]->getHandleName()) + { + if(sgData.customShaderData[i]->getType() == CustomShaderBindingData::Float) + shaderConsts->setSafe(rpd->customFeatureShaderHandles.mHandles[h].handle, sgData.customShaderData[i]->getFloat()); + break; + } + } + } + LIGHTMGR->setLightInfo( this, mMaterial, sgData, state, pass, shaderConsts ); } diff --git a/Engine/source/materials/processedShaderMaterial.h b/Engine/source/materials/processedShaderMaterial.h index ee0781b95..f67204cc9 100644 --- a/Engine/source/materials/processedShaderMaterial.h +++ b/Engine/source/materials/processedShaderMaterial.h @@ -97,6 +97,21 @@ public: GFXShaderConstHandle* mNodeTransforms; void init( GFXShader* shader, CustomMaterial* mat = NULL ); + +}; + +class CustomFeatureShaderConstHandles +{ +public: + struct handleData + { + StringTableEntry handleName; + GFXShaderConstHandle* handle; + }; + + Vector mHandles; + + void init(GFXShader *shader, Vector customFeatureData); }; class ShaderRenderPassData : public RenderPassData @@ -109,6 +124,7 @@ public: GFXShaderRef shader; ShaderConstHandles shaderHandles; + CustomFeatureShaderConstHandles customFeatureShaderHandles; Vector featureShaderHandles; virtual void reset(); diff --git a/Engine/source/materials/sceneData.h b/Engine/source/materials/sceneData.h index 99fc8ef52..eb7bc689b 100644 --- a/Engine/source/materials/sceneData.h +++ b/Engine/source/materials/sceneData.h @@ -34,7 +34,7 @@ class GFXTexHandle; class GFXCubemap; - +class CustomShaderBindingData; struct SceneData { @@ -92,6 +92,8 @@ struct SceneData /// features. void *materialHint; + Vector customShaderData; + /// Constructor. SceneData() { diff --git a/Engine/source/renderInstance/renderBinManager.cpp b/Engine/source/renderInstance/renderBinManager.cpp index 16f559d5a..6a808c722 100644 --- a/Engine/source/renderInstance/renderBinManager.cpp +++ b/Engine/source/renderInstance/renderBinManager.cpp @@ -172,6 +172,7 @@ void RenderBinManager::setupSGData( MeshRenderInst *ri, SceneData &data ) data.lightmap = ri->lightmap; data.visibility = ri->visibility; data.materialHint = ri->materialHint; + data.customShaderData = ri->mCustomShaderData; } DefineEngineMethod( RenderBinManager, getBinType, const char*, (),, diff --git a/Engine/source/renderInstance/renderPassManager.h b/Engine/source/renderInstance/renderPassManager.h index 98080365b..218dec995 100644 --- a/Engine/source/renderInstance/renderPassManager.h +++ b/Engine/source/renderInstance/renderPassManager.h @@ -49,6 +49,8 @@ struct RenderInst; class MatrixSet; class GFXPrimitiveBufferHandle; +class CustomShaderBindingData; + /// A RenderInstType hash value. typedef U32 RenderInstTypeHash; @@ -382,6 +384,9 @@ struct MeshRenderInst : public RenderInst const char *objectName; #endif + //Custom Shader data + Vector mCustomShaderData; + void clear(); }; diff --git a/Engine/source/scene/sceneObject.h b/Engine/source/scene/sceneObject.h index 3985d372c..4a448842e 100644 --- a/Engine/source/scene/sceneObject.h +++ b/Engine/source/scene/sceneObject.h @@ -54,7 +54,9 @@ #ifndef _GFXDEVICE_H_ #include "gfx/gfxDevice.h" #endif - +#ifndef _TSRENDERDATA_H_ +#include "ts/tsRenderState.h" +#endif class SceneManager; class SceneRenderState; diff --git a/Engine/source/shaderGen/HLSL/customFeatureHLSL.cpp b/Engine/source/shaderGen/HLSL/customFeatureHLSL.cpp index effe43468..49014f292 100644 --- a/Engine/source/shaderGen/HLSL/customFeatureHLSL.cpp +++ b/Engine/source/shaderGen/HLSL/customFeatureHLSL.cpp @@ -219,6 +219,8 @@ void CustomFeatureHLSL::addUniform(String name, String type, String defaultValue newVarHolder.constSortPos = cspPrimitive; mVars.push_back(newVarHolder); + + mOwner->mAddedShaderConstants.push_back(StringTable->insert(name.c_str())); } } @@ -236,6 +238,8 @@ void CustomFeatureHLSL::addSampler(String name, String type, U32 arraySize) newVarHolder.constNum = Var::getTexUnitNum(); // used as texture unit num here mVars.push_back(newVarHolder); + + mOwner->mAddedShaderConstants.push_back(StringTable->insert(name.c_str())); } } @@ -281,6 +285,8 @@ void CustomFeatureHLSL::addTexture(String name, String type, String samplerState newVarHolder.constNum = constNum; // used as texture unit num here mVars.push_back(newVarHolder); + + mOwner->mAddedShaderConstants.push_back(StringTable->insert(name.c_str())); } } diff --git a/Engine/source/shaderGen/customShaderFeature.h b/Engine/source/shaderGen/customShaderFeature.h index 32b7d284d..4007b1945 100644 --- a/Engine/source/shaderGen/customShaderFeature.h +++ b/Engine/source/shaderGen/customShaderFeature.h @@ -36,6 +36,8 @@ class CustomShaderFeatureData : public SimObject public: CustomFeatureHLSL* mFeatureHLSL; + Vector mAddedShaderConstants; + public: CustomShaderFeatureData(); virtual ~CustomShaderFeatureData(); diff --git a/Engine/source/ts/tsMesh.cpp b/Engine/source/ts/tsMesh.cpp index b52a50b96..80390e775 100644 --- a/Engine/source/ts/tsMesh.cpp +++ b/Engine/source/ts/tsMesh.cpp @@ -207,6 +207,8 @@ void TSMesh::innerRender( TSMaterialList *materials, const TSRenderState &rdata, coreRI->materialHint = rdata.getMaterialHint(); + coreRI->mCustomShaderData = rdata.getCustomShaderBinding(); + coreRI->visibility = meshVisibility; coreRI->cubemap = rdata.getCubemap(); diff --git a/Engine/source/ts/tsRenderState.h b/Engine/source/ts/tsRenderState.h index 224d081ba..db81a205c 100644 --- a/Engine/source/ts/tsRenderState.h +++ b/Engine/source/ts/tsRenderState.h @@ -39,6 +39,7 @@ class TSShape; struct CustomShaderBindingData { +public: enum UniformType { Float = 0, @@ -58,18 +59,59 @@ struct CustomShaderBindingData Matrix4x3, Matrix4x4 }; - - String targetedUniformName; +private: + StringTableEntry targetedUniformName; //ShaderConstHandles shaderConstHandle; UniformType type; - void* data; //for numeric data + F32 mFloat; + Point2F mFloat2; + Point3F mFloat3; + Point4F mFloat4; //Image stuff GFXTexHandle texture; GFXSamplerStateDesc samplerState; + +public: + void setFloat(StringTableEntry shaderConstName, F32 f) + { + targetedUniformName = shaderConstName; + mFloat = f; + type = Float; + } + F32 getFloat() { return mFloat; } + + void setFloat2(StringTableEntry shaderConstName, Point2F f) + { + targetedUniformName = shaderConstName; + mFloat2 = f; + type = Float2; + } + + void setFloat3(StringTableEntry shaderConstName, Point3F f) + { + targetedUniformName = shaderConstName; + mFloat3 = f; + type = Float3; + } + + void setFloat4(StringTableEntry shaderConstName, Point4F f) + { + targetedUniformName = shaderConstName; + mFloat4 = f; + type = Float4; + } + + StringTableEntry getHandleName() { + return targetedUniformName; + } + + UniformType getType() { + return type; + } }; /// A simple class for passing render state through the pre-render pipeline. @@ -151,7 +193,7 @@ protected: U32 mNodeTransformCount; //Custom Shader data - Vector mCustomShaderData; + Vector mCustomShaderData; public: TSRenderState(); @@ -200,6 +242,15 @@ public: void setAccuTex( GFXTextureObject* query ) { mAccuTex = query; } GFXTextureObject* getAccuTex() const { return mAccuTex; } + void addCustomShaderBinding(CustomShaderBindingData* data) + { + mCustomShaderData.push_back(data); + } + Vector getCustomShaderBinding() const + { + return mCustomShaderData; + } + ///@ see mNodeTransforms, mNodeTransformCount void setNodeTransforms(MatrixF *list, U32 count) { mNodeTransforms = list; mNodeTransformCount = count; } void getNodeTransforms(MatrixF **list, U32 *count) const { *list = mNodeTransforms; *count = mNodeTransformCount; }