Browse Source

Material refactor WIP - Fixing bugs and getting stuff to work again

BearishSun 9 năm trước cách đây
mục cha
commit
69dde4808b

+ 8 - 8
Source/BansheeCore/Source/BsGpuParamsSet.cpp

@@ -575,7 +575,7 @@ namespace BansheeEngine
 					GpuParamsType paramPtr = getParamByIdx(j, i);
 					GpuParamsType paramPtr = getParamByIdx(j, i);
 					if (paramPtr == nullptr)
 					if (paramPtr == nullptr)
 					{
 					{
-						stageOffsets += sizeof(UINT32) * 4;
+						stageOffsets += 4;
 						continue;
 						continue;
 					}
 					}
 
 
@@ -597,7 +597,7 @@ namespace BansheeEngine
 							paramInfo.paramIdx = paramIdx;
 							paramInfo.paramIdx = paramIdx;
 							paramInfo.slotIdx = param.second.slot;
 							paramInfo.slotIdx = param.second.slot;
 
 
-							offsets[stageIdx]++;
+							stageOffsets[stageIdx]++;
 							totalNumObjects++;
 							totalNumObjects++;
 						}
 						}
 					};
 					};
@@ -608,7 +608,7 @@ namespace BansheeEngine
 					processObjectParams(desc.buffers, 2, MaterialParams::ParamType::Buffer);
 					processObjectParams(desc.buffers, 2, MaterialParams::ParamType::Buffer);
 					processObjectParams(desc.samplers, 3, MaterialParams::ParamType::Sampler);
 					processObjectParams(desc.samplers, 3, MaterialParams::ParamType::Sampler);
 
 
-					stageOffsets += sizeof(UINT32) * 4;
+					stageOffsets += 4;
 				}
 				}
 			}
 			}
 
 
@@ -671,7 +671,7 @@ namespace BansheeEngine
 						objInfoOffset += numEntries;
 						objInfoOffset += numEntries;
 					}
 					}
 
 
-					stageOffsets += sizeof(UINT32) * 4;
+					stageOffsets += 4;
 				}
 				}
 			}
 			}
 
 
@@ -769,7 +769,7 @@ namespace BansheeEngine
 		for(auto& paramInfo : mDataParamInfos)
 		for(auto& paramInfo : mDataParamInfos)
 		{
 		{
 			ParamBlockPtrType paramBlock = mBlocks[paramInfo.blockIdx].buffer;
 			ParamBlockPtrType paramBlock = mBlocks[paramInfo.blockIdx].buffer;
-			if (paramBlock != nullptr)
+			if (paramBlock == nullptr)
 				continue;
 				continue;
 
 
 			const MaterialParams::ParamData* materialParamInfo = params->getParamData(paramInfo.paramIdx);
 			const MaterialParams::ParamData* materialParamInfo = params->getParamData(paramInfo.paramIdx);
@@ -793,7 +793,7 @@ namespace BansheeEngine
 						memcpy(&temp, data + arrayOffset, paramSize);
 						memcpy(&temp, data + arrayOffset, paramSize);
 						temp.transpose();
 						temp.transpose();
 
 
-						paramBlock->write(paramInfo.offset + arrayOffset, &temp, paramSize);
+						paramBlock->write((paramInfo.offset + arrayOffset) * sizeof(UINT32), &temp, paramSize);
 					}
 					}
 				};
 				};
 
 
@@ -855,13 +855,13 @@ namespace BansheeEngine
 					break;
 					break;
 				default:
 				default:
 				{
 				{
-					paramBlock->write(paramInfo.offset, data, paramSize * arraySize);
+					paramBlock->write(paramInfo.offset * sizeof(UINT32), data, paramSize * arraySize);
 					break;
 					break;
 				}
 				}
 				}
 				}
 			}
 			}
 			else
 			else
-				paramBlock->write(paramInfo.offset, data, paramSize * arraySize);
+				paramBlock->write(paramInfo.offset * sizeof(UINT32), data, paramSize * arraySize);
 		}
 		}
 
 
 		// Update object params
 		// Update object params

+ 2 - 1
Source/BansheeEngine/Include/BsSpriteMaterial.h

@@ -103,12 +103,13 @@ namespace BansheeEngine
 		virtual void initialize();
 		virtual void initialize();
 
 
 		/** Destroys the core thread material. */
 		/** Destroys the core thread material. */
-		static void destroy(const SPtr<MaterialCore>& material);
+		static void destroy(const SPtr<MaterialCore>& material, const SPtr<GpuParamsSetCore>& params);
 
 
 		UINT32 mId;
 		UINT32 mId;
 
 
 		// Core thread only (everything below)
 		// Core thread only (everything below)
 		SPtr<MaterialCore> mMaterial;
 		SPtr<MaterialCore> mMaterial;
+		SPtr<GpuParamsSetCore> mParams;
 		mutable MaterialParamMat4Core mWorldTransformParam;
 		mutable MaterialParamMat4Core mWorldTransformParam;
 		mutable MaterialParamFloatCore mInvViewportWidthParam;
 		mutable MaterialParamFloatCore mInvViewportWidthParam;
 		mutable MaterialParamFloatCore mInvViewportHeightParam;
 		mutable MaterialParamFloatCore mInvViewportHeightParam;

+ 7 - 3
Source/BansheeEngine/Source/BsSpriteMaterial.cpp

@@ -21,7 +21,7 @@ namespace BansheeEngine
 
 
 	SpriteMaterial::~SpriteMaterial()
 	SpriteMaterial::~SpriteMaterial()
 	{
 	{
-		gCoreAccessor().queueCommand(std::bind(&SpriteMaterial::destroy, mMaterial));
+		gCoreAccessor().queueCommand(std::bind(&SpriteMaterial::destroy, mMaterial, mParams));
 	}
 	}
 
 
 	void SpriteMaterial::initialize()
 	void SpriteMaterial::initialize()
@@ -29,6 +29,7 @@ namespace BansheeEngine
 		// Make sure that mMaterial assignment completes on the previous thread before continuing
 		// Make sure that mMaterial assignment completes on the previous thread before continuing
 		std::atomic_thread_fence(std::memory_order_acquire);
 		std::atomic_thread_fence(std::memory_order_acquire);
 
 
+		mParams = mMaterial->createParamsSet();
 		SPtr<ShaderCore> shader = mMaterial->getShader();
 		SPtr<ShaderCore> shader = mMaterial->getShader();
 
 
 		if(shader->hasTextureParam("mainTexture"))
 		if(shader->hasTextureParam("mainTexture"))
@@ -43,7 +44,7 @@ namespace BansheeEngine
 		mWorldTransformParam = mMaterial->getParamMat4("worldTransform");
 		mWorldTransformParam = mMaterial->getParamMat4("worldTransform");
 	}
 	}
 
 
-	void SpriteMaterial::destroy(const SPtr<MaterialCore>& material)
+	void SpriteMaterial::destroy(const SPtr<MaterialCore>& material, const SPtr<GpuParamsSetCore>& params)
 	{
 	{
 		// Do nothing, we just need to make sure the material pointer's last reference is lost while on the core thread
 		// Do nothing, we just need to make sure the material pointer's last reference is lost while on the core thread
 	}
 	}
@@ -80,7 +81,10 @@ namespace BansheeEngine
 		mInvViewportHeightParam.set(invViewportSize.y);
 		mInvViewportHeightParam.set(invViewportSize.y);
 		mWorldTransformParam.set(worldTransform);
 		mWorldTransformParam.set(worldTransform);
 
 
-		gRendererUtility().setPass(mMaterial, 0);
+		mMaterial->updateParamsSet(mParams);
+
+		gRendererUtility().setPass(mMaterial);
+		gRendererUtility().setPassParams(mParams);
 		gRendererUtility().draw(mesh, mesh->getProperties().getSubMesh(0));
 		gRendererUtility().draw(mesh, mesh->getProperties().getSubMesh(0));
 	}
 	}
 }
 }

+ 2 - 1
Source/RenderBeast/Source/BsRenderBeast.cpp

@@ -810,9 +810,10 @@ namespace BansheeEngine
 			for(UINT32 i = 0; i < materialOverrides->numOverrides; i++)
 			for(UINT32 i = 0; i < materialOverrides->numOverrides; i++)
 			{
 			{
 				SamplerOverride& override = materialOverrides->overrides[i];
 				SamplerOverride& override = materialOverrides->overrides[i];
+				const MaterialParamsBase::ParamData* materialParamData = materialParams->getParamData(override.paramIdx);
 
 
 				SPtr<SamplerStateCore> samplerState;
 				SPtr<SamplerStateCore> samplerState;
-				materialParams->getSamplerState(override.paramIdx, samplerState);
+				materialParams->getSamplerState(materialParamData->index, samplerState);
 
 
 				UINT64 hash = 0;
 				UINT64 hash = 0;
 				if (samplerState != nullptr)
 				if (samplerState != nullptr)