diff --git a/Source/Engine/Level/Actors/AnimatedModel.cpp b/Source/Engine/Level/Actors/AnimatedModel.cpp index df1359f7a..a5957e702 100644 --- a/Source/Engine/Level/Actors/AnimatedModel.cpp +++ b/Source/Engine/Level/Actors/AnimatedModel.cpp @@ -895,3 +895,9 @@ void AnimatedModel::OnTransformChanged() if (_sceneRenderingKey != -1) GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); } + +void AnimatedModel::WaitForModelLoad() +{ + if (SkinnedModel) + SkinnedModel->WaitForLoaded(); +} diff --git a/Source/Engine/Level/Actors/AnimatedModel.h b/Source/Engine/Level/Actors/AnimatedModel.h index 176da0dd8..2dc9e86ac 100644 --- a/Source/Engine/Level/Actors/AnimatedModel.h +++ b/Source/Engine/Level/Actors/AnimatedModel.h @@ -376,4 +376,5 @@ protected: void OnDisable() override; void OnActiveInTreeChanged() override; void OnTransformChanged() override; + void WaitForModelLoad() override; }; diff --git a/Source/Engine/Level/Actors/ModelInstanceActor.cpp b/Source/Engine/Level/Actors/ModelInstanceActor.cpp index e0164c82a..a87515d3e 100644 --- a/Source/Engine/Level/Actors/ModelInstanceActor.cpp +++ b/Source/Engine/Level/Actors/ModelInstanceActor.cpp @@ -11,6 +11,7 @@ ModelInstanceActor::ModelInstanceActor(const SpawnParams& params) void ModelInstanceActor::SetEntries(const Array& value) { + WaitForModelLoad(); bool anyChanged = false; Entries.Resize(value.Count()); for (int32 i = 0; i < value.Count(); i++) @@ -24,6 +25,7 @@ void ModelInstanceActor::SetEntries(const Array& value) void ModelInstanceActor::SetMaterial(int32 entryIndex, MaterialBase* material) { + WaitForModelLoad(); CHECK(entryIndex >= 0 && entryIndex < Entries.Count()); if (Entries[entryIndex].Material == material) return; @@ -34,6 +36,8 @@ void ModelInstanceActor::SetMaterial(int32 entryIndex, MaterialBase* material) MaterialInstance* ModelInstanceActor::CreateAndSetVirtualMaterialInstance(int32 entryIndex) { + WaitForModelLoad(); + CHECK_RETURN(entryIndex >= 0 && entryIndex < Entries.Count(), nullptr); auto material = Entries[entryIndex].Material.Get(); CHECK_RETURN(material && !material->WaitForLoaded(), nullptr); const auto result = material->CreateVirtualInstance(); @@ -43,6 +47,10 @@ MaterialInstance* ModelInstanceActor::CreateAndSetVirtualMaterialInstance(int32 return result; } +void ModelInstanceActor::WaitForModelLoad() +{ +} + void ModelInstanceActor::OnLayerChanged() { if (_sceneRenderingKey != -1) diff --git a/Source/Engine/Level/Actors/ModelInstanceActor.h b/Source/Engine/Level/Actors/ModelInstanceActor.h index f218fc005..84a45b1c4 100644 --- a/Source/Engine/Level/Actors/ModelInstanceActor.h +++ b/Source/Engine/Level/Actors/ModelInstanceActor.h @@ -81,6 +81,9 @@ public: return false; } +protected: + virtual void WaitForModelLoad(); + public: // [Actor] void OnLayerChanged() override; diff --git a/Source/Engine/Level/Actors/StaticModel.cpp b/Source/Engine/Level/Actors/StaticModel.cpp index ab809eb77..f5d9b68c2 100644 --- a/Source/Engine/Level/Actors/StaticModel.cpp +++ b/Source/Engine/Level/Actors/StaticModel.cpp @@ -544,3 +544,9 @@ void StaticModel::OnDisable() _residencyChangedModel = nullptr; } } + +void StaticModel::WaitForModelLoad() +{ + if (Model) + Model->WaitForLoaded(); +} diff --git a/Source/Engine/Level/Actors/StaticModel.h b/Source/Engine/Level/Actors/StaticModel.h index f3c5c4bb5..7ab5263df 100644 --- a/Source/Engine/Level/Actors/StaticModel.h +++ b/Source/Engine/Level/Actors/StaticModel.h @@ -187,4 +187,5 @@ protected: void OnTransformChanged() override; void OnEnable() override; void OnDisable() override; + void WaitForModelLoad() override; };