Просмотр исходного кода

Working on shader const binding

Areloch 7 лет назад
Родитель
Сommit
7219899287

+ 11 - 3
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();
 }

+ 2 - 2
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<S32>& getLOSDetails() const { return mLOSDetails; }
 
-   CustomShaderBindingData* strudelCSB;
-
 };
 
 typedef TSStatic::MeshType TSMeshType;

+ 8 - 0
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;
 		   }
 	   }

+ 28 - 21
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 );
-
-   // 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;
+	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. 
+
+	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*, (),,

+ 1 - 1
Engine/source/renderInstance/renderPassManager.h

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

+ 21 - 1
Engine/source/shaderGen/HLSL/customFeatureHLSL.cpp

@@ -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;
 }

+ 4 - 0
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);

+ 10 - 0
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);
 }

+ 2 - 0
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

+ 2 - 1
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 )
 {
 }

+ 9 - 6
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<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; 
    }