mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-19 20:24:49 +00:00
Working on shader const binding
This commit is contained in:
parent
70c154c7d3
commit
7219899287
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -191,6 +191,8 @@ protected:
|
|||
|
||||
PhysicsBody *mPhysicsRep;
|
||||
|
||||
LinearColorF mOverrideColor;
|
||||
|
||||
// Debug stuff
|
||||
F32 mRenderNormalScalar;
|
||||
S32 mForceDetail;
|
||||
|
|
@ -236,8 +238,6 @@ public:
|
|||
|
||||
const Vector<S32>& getLOSDetails() const { return mLOSDetails; }
|
||||
|
||||
CustomShaderBindingData* strudelCSB;
|
||||
|
||||
};
|
||||
|
||||
typedef TSStatic::MeshType TSMeshType;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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*, (),,
|
||||
|
|
|
|||
|
|
@ -385,7 +385,7 @@ struct MeshRenderInst : public RenderInst
|
|||
#endif
|
||||
|
||||
//Custom Shader data
|
||||
Vector<CustomShaderBindingData*> mCustomShaderData;
|
||||
Vector<CustomShaderBindingData> mCustomShaderData;
|
||||
|
||||
void clear();
|
||||
};
|
||||
|
|
|
|||
|
|
@ -45,14 +45,22 @@ void CustomFeatureHLSL::processVert(Vector<ShaderComponent*> &componentList,
|
|||
|
||||
output = meta;*/
|
||||
|
||||
meta = new MultiLine;
|
||||
|
||||
mFeatureData = fd;
|
||||
|
||||
if (mOwner->isMethod("processVertHLSL"))
|
||||
Con::executef(mOwner, "processVertHLSL");
|
||||
|
||||
output = meta;
|
||||
}
|
||||
|
||||
void CustomFeatureHLSL::processPix(Vector<ShaderComponent*> &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;
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<CustomShaderBindingData*> mCustomShaderData;
|
||||
Vector<CustomShaderBindingData> 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<CustomShaderBindingData*> getCustomShaderBinding() const
|
||||
Vector<CustomShaderBindingData> getCustomShaderBinding() const
|
||||
{
|
||||
return mCustomShaderData;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue