From 524e5aad2d096f1095038c8caf3c97927250de1b Mon Sep 17 00:00:00 2001 From: Areloch Date: Thu, 26 Oct 2017 17:06:27 -0500 Subject: [PATCH] asdasd --- Engine/source/materials/baseMatInstance.h | 11 ++- .../materials/customShaderBindingData.h | 89 +++++++++++++++++++ Engine/source/materials/matInstance.cpp | 6 ++ Engine/source/materials/matInstance.h | 1 + Engine/source/materials/processedFFMaterial.h | 1 + Engine/source/materials/processedMaterial.h | 8 +- .../materials/processedShaderMaterial.cpp | 44 ++++++++- .../materials/processedShaderMaterial.h | 4 + .../renderInstance/renderDeferredMgr.cpp | 7 +- .../source/renderInstance/renderGlowMgr.cpp | 7 ++ .../source/renderInstance/renderMeshMgr.cpp | 7 ++ .../renderInstance/renderTranslucentMgr.cpp | 7 ++ Engine/source/ts/tsRenderState.h | 84 +---------------- 13 files changed, 191 insertions(+), 85 deletions(-) create mode 100644 Engine/source/materials/customShaderBindingData.h diff --git a/Engine/source/materials/baseMatInstance.h b/Engine/source/materials/baseMatInstance.h index 6a2bee0a1..4409f8372 100644 --- a/Engine/source/materials/baseMatInstance.h +++ b/Engine/source/materials/baseMatInstance.h @@ -49,6 +49,13 @@ #ifndef _MATSTATEHINT_H_ #include "materials/matStateHint.h" #endif +#ifndef _GFXDEVICE_H_ +#include "gfx/gfxDevice.h" +#endif + +#ifndef CUSTOMSHADERBINDINGDATA_H +#include "materials/customShaderBindingData.h" +#endif struct RenderPassData; class GFXVertexBufferHandleBase; @@ -60,7 +67,6 @@ class GFXVertexFormat; class MatrixSet; class ProcessedMaterial; - /// class BaseMatInstance { @@ -155,6 +161,9 @@ public: /// Sets node transforms for the current stage. Used for hardware skinning. virtual void setNodeTransforms( const MatrixF *address, const U32 numTransforms ) = 0; + /// Sets custom shader data + virtual void setCustomShaderData(Vector &shaderData) = 0; + /// This initializes various material scene state settings and /// should be called after setupPass() within the pass loop. /// @see setupPass diff --git a/Engine/source/materials/customShaderBindingData.h b/Engine/source/materials/customShaderBindingData.h new file mode 100644 index 000000000..52dad2e9e --- /dev/null +++ b/Engine/source/materials/customShaderBindingData.h @@ -0,0 +1,89 @@ +#pragma once + +#ifndef CUSTOMSHADERBINDINGDATA_H +#define CUSTOMSHADERBINDINGDATA_H +#ifndef _GFXDEVICE_H_ +#include "gfx/gfxDevice.h" +#endif + +struct CustomShaderBindingData +{ +public: + enum UniformType + { + Float = 0, + Float2, + Float3, + Float4, + Texture2D, + Texture3D, + Cubemap, + Matrix2x2, + Matrix2x3, + Matrix2x4, + Matrix3x2, + Matrix3x3, + Matrix3x4, + Matrix4x2, + Matrix4x3, + Matrix4x4 + }; +private: + StringTableEntry targetedUniformName; + + //ShaderConstHandles shaderConstHandle; + + UniformType type; + + 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; + } + Point2F getFloat2() { return mFloat2; } + + void setFloat3(StringTableEntry shaderConstName, Point3F f) + { + targetedUniformName = shaderConstName; + mFloat3 = f; + type = Float3; + } + Point3F getFloat3() { return mFloat3; } + + void setFloat4(StringTableEntry shaderConstName, Point4F f) + { + targetedUniformName = shaderConstName; + mFloat4 = f; + type = Float4; + } + Point4F getFloat4() { return mFloat4; } + + StringTableEntry getHandleName() { + return targetedUniformName; + } + + UniformType getType() { + return type; + } +}; + +#endif \ No newline at end of file diff --git a/Engine/source/materials/matInstance.cpp b/Engine/source/materials/matInstance.cpp index 33b6357c9..8d563e514 100644 --- a/Engine/source/materials/matInstance.cpp +++ b/Engine/source/materials/matInstance.cpp @@ -472,6 +472,12 @@ void MatInstance::setNodeTransforms(const MatrixF *address, const U32 numTransfo mProcessedMaterial->setNodeTransforms(address, numTransforms, getCurPass()); } +void MatInstance::setCustomShaderData(Vector &shaderData) +{ + PROFILE_SCOPE(MatInstance_setCustomShaderData); + mProcessedMaterial->setCustomShaderData(shaderData, getCurPass()); +} + void MatInstance::setSceneInfo(SceneRenderState * state, const SceneData& sgData) { PROFILE_SCOPE(MatInstance_setSceneInfo); diff --git a/Engine/source/materials/matInstance.h b/Engine/source/materials/matInstance.h index 11178a42c..a89445243 100644 --- a/Engine/source/materials/matInstance.h +++ b/Engine/source/materials/matInstance.h @@ -66,6 +66,7 @@ public: virtual bool setupPass(SceneRenderState *, const SceneData &sgData ); virtual void setTransforms(const MatrixSet &matrixSet, SceneRenderState *state); virtual void setNodeTransforms(const MatrixF *address, const U32 numTransforms); + virtual void setCustomShaderData(Vector &shaderData); virtual void setSceneInfo(SceneRenderState *, const SceneData& sgData); virtual void setTextureStages(SceneRenderState * state, const SceneData &sgData ); virtual void setBuffers(GFXVertexBufferHandleBase* vertBuffer, GFXPrimitiveBufferHandle* primBuffer); diff --git a/Engine/source/materials/processedFFMaterial.h b/Engine/source/materials/processedFFMaterial.h index c65175381..3ba72594c 100644 --- a/Engine/source/materials/processedFFMaterial.h +++ b/Engine/source/materials/processedFFMaterial.h @@ -54,6 +54,7 @@ public: virtual void setTransforms(const MatrixSet &matrixSet, SceneRenderState *state, const U32 pass); virtual void setNodeTransforms(const MatrixF *address, const U32 numTransforms, const U32 pass) {;} + virtual void setCustomShaderData(Vector &shaderData, const U32 pass) {;} //-JR virtual void setSceneInfo(SceneRenderState *, const SceneData& sgData, U32 pass); diff --git a/Engine/source/materials/processedMaterial.h b/Engine/source/materials/processedMaterial.h index 38685eacb..f6f3fdcec 100644 --- a/Engine/source/materials/processedMaterial.h +++ b/Engine/source/materials/processedMaterial.h @@ -39,6 +39,10 @@ #include "materials/matStateHint.h" #endif +#ifndef CUSTOMSHADERBINDINGDATA_H +#include "materials/customShaderBindingData.h" +#endif + class ShaderFeature; class MaterialParameters; class MaterialParameterHandle; @@ -47,7 +51,6 @@ class GFXVertexBufferHandleBase; class GFXPrimitiveBufferHandle; class MatrixSet; - /// This contains the common data needed to render a pass. struct RenderPassData { @@ -146,6 +149,9 @@ public: /// Sets the node transforms for HW Skinning virtual void setNodeTransforms(const MatrixF *address, const U32 numTransforms, const U32 pass) = 0; + + /// Sets any custom shader data + virtual void setCustomShaderData(Vector &shaderData, const U32 pass) = 0; /// Sets the scene info like lights for the given pass. virtual void setSceneInfo(SceneRenderState *, const SceneData& sgData, U32 pass) = 0; diff --git a/Engine/source/materials/processedShaderMaterial.cpp b/Engine/source/materials/processedShaderMaterial.cpp index 2ad9d59b1..56561f089 100644 --- a/Engine/source/materials/processedShaderMaterial.cpp +++ b/Engine/source/materials/processedShaderMaterial.cpp @@ -1300,6 +1300,46 @@ void ProcessedShaderMaterial::setNodeTransforms(const MatrixF *transforms, const } } +void ProcessedShaderMaterial::setCustomShaderData(Vector &shaderData, const U32 pass) +{ + PROFILE_SCOPE(ProcessedShaderMaterial_setCustomShaderData); + + GFXShaderConstBuffer* shaderConsts = _getShaderConstBuffer(pass); + ShaderConstHandles* handles = _getShaderConstHandles(pass); + + for (U32 i = 0; i < shaderData.size(); i++) + { + for (U32 h = 0; h < handles->mCustomHandles.size(); ++h) + { + StringTableEntry handleName = shaderData[i].getHandleName(); + bool tmp = true; + } + //roll through and try setting our data! + for (U32 h = 0; h < handles->mCustomHandles.size(); ++h) + { + StringTableEntry handleName = shaderData[i].getHandleName(); + StringTableEntry rpdHandleName = handles->mCustomHandles[h].handleName; + if (handles->mCustomHandles[h].handleName == shaderData[i].getHandleName()) + { + if (handles->mCustomHandles[h].handle->isValid()) + { + CustomShaderBindingData::UniformType type = shaderData[i].getType(); + + if (type == CustomShaderBindingData::Float) + shaderConsts->setSafe(handles->mCustomHandles[h].handle, shaderData[i].getFloat()); + else if (type == CustomShaderBindingData::Float2) + shaderConsts->setSafe(handles->mCustomHandles[h].handle, shaderData[i].getFloat2()); + else if (type == CustomShaderBindingData::Float3) + shaderConsts->setSafe(handles->mCustomHandles[h].handle, shaderData[i].getFloat3()); + else if (type == CustomShaderBindingData::Float4) + shaderConsts->setSafe(handles->mCustomHandles[h].handle, shaderData[i].getFloat4()); + break; + } + } + } + } +} + void ProcessedShaderMaterial::setSceneInfo(SceneRenderState * state, const SceneData& sgData, U32 pass) { PROFILE_SCOPE( ProcessedShaderMaterial_setSceneInfo ); @@ -1337,7 +1377,7 @@ 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++) + /*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) @@ -1360,7 +1400,7 @@ void ProcessedShaderMaterial::setSceneInfo(SceneRenderState * state, const Scene } } } - } + }*/ LIGHTMGR->setLightInfo( this, mMaterial, sgData, state, pass, shaderConsts ); } diff --git a/Engine/source/materials/processedShaderMaterial.h b/Engine/source/materials/processedShaderMaterial.h index 149dcfaed..8a45ddfc7 100644 --- a/Engine/source/materials/processedShaderMaterial.h +++ b/Engine/source/materials/processedShaderMaterial.h @@ -29,6 +29,9 @@ #ifndef _GFXSHADER_H_ #include "gfx/gfxShader.h" #endif +#ifndef CUSTOMSHADERBINDINGDATA_H +#include "materials/customShaderBindingData.h" +#endif class GenericConstBufferLayout; class ShaderData; @@ -140,6 +143,7 @@ public: virtual void setTextureStages(SceneRenderState *, const SceneData &sgData, U32 pass ); virtual void setTransforms(const MatrixSet &matrixSet, SceneRenderState *state, const U32 pass); virtual void setNodeTransforms(const MatrixF *address, const U32 numTransforms, const U32 pass); + virtual void setCustomShaderData(Vector &shaderData, const U32 pass); virtual void setSceneInfo(SceneRenderState *, const SceneData& sgData, U32 pass); virtual void setBuffers(GFXVertexBufferHandleBase* vertBuffer, GFXPrimitiveBufferHandle* primBuffer); virtual bool stepInstance(); diff --git a/Engine/source/renderInstance/renderDeferredMgr.cpp b/Engine/source/renderInstance/renderDeferredMgr.cpp index b03a0997c..2da8b8cd6 100644 --- a/Engine/source/renderInstance/renderDeferredMgr.cpp +++ b/Engine/source/renderInstance/renderDeferredMgr.cpp @@ -51,6 +51,8 @@ #include "materials/shaderData.h" #include "gfx/sim/cubemapData.h" +#include "materials/customShaderBindingData.h" + const MatInstanceHookType DeferredMatInstanceHook::Type( "Deferred" ); const String RenderDeferredMgr::BufferName("deferred"); const RenderInstType RenderDeferredMgr::RIT_Deferred("Deferred"); @@ -433,7 +435,10 @@ void RenderDeferredMgr::render( SceneRenderState *state ) //-JR //push along any overriden fields that are instance-specific as well - //mat->setCustomShaderHandles() + if (passRI->mCustomShaderData.size() > 0) + { + mat->setCustomShaderData(passRI->mCustomShaderData); + } // If we're instanced then don't render yet. if ( mat->isInstanced() ) diff --git a/Engine/source/renderInstance/renderGlowMgr.cpp b/Engine/source/renderInstance/renderGlowMgr.cpp index 1ce49149d..dd2d2f29d 100644 --- a/Engine/source/renderInstance/renderGlowMgr.cpp +++ b/Engine/source/renderInstance/renderGlowMgr.cpp @@ -251,6 +251,13 @@ void RenderGlowMgr::render( SceneRenderState *state ) glowMat->setNodeTransforms(passRI->mNodeTransforms, passRI->mNodeTransformCount); } + //-JR + //push along any overriden fields that are instance-specific as well + if (passRI->mCustomShaderData.size() > 0) + { + mat->setCustomShaderData(passRI->mCustomShaderData); + } + glowMat->setSceneInfo(state, sgData); glowMat->setBuffers(passRI->vertBuff, passRI->primBuff); diff --git a/Engine/source/renderInstance/renderMeshMgr.cpp b/Engine/source/renderInstance/renderMeshMgr.cpp index c9de7c229..adaee396f 100644 --- a/Engine/source/renderInstance/renderMeshMgr.cpp +++ b/Engine/source/renderInstance/renderMeshMgr.cpp @@ -182,6 +182,13 @@ void RenderMeshMgr::render(SceneRenderState * state) mat->setNodeTransforms(passRI->mNodeTransforms, passRI->mNodeTransformCount); } + //-JR + //push along any overriden fields that are instance-specific as well + if (passRI->mCustomShaderData.size() > 0) + { + mat->setCustomShaderData(passRI->mCustomShaderData); + } + setupSGData( passRI, sgData ); mat->setSceneInfo( state, sgData ); diff --git a/Engine/source/renderInstance/renderTranslucentMgr.cpp b/Engine/source/renderInstance/renderTranslucentMgr.cpp index e0c3e6bb4..74dbdd154 100644 --- a/Engine/source/renderInstance/renderTranslucentMgr.cpp +++ b/Engine/source/renderInstance/renderTranslucentMgr.cpp @@ -249,6 +249,13 @@ void RenderTranslucentMgr::render( SceneRenderState *state ) mat->setNodeTransforms(passRI->mNodeTransforms, passRI->mNodeTransformCount); } + //-JR + //push along any overriden fields that are instance-specific as well + if (passRI->mCustomShaderData.size() > 0) + { + mat->setCustomShaderData(passRI->mCustomShaderData); + } + // If we're instanced then don't render yet. if ( mat->isInstanced() ) { diff --git a/Engine/source/ts/tsRenderState.h b/Engine/source/ts/tsRenderState.h index b9dd65eeb..eda8d5b3a 100644 --- a/Engine/source/ts/tsRenderState.h +++ b/Engine/source/ts/tsRenderState.h @@ -31,92 +31,16 @@ #include "gfx/gfxDevice.h" #endif +#ifndef _BASEMATINSTANCE_H_ +#include "materials/baseMatInstance.h" +#endif + class SceneRenderState; class GFXCubemap; class Frustum; class LightQuery; class TSShape; -struct CustomShaderBindingData -{ -public: - enum UniformType - { - Float = 0, - Float2, - Float3, - Float4, - Texture2D, - Texture3D, - Cubemap, - Matrix2x2, - Matrix2x3, - Matrix2x4, - Matrix3x2, - Matrix3x3, - Matrix3x4, - Matrix4x2, - Matrix4x3, - Matrix4x4 - }; -private: - StringTableEntry targetedUniformName; - - //ShaderConstHandles shaderConstHandle; - - UniformType type; - - 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; - } - Point2F getFloat2() { return mFloat2; } - - void setFloat3(StringTableEntry shaderConstName, Point3F f) - { - targetedUniformName = shaderConstName; - mFloat3 = f; - type = Float3; - } - Point3F getFloat3() { return mFloat3; } - - void setFloat4(StringTableEntry shaderConstName, Point4F f) - { - targetedUniformName = shaderConstName; - mFloat4 = f; - type = Float4; - } - Point4F getFloat4() { return mFloat4; } - - StringTableEntry getHandleName() { - return targetedUniformName; - } - - UniformType getType() { - return type; - } -}; - /// A simple class for passing render state through the pre-render pipeline. /// /// @section TSRenderState_intro Introduction