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

Fixing an issue where all renderables using the same material would incorrectly use the same per-object and per-call uniform buffers

BearishSun 9 лет назад
Родитель
Сommit
3b15a84140

+ 0 - 18
Source/BansheeCore/Include/BsMaterial.h

@@ -553,21 +553,6 @@ namespace bs
 		/** @copydoc Material::setShader */
 		void setShader(const SPtr<ShaderCore>& shader);
 
-		/** Returns any custom data set by the renderer. */
-		const Any& getRendererData() const { return mRendererData; }
-
-		/** 
-		 * Sets renderer-specific data on the material. This can by anything the renderer requires, as its not used by the
-		 * material directly. 
-		 */
-		void setRendererData(const Any& data) { mRendererData = data; }
-
-		/** 
-		 * Returns a version number that increments whenever the material's shader changes. Allows external systems to know
-		 * when they need to rebuild relevant cached data.
-		 */
-		UINT32 getVersion() const { return mVersion; }
-
 		/** Creates a new material with the specified shader. */
 		static SPtr<MaterialCore> create(const SPtr<ShaderCore>& shader);
 
@@ -581,9 +566,6 @@ namespace bs
 
 		/** @copydoc CoreObjectCore::syncToCore */
 		void syncToCore(const CoreSyncData& data) override;
-
-		Any mRendererData;
-		UINT32 mVersion;
 	};
 
 	/** @} */

+ 0 - 4
Source/BansheeCore/Source/BsMaterial.cpp

@@ -359,14 +359,12 @@ namespace bs
 	template BS_CORE_EXPORT void TMaterial<true>::getParam(const String&, TMaterialDataParam<Matrix4x3, true>&) const;
 
 	MaterialCore::MaterialCore(const SPtr<ShaderCore>& shader)
-		: mVersion(1)
 	{
 		setShader(shader);
 	}
 
 	MaterialCore::MaterialCore(const SPtr<ShaderCore>& shader, const Vector<SPtr<TechniqueCore>>& techniques,
 		const SPtr<MaterialParamsCore>& materialParams)
-		: mVersion(1)
 	{
 		mShader = shader;
 		mParams = materialParams;
@@ -387,8 +385,6 @@ namespace bs
 		char* dataPtr = (char*)data.getBuffer();
 
 		SPtr<ShaderCore>* shader = (SPtr<ShaderCore>*)dataPtr;
-		if (mShader != *shader)
-			mVersion++;
 
 		mShader = *shader;
 		shader->~SPtr<ShaderCore>();

+ 3 - 29
Source/RenderBeast/Source/BsRenderBeast.cpp

@@ -213,34 +213,8 @@ namespace bs
 				}
 
 				// Generate or assigned renderer specific data for the material
-				Any materialInfo = renElement.material->getRendererData();
-				if(materialInfo.empty())
-				{
-					RendererMaterial matInfo;
-					matInfo.params.resize(techniqueIdx + 1);
-					matInfo.params[techniqueIdx] = renElement.material->createParamsSet(techniqueIdx);
-					matInfo.matVersion = renElement.material->getVersion();
-
-					renElement.material->updateParamsSet(matInfo.params[techniqueIdx], true);
-					renElement.material->setRendererData(matInfo);
-					renElement.params = matInfo.params[techniqueIdx];
-				}
-				else
-				{
-					RendererMaterial& matInfo = any_cast_ref<RendererMaterial>(materialInfo);
-					if (matInfo.params.size() <= techniqueIdx)
-						matInfo.params.resize(techniqueIdx + 1);
-
-					if(matInfo.params[techniqueIdx] == nullptr || matInfo.matVersion != renElement.material->getVersion())
-					{
-						matInfo.params[techniqueIdx] = renElement.material->createParamsSet(techniqueIdx);
-						matInfo.matVersion = renElement.material->getVersion();
-
-						renElement.material->updateParamsSet(matInfo.params[techniqueIdx], true);
-					}
-
-					renElement.params = matInfo.params[techniqueIdx];
-				}
+				renElement.params = renElement.material->createParamsSet(techniqueIdx);
+				renElement.material->updateParamsSet(renElement.params, true);
 
 				// Generate or assign sampler state overrides
 				SamplerOverrideKey samplerKey(renElement.material, techniqueIdx);
@@ -595,7 +569,7 @@ namespace bs
 			mRenderables[i]->renderable->updateAnimationBuffers(animData);
 
 			// Note: Could this step be moved in notifyRenderableUpdated, so it only triggers when material actually gets
-			// changed? Although it shouldn't matter much because if the internal dirty flags.
+			// changed? Although it shouldn't matter much because if the internal versions keeping track of dirty params.
 			for (auto& element : mRenderables[i]->elements)
 				element.material->updateParamsSet(element.params);