Fix MaterialParams sync bug

This commit is contained in:
Wojtek Figat
2021-02-21 17:40:37 +01:00
parent 279d168b35
commit 1ead4b1649
3 changed files with 82 additions and 75 deletions

View File

@@ -23,17 +23,25 @@ void MaterialInstance::OnBaseSet()
_baseMaterial->OnUnloaded.Bind<MaterialInstance, &MaterialInstance::OnBaseUnloaded>(this);
_baseMaterial->ParamsChanged.Bind<MaterialInstance, &MaterialInstance::OnBaseParamsChanged>(this);
// Sync parameters with the base parameters to ensure all data is valid for rendering (constants offset and resource register)
MaterialParams& baseParams = _baseMaterial->Params;
bool validParams = Params.Count() == baseParams.Count();
for (int32 i = 0; validParams && i < Params.Count(); i++)
Params._versionHash = 0;
if (Params.Count() != baseParams.Count())
{
// Params changed
OnBaseParamsChanged();
return;
}
for (int32 i = 0; i < Params.Count(); i++)
{
MaterialParameter& param = Params[i];
MaterialParameter& baseParam = baseParams[i];
if (param.GetID() != baseParam.GetID() || param.GetParameterType() != baseParam.GetParameterType())
{
validParams = false;
break;
// Params changed
OnBaseParamsChanged();
return;
}
param._isPublic = baseParam._isPublic;
@@ -41,21 +49,14 @@ void MaterialInstance::OnBaseSet()
param._offset = baseParam._offset;
param._name = baseParam._name;
}
if (validParams)
{
Params._versionHash = baseParams._versionHash;
ParamsChanged();
}
else
{
OnBaseParamsChanged();
}
// Params are valid
Params._versionHash = baseParams._versionHash;
ParamsChanged();
}
void MaterialInstance::OnBaseUnset()
{
ScopeLock lock(_baseMaterial->Locker);
_baseMaterial->RemoveReference();
_baseMaterial->OnUnloaded.Unbind<MaterialInstance, &MaterialInstance::OnBaseUnloaded>(this);
_baseMaterial->ParamsChanged.Unbind<MaterialInstance, &MaterialInstance::OnBaseParamsChanged>(this);