From 72198992872207394477e6715761bd0c22fced35 Mon Sep 17 00:00:00 2001 From: Areloch Date: Tue, 17 Oct 2017 08:48:31 -0500 Subject: [PATCH] Working on shader const binding --- Engine/source/T3D/tsStatic.cpp | 14 ++++-- Engine/source/T3D/tsStatic.h | 4 +- .../materials/processedShaderMaterial.cpp | 8 ++++ .../renderInstance/renderBinManager.cpp | 45 +++++++++++-------- .../source/renderInstance/renderPassManager.h | 2 +- .../shaderGen/HLSL/customFeatureHLSL.cpp | 22 ++++++++- .../source/shaderGen/HLSL/customFeatureHLSL.h | 4 ++ .../source/shaderGen/customShaderFeature.cpp | 10 +++++ Engine/source/shaderGen/customShaderFeature.h | 2 + Engine/source/ts/tsRenderState.cpp | 3 +- Engine/source/ts/tsRenderState.h | 15 ++++--- 11 files changed, 96 insertions(+), 33 deletions(-) diff --git a/Engine/source/T3D/tsStatic.cpp b/Engine/source/T3D/tsStatic.cpp index 9b0f934b1..ed0a97d5e 100644 --- a/Engine/source/T3D/tsStatic.cpp +++ b/Engine/source/T3D/tsStatic.cpp @@ -124,6 +124,8 @@ TSStatic::TSStatic() mCollisionType = CollisionMesh; mDecalType = CollisionMesh; + + mOverrideColor = LinearColorF::BLACK; } TSStatic::~TSStatic() @@ -187,6 +189,9 @@ void TSStatic::initPersistFields() addField( "originSort", TypeBool, Offset( mUseOriginSort, TSStatic ), "Enables translucent sorting of the TSStatic by its origin instead of the bounds." ); + addField("overrideColor", TypeColorF, Offset(mOverrideColor, TSStatic), + "@brief The skin applied to the shape.\n\n"); + endGroup("Rendering"); addGroup( "Reflection" ); @@ -306,8 +311,6 @@ bool TSStatic::onAdd() if ( reflectorDesc ) mCubeReflector.registerReflector( this, reflectorDesc ); - - strudelCSB = new CustomShaderBindingData(); } _updateShouldTick(); @@ -630,7 +633,8 @@ void TSStatic::prepRenderImage( SceneRenderState* state ) rdata.setAccuTex(mAccuTex); //Various arbitrary shader render bits to add - strudelCSB->setFloat("strudel", 0.25); + CustomShaderBindingData strudelCSB; + strudelCSB.setFloat4(StringTable->insert("overrideColor"), mOverrideColor); rdata.addCustomShaderBinding(strudelCSB); @@ -800,6 +804,8 @@ U32 TSStatic::packUpdate(NetConnection *con, U32 mask, BitStream *stream) { stream->writeRangedU32( reflectorDesc->getId(), DataBlockObjectIdFirst, DataBlockObjectIdLast ); } + + stream->write(mOverrideColor); return retMask; } @@ -887,6 +893,8 @@ void TSStatic::unpackUpdate(NetConnection *con, BitStream *stream) cubeDescId = stream->readRangedU32( DataBlockObjectIdFirst, DataBlockObjectIdLast ); } + stream->read(&mOverrideColor); + if ( isProperlyAdded() ) _updateShouldTick(); } diff --git a/Engine/source/T3D/tsStatic.h b/Engine/source/T3D/tsStatic.h index 04938650f..356bd5cd4 100644 --- a/Engine/source/T3D/tsStatic.h +++ b/Engine/source/T3D/tsStatic.h @@ -191,6 +191,8 @@ protected: PhysicsBody *mPhysicsRep; + LinearColorF mOverrideColor; + // Debug stuff F32 mRenderNormalScalar; S32 mForceDetail; @@ -236,8 +238,6 @@ 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 2fff8e99b..4c1a2f7e9 100644 --- a/Engine/source/materials/processedShaderMaterial.cpp +++ b/Engine/source/materials/processedShaderMaterial.cpp @@ -1322,10 +1322,18 @@ void ProcessedShaderMaterial::setSceneInfo(SceneRenderState * state, const Scene //roll through and try setting our data! for (U32 h = 0; h < rpd->customFeatureShaderHandles.mHandles.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()) { 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; } } diff --git a/Engine/source/renderInstance/renderBinManager.cpp b/Engine/source/renderInstance/renderBinManager.cpp index 6a808c722..19c32633b 100644 --- a/Engine/source/renderInstance/renderBinManager.cpp +++ b/Engine/source/renderInstance/renderBinManager.cpp @@ -151,28 +151,35 @@ S32 FN_CDECL RenderBinManager::cmpKeyFunc(const void* p1, const void* p2) return ( test1 == 0 ) ? S32(mse1->key2) - S32(mse2->key2) : test1; } -void RenderBinManager::setupSGData( MeshRenderInst *ri, SceneData &data ) +void RenderBinManager::setupSGData(MeshRenderInst *ri, SceneData &data) { - PROFILE_SCOPE( RenderBinManager_setupSGData ); + PROFILE_SCOPE(RenderBinManager_setupSGData); - // NOTE: We do not reset or clear the scene state - // here as the caller has initialized non-RI members - // himself and we must preserve them. - // - // It also saves a bunch of CPU as this is called for - // every MeshRenderInst in every pass. + // NOTE: We do not reset or clear the scene state + // here as the caller has initialized non-RI members + // himself and we must preserve them. + // + // It also saves a bunch of CPU as this is called for + // every MeshRenderInst in every pass. - dMemcpy( data.lights, ri->lights, sizeof( data.lights ) ); - data.objTrans = ri->objectToWorld; - data.backBuffTex = ri->backBuffTex; - data.cubemap = ri->cubemap; - data.miscTex = ri->miscTex; - data.reflectTex = ri->reflectTex; - data.accuTex = ri->accuTex; - data.lightmap = ri->lightmap; - data.visibility = ri->visibility; - data.materialHint = ri->materialHint; - data.customShaderData = ri->mCustomShaderData; + dMemcpy(data.lights, ri->lights, sizeof(data.lights)); + data.objTrans = ri->objectToWorld; + data.backBuffTex = ri->backBuffTex; + data.cubemap = ri->cubemap; + data.miscTex = ri->miscTex; + data.reflectTex = ri->reflectTex; + data.accuTex = ri->accuTex; + data.lightmap = ri->lightmap; + data.visibility = ri->visibility; + data.materialHint = ri->materialHint; + + data.customShaderData.clear(); + for (U32 i = 0; i < ri->mCustomShaderData.size(); i++) + { + data.customShaderData.push_back(&ri->mCustomShaderData[i]); + } + + bool bl = true; } DefineEngineMethod( RenderBinManager, getBinType, const char*, (),, diff --git a/Engine/source/renderInstance/renderPassManager.h b/Engine/source/renderInstance/renderPassManager.h index 218dec995..bbaba4fe2 100644 --- a/Engine/source/renderInstance/renderPassManager.h +++ b/Engine/source/renderInstance/renderPassManager.h @@ -385,7 +385,7 @@ struct MeshRenderInst : public RenderInst #endif //Custom Shader data - Vector mCustomShaderData; + Vector mCustomShaderData; void clear(); }; diff --git a/Engine/source/shaderGen/HLSL/customFeatureHLSL.cpp b/Engine/source/shaderGen/HLSL/customFeatureHLSL.cpp index 49014f292..d5f15e1b4 100644 --- a/Engine/source/shaderGen/HLSL/customFeatureHLSL.cpp +++ b/Engine/source/shaderGen/HLSL/customFeatureHLSL.cpp @@ -45,14 +45,22 @@ void CustomFeatureHLSL::processVert(Vector &componentList, output = meta;*/ + meta = new MultiLine; + + mFeatureData = fd; + if (mOwner->isMethod("processVertHLSL")) Con::executef(mOwner, "processVertHLSL"); + + output = meta; } void CustomFeatureHLSL::processPix(Vector &componentList, const MaterialFeatureData &fd) { meta = new MultiLine; + + mFeatureData = fd; /*MultiLine *meta = new MultiLine; @@ -216,7 +224,7 @@ void CustomFeatureHLSL::addUniform(String name, String type, String defaultValue newVarHolder.arraySize = arraySize; newVarHolder.sampler = false; newVarHolder.uniform = true; - newVarHolder.constSortPos = cspPrimitive; + newVarHolder.constSortPos = cspPotentialPrimitive; mVars.push_back(newVarHolder); @@ -391,4 +399,16 @@ void CustomFeatureHLSL::writeLine(String format, S32 argc, ConsoleValueRef *argv meta->addStatement(new GenOp(format + "\n", varList[0], varList[1], varList[2], varList[3], varList[4])); break; } +} + +bool CustomFeatureHLSL::hasFeature(String name) +{ + for (U32 i = 0; i < mFeatureData.materialFeatures.getCount(); i++) + { + String featureName = mFeatureData.materialFeatures.getAt(i).getName(); + if (name == featureName) + return true; + } + + return false; } \ No newline at end of file diff --git a/Engine/source/shaderGen/HLSL/customFeatureHLSL.h b/Engine/source/shaderGen/HLSL/customFeatureHLSL.h index d270242a1..216cc1464 100644 --- a/Engine/source/shaderGen/HLSL/customFeatureHLSL.h +++ b/Engine/source/shaderGen/HLSL/customFeatureHLSL.h @@ -66,6 +66,8 @@ class CustomFeatureHLSL : public ShaderFeatureHLSL public: CustomShaderFeatureData* mOwner; + MaterialFeatureData mFeatureData; + protected: MultiLine *meta; @@ -100,6 +102,8 @@ public: return mOwner->getName(); } + bool hasFeature(String name); + void addUniform(String name, String type, String defaultValue, U32 arraySize = 0); void addVariable(String name, String type, String defaultValue); void addSampler(String name, String type, U32 arraySize = 0); diff --git a/Engine/source/shaderGen/customShaderFeature.cpp b/Engine/source/shaderGen/customShaderFeature.cpp index 91f80b2db..aeb4ea753 100644 --- a/Engine/source/shaderGen/customShaderFeature.cpp +++ b/Engine/source/shaderGen/customShaderFeature.cpp @@ -104,6 +104,11 @@ void CustomShaderFeatureData::addTexture(String name, String type, String sample mFeatureHLSL->addTexture(name, type, samplerState, arraySize); } +bool CustomShaderFeatureData::hasFeature(String name) +{ + return mFeatureHLSL->hasFeature(name); +} + void CustomShaderFeatureData::writeLine(String format, S32 argc, ConsoleValueRef *argv) { /*mOnObject = onObject; @@ -172,4 +177,9 @@ ConsoleMethod(CustomShaderFeatureData, writeLine, void, 3, 0, "( string format, "@return The result of the method call.") { object->writeLine(argv[2], argc - 3, argv + 3); +} + +DefineEngineMethod(CustomShaderFeatureData, hasFeature, bool, (String name), (""), "") +{ + return object->hasFeature(name); } \ No newline at end of file diff --git a/Engine/source/shaderGen/customShaderFeature.h b/Engine/source/shaderGen/customShaderFeature.h index 4007b1945..ed830dfbb 100644 --- a/Engine/source/shaderGen/customShaderFeature.h +++ b/Engine/source/shaderGen/customShaderFeature.h @@ -65,6 +65,8 @@ public: void addSampler(String name, String type, U32 arraySize); void addTexture(String name, String type, String samplerState, U32 arraySize); + bool hasFeature(String name); + void writeLine(String format, S32 argc, ConsoleValueRef *argv); //shader generation diff --git a/Engine/source/ts/tsRenderState.cpp b/Engine/source/ts/tsRenderState.cpp index 0c3458af7..4c0ce6b93 100644 --- a/Engine/source/ts/tsRenderState.cpp +++ b/Engine/source/ts/tsRenderState.cpp @@ -52,6 +52,7 @@ TSRenderState::TSRenderState( const TSRenderState &state ) mLightQuery( state.mLightQuery ), mAccuTex( state.mAccuTex ), mNodeTransforms( state.mNodeTransforms ), - mNodeTransformCount( state.mNodeTransformCount ) + mNodeTransformCount( state.mNodeTransformCount ), + mCustomShaderData( state.mCustomShaderData ) { } diff --git a/Engine/source/ts/tsRenderState.h b/Engine/source/ts/tsRenderState.h index db81a205c..b9dd65eeb 100644 --- a/Engine/source/ts/tsRenderState.h +++ b/Engine/source/ts/tsRenderState.h @@ -90,21 +90,24 @@ public: 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; } @@ -193,7 +196,7 @@ protected: U32 mNodeTransformCount; //Custom Shader data - Vector mCustomShaderData; + Vector mCustomShaderData; public: TSRenderState(); @@ -242,11 +245,11 @@ public: void setAccuTex( GFXTextureObject* query ) { mAccuTex = query; } GFXTextureObject* getAccuTex() const { return mAccuTex; } - void addCustomShaderBinding(CustomShaderBindingData* data) + void addCustomShaderBinding(CustomShaderBindingData data) { mCustomShaderData.push_back(data); } - Vector getCustomShaderBinding() const + Vector getCustomShaderBinding() const { return mCustomShaderData; }