Working on shader const binding

This commit is contained in:
Areloch 2017-10-17 08:48:31 -05:00
parent ccdc93fc25
commit d674ac5817
11 changed files with 96 additions and 33 deletions

View file

@ -124,6 +124,8 @@ TSStatic::TSStatic()
mCollisionType = CollisionMesh; mCollisionType = CollisionMesh;
mDecalType = CollisionMesh; mDecalType = CollisionMesh;
mOverrideColor = LinearColorF::BLACK;
} }
TSStatic::~TSStatic() TSStatic::~TSStatic()
@ -187,6 +189,9 @@ void TSStatic::initPersistFields()
addField( "originSort", TypeBool, Offset( mUseOriginSort, TSStatic ), addField( "originSort", TypeBool, Offset( mUseOriginSort, TSStatic ),
"Enables translucent sorting of the TSStatic by its origin instead of the bounds." ); "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"); endGroup("Rendering");
addGroup( "Reflection" ); addGroup( "Reflection" );
@ -306,8 +311,6 @@ bool TSStatic::onAdd()
if ( reflectorDesc ) if ( reflectorDesc )
mCubeReflector.registerReflector( this, reflectorDesc ); mCubeReflector.registerReflector( this, reflectorDesc );
strudelCSB = new CustomShaderBindingData();
} }
_updateShouldTick(); _updateShouldTick();
@ -630,7 +633,8 @@ void TSStatic::prepRenderImage( SceneRenderState* state )
rdata.setAccuTex(mAccuTex); rdata.setAccuTex(mAccuTex);
//Various arbitrary shader render bits to add //Various arbitrary shader render bits to add
strudelCSB->setFloat("strudel", 0.25); CustomShaderBindingData strudelCSB;
strudelCSB.setFloat4(StringTable->insert("overrideColor"), mOverrideColor);
rdata.addCustomShaderBinding(strudelCSB); rdata.addCustomShaderBinding(strudelCSB);
@ -800,6 +804,8 @@ U32 TSStatic::packUpdate(NetConnection *con, U32 mask, BitStream *stream)
{ {
stream->writeRangedU32( reflectorDesc->getId(), DataBlockObjectIdFirst, DataBlockObjectIdLast ); stream->writeRangedU32( reflectorDesc->getId(), DataBlockObjectIdFirst, DataBlockObjectIdLast );
} }
stream->write(mOverrideColor);
return retMask; return retMask;
} }
@ -887,6 +893,8 @@ void TSStatic::unpackUpdate(NetConnection *con, BitStream *stream)
cubeDescId = stream->readRangedU32( DataBlockObjectIdFirst, DataBlockObjectIdLast ); cubeDescId = stream->readRangedU32( DataBlockObjectIdFirst, DataBlockObjectIdLast );
} }
stream->read(&mOverrideColor);
if ( isProperlyAdded() ) if ( isProperlyAdded() )
_updateShouldTick(); _updateShouldTick();
} }

View file

@ -191,6 +191,8 @@ protected:
PhysicsBody *mPhysicsRep; PhysicsBody *mPhysicsRep;
LinearColorF mOverrideColor;
// Debug stuff // Debug stuff
F32 mRenderNormalScalar; F32 mRenderNormalScalar;
S32 mForceDetail; S32 mForceDetail;
@ -236,8 +238,6 @@ public:
const Vector<S32>& getLOSDetails() const { return mLOSDetails; } const Vector<S32>& getLOSDetails() const { return mLOSDetails; }
CustomShaderBindingData* strudelCSB;
}; };
typedef TSStatic::MeshType TSMeshType; typedef TSStatic::MeshType TSMeshType;

View file

@ -1322,10 +1322,18 @@ void ProcessedShaderMaterial::setSceneInfo(SceneRenderState * state, const Scene
//roll through and try setting our data! //roll through and try setting our data!
for (U32 h = 0; h < rpd->customFeatureShaderHandles.mHandles.size(); ++h) 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 (rpd->customFeatureShaderHandles.mHandles[h].handleName == sgData.customShaderData[i]->getHandleName())
{ {
if(sgData.customShaderData[i]->getType() == CustomShaderBindingData::Float) if(sgData.customShaderData[i]->getType() == CustomShaderBindingData::Float)
shaderConsts->setSafe(rpd->customFeatureShaderHandles.mHandles[h].handle, sgData.customShaderData[i]->getFloat()); 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; break;
} }
} }

View file

@ -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; 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 // NOTE: We do not reset or clear the scene state
// here as the caller has initialized non-RI members // here as the caller has initialized non-RI members
// himself and we must preserve them. // himself and we must preserve them.
// //
// It also saves a bunch of CPU as this is called for // It also saves a bunch of CPU as this is called for
// every MeshRenderInst in every pass. // every MeshRenderInst in every pass.
dMemcpy( data.lights, ri->lights, sizeof( data.lights ) ); dMemcpy(data.lights, ri->lights, sizeof(data.lights));
data.objTrans = ri->objectToWorld; data.objTrans = ri->objectToWorld;
data.backBuffTex = ri->backBuffTex; data.backBuffTex = ri->backBuffTex;
data.cubemap = ri->cubemap; data.cubemap = ri->cubemap;
data.miscTex = ri->miscTex; data.miscTex = ri->miscTex;
data.reflectTex = ri->reflectTex; data.reflectTex = ri->reflectTex;
data.accuTex = ri->accuTex; data.accuTex = ri->accuTex;
data.lightmap = ri->lightmap; data.lightmap = ri->lightmap;
data.visibility = ri->visibility; data.visibility = ri->visibility;
data.materialHint = ri->materialHint; data.materialHint = ri->materialHint;
data.customShaderData = ri->mCustomShaderData;
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*, (),, DefineEngineMethod( RenderBinManager, getBinType, const char*, (),,

View file

@ -385,7 +385,7 @@ struct MeshRenderInst : public RenderInst
#endif #endif
//Custom Shader data //Custom Shader data
Vector<CustomShaderBindingData*> mCustomShaderData; Vector<CustomShaderBindingData> mCustomShaderData;
void clear(); void clear();
}; };

View file

@ -45,14 +45,22 @@ void CustomFeatureHLSL::processVert(Vector<ShaderComponent*> &componentList,
output = meta;*/ output = meta;*/
meta = new MultiLine;
mFeatureData = fd;
if (mOwner->isMethod("processVertHLSL")) if (mOwner->isMethod("processVertHLSL"))
Con::executef(mOwner, "processVertHLSL"); Con::executef(mOwner, "processVertHLSL");
output = meta;
} }
void CustomFeatureHLSL::processPix(Vector<ShaderComponent*> &componentList, void CustomFeatureHLSL::processPix(Vector<ShaderComponent*> &componentList,
const MaterialFeatureData &fd) const MaterialFeatureData &fd)
{ {
meta = new MultiLine; meta = new MultiLine;
mFeatureData = fd;
/*MultiLine *meta = new MultiLine; /*MultiLine *meta = new MultiLine;
@ -216,7 +224,7 @@ void CustomFeatureHLSL::addUniform(String name, String type, String defaultValue
newVarHolder.arraySize = arraySize; newVarHolder.arraySize = arraySize;
newVarHolder.sampler = false; newVarHolder.sampler = false;
newVarHolder.uniform = true; newVarHolder.uniform = true;
newVarHolder.constSortPos = cspPrimitive; newVarHolder.constSortPos = cspPotentialPrimitive;
mVars.push_back(newVarHolder); 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])); meta->addStatement(new GenOp(format + "\n", varList[0], varList[1], varList[2], varList[3], varList[4]));
break; 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;
} }

View file

@ -66,6 +66,8 @@ class CustomFeatureHLSL : public ShaderFeatureHLSL
public: public:
CustomShaderFeatureData* mOwner; CustomShaderFeatureData* mOwner;
MaterialFeatureData mFeatureData;
protected: protected:
MultiLine *meta; MultiLine *meta;
@ -100,6 +102,8 @@ public:
return mOwner->getName(); return mOwner->getName();
} }
bool hasFeature(String name);
void addUniform(String name, String type, String defaultValue, U32 arraySize = 0); void addUniform(String name, String type, String defaultValue, U32 arraySize = 0);
void addVariable(String name, String type, String defaultValue); void addVariable(String name, String type, String defaultValue);
void addSampler(String name, String type, U32 arraySize = 0); void addSampler(String name, String type, U32 arraySize = 0);

View file

@ -104,6 +104,11 @@ void CustomShaderFeatureData::addTexture(String name, String type, String sample
mFeatureHLSL->addTexture(name, type, samplerState, arraySize); mFeatureHLSL->addTexture(name, type, samplerState, arraySize);
} }
bool CustomShaderFeatureData::hasFeature(String name)
{
return mFeatureHLSL->hasFeature(name);
}
void CustomShaderFeatureData::writeLine(String format, S32 argc, ConsoleValueRef *argv) void CustomShaderFeatureData::writeLine(String format, S32 argc, ConsoleValueRef *argv)
{ {
/*mOnObject = onObject; /*mOnObject = onObject;
@ -172,4 +177,9 @@ ConsoleMethod(CustomShaderFeatureData, writeLine, void, 3, 0, "( string format,
"@return The result of the method call.") "@return The result of the method call.")
{ {
object->writeLine(argv[2], argc - 3, argv + 3); object->writeLine(argv[2], argc - 3, argv + 3);
}
DefineEngineMethod(CustomShaderFeatureData, hasFeature, bool, (String name), (""), "")
{
return object->hasFeature(name);
} }

View file

@ -65,6 +65,8 @@ public:
void addSampler(String name, String type, U32 arraySize); void addSampler(String name, String type, U32 arraySize);
void addTexture(String name, String type, String samplerState, U32 arraySize); void addTexture(String name, String type, String samplerState, U32 arraySize);
bool hasFeature(String name);
void writeLine(String format, S32 argc, ConsoleValueRef *argv); void writeLine(String format, S32 argc, ConsoleValueRef *argv);
//shader generation //shader generation

View file

@ -52,6 +52,7 @@ TSRenderState::TSRenderState( const TSRenderState &state )
mLightQuery( state.mLightQuery ), mLightQuery( state.mLightQuery ),
mAccuTex( state.mAccuTex ), mAccuTex( state.mAccuTex ),
mNodeTransforms( state.mNodeTransforms ), mNodeTransforms( state.mNodeTransforms ),
mNodeTransformCount( state.mNodeTransformCount ) mNodeTransformCount( state.mNodeTransformCount ),
mCustomShaderData( state.mCustomShaderData )
{ {
} }

View file

@ -90,21 +90,24 @@ public:
mFloat2 = f; mFloat2 = f;
type = Float2; type = Float2;
} }
Point2F getFloat2() { return mFloat2; }
void setFloat3(StringTableEntry shaderConstName, Point3F f) void setFloat3(StringTableEntry shaderConstName, Point3F f)
{ {
targetedUniformName = shaderConstName; targetedUniformName = shaderConstName;
mFloat3 = f; mFloat3 = f;
type = Float3; type = Float3;
} }
Point3F getFloat3() { return mFloat3; }
void setFloat4(StringTableEntry shaderConstName, Point4F f) void setFloat4(StringTableEntry shaderConstName, Point4F f)
{ {
targetedUniformName = shaderConstName; targetedUniformName = shaderConstName;
mFloat4 = f; mFloat4 = f;
type = Float4; type = Float4;
} }
Point4F getFloat4() { return mFloat4; }
StringTableEntry getHandleName() { StringTableEntry getHandleName() {
return targetedUniformName; return targetedUniformName;
} }
@ -193,7 +196,7 @@ protected:
U32 mNodeTransformCount; U32 mNodeTransformCount;
//Custom Shader data //Custom Shader data
Vector<CustomShaderBindingData*> mCustomShaderData; Vector<CustomShaderBindingData> mCustomShaderData;
public: public:
TSRenderState(); TSRenderState();
@ -242,11 +245,11 @@ public:
void setAccuTex( GFXTextureObject* query ) { mAccuTex = query; } void setAccuTex( GFXTextureObject* query ) { mAccuTex = query; }
GFXTextureObject* getAccuTex() const { return mAccuTex; } GFXTextureObject* getAccuTex() const { return mAccuTex; }
void addCustomShaderBinding(CustomShaderBindingData* data) void addCustomShaderBinding(CustomShaderBindingData data)
{ {
mCustomShaderData.push_back(data); mCustomShaderData.push_back(data);
} }
Vector<CustomShaderBindingData*> getCustomShaderBinding() const Vector<CustomShaderBindingData> getCustomShaderBinding() const
{ {
return mCustomShaderData; return mCustomShaderData;
} }