mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-15 00:24:40 +00:00
Working on shader const binding
This commit is contained in:
parent
ccdc93fc25
commit
d674ac5817
11 changed files with 96 additions and 33 deletions
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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*, (),,
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -45,8 +45,14 @@ 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,
|
||||||
|
|
@ -54,6 +60,8 @@ void CustomFeatureHLSL::processPix(Vector<ShaderComponent*> &componentList,
|
||||||
{
|
{
|
||||||
meta = new MultiLine;
|
meta = new MultiLine;
|
||||||
|
|
||||||
|
mFeatureData = fd;
|
||||||
|
|
||||||
/*MultiLine *meta = new MultiLine;
|
/*MultiLine *meta = new MultiLine;
|
||||||
|
|
||||||
output = meta;
|
output = meta;
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
@ -392,3 +400,15 @@ void CustomFeatureHLSL::writeLine(String format, S32 argc, ConsoleValueRef *argv
|
||||||
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;
|
||||||
|
}
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -173,3 +178,8 @@ ConsoleMethod(CustomShaderFeatureData, writeLine, void, 3, 0, "( string format,
|
||||||
{
|
{
|
||||||
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);
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -90,6 +90,7 @@ 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)
|
||||||
{
|
{
|
||||||
|
|
@ -97,6 +98,7 @@ public:
|
||||||
mFloat3 = f;
|
mFloat3 = f;
|
||||||
type = Float3;
|
type = Float3;
|
||||||
}
|
}
|
||||||
|
Point3F getFloat3() { return mFloat3; }
|
||||||
|
|
||||||
void setFloat4(StringTableEntry shaderConstName, Point4F f)
|
void setFloat4(StringTableEntry shaderConstName, Point4F f)
|
||||||
{
|
{
|
||||||
|
|
@ -104,6 +106,7 @@ public:
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue