From bdc7b3b754fe83ee067388613cb9a64f06e073a1 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Fri, 27 May 2022 12:07:27 +0200 Subject: [PATCH] Add updating ModelInstanceActor render state on material change --- Source/Engine/Graphics/Models/ModelInstanceEntry.h | 4 ++++ Source/Engine/Level/Actors/ModelInstanceActor.cpp | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/Source/Engine/Graphics/Models/ModelInstanceEntry.h b/Source/Engine/Graphics/Models/ModelInstanceEntry.h index 65554ef14..57bdce8cd 100644 --- a/Source/Engine/Graphics/Models/ModelInstanceEntry.h +++ b/Source/Engine/Graphics/Models/ModelInstanceEntry.h @@ -38,6 +38,10 @@ DECLARE_SCRIPTING_TYPE_MINIMAL(ModelInstanceEntry); public: bool operator==(const ModelInstanceEntry& other) const; + FORCE_INLINE bool operator!=(const ModelInstanceEntry& other) const + { + return !operator==(other); + } }; /// diff --git a/Source/Engine/Level/Actors/ModelInstanceActor.cpp b/Source/Engine/Level/Actors/ModelInstanceActor.cpp index 8cf3a3620..e0164c82a 100644 --- a/Source/Engine/Level/Actors/ModelInstanceActor.cpp +++ b/Source/Engine/Level/Actors/ModelInstanceActor.cpp @@ -11,15 +11,25 @@ ModelInstanceActor::ModelInstanceActor(const SpawnParams& params) void ModelInstanceActor::SetEntries(const Array& value) { + bool anyChanged = false; Entries.Resize(value.Count()); for (int32 i = 0; i < value.Count(); i++) + { + anyChanged |= Entries[i] != value[i]; Entries[i] = value[i]; + } + if (anyChanged && _sceneRenderingKey != -1) + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } void ModelInstanceActor::SetMaterial(int32 entryIndex, MaterialBase* material) { CHECK(entryIndex >= 0 && entryIndex < Entries.Count()); + if (Entries[entryIndex].Material == material) + return; Entries[entryIndex].Material = material; + if (_sceneRenderingKey != -1) + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } MaterialInstance* ModelInstanceActor::CreateAndSetVirtualMaterialInstance(int32 entryIndex) @@ -28,6 +38,8 @@ MaterialInstance* ModelInstanceActor::CreateAndSetVirtualMaterialInstance(int32 CHECK_RETURN(material && !material->WaitForLoaded(), nullptr); const auto result = material->CreateVirtualInstance(); Entries[entryIndex].Material = result; + if (_sceneRenderingKey != -1) + GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); return result; }