diff --git a/Source/Engine/Animations/SceneAnimations/SceneAnimationPlayer.cpp b/Source/Engine/Animations/SceneAnimations/SceneAnimationPlayer.cpp index 09b7cf874..ea24d126f 100644 --- a/Source/Engine/Animations/SceneAnimations/SceneAnimationPlayer.cpp +++ b/Source/Engine/Animations/SceneAnimations/SceneAnimationPlayer.cpp @@ -213,6 +213,11 @@ void SceneAnimationPlayer::Tick(float dt) _lastTime = _time = time; } +void SceneAnimationPlayer::MapObject(const Guid& from, const Guid& to) +{ + _objectsMapping[from] = to; +} + void SceneAnimationPlayer::Restore(SceneAnimation* anim, int32 stateIndexOffset) { // Restore all tracks @@ -268,7 +273,9 @@ void SceneAnimationPlayer::Restore(SceneAnimation* anim, int32 stateIndexOffset) case SceneAnimation::Track::Types::ObjectReferenceProperty: { value = &_restoreData[state.RestoreStateIndex]; - auto obj = Scripting::FindObject(*(Guid*)value); + Guid id = *(Guid*)value; + _objectsMapping.TryGet(id, id); + auto obj = Scripting::FindObject(id); value = obj ? obj->GetOrCreateManagedInstance() : nullptr; break; } @@ -358,7 +365,9 @@ bool SceneAnimationPlayer::TickPropertyTrack(int32 trackIndex, int32 stateIndexO void* value = (void*)((byte*)trackDataKeyframes->Keyframes + keyframeSize * (leftKey) + sizeof(float)); if (track.Type == SceneAnimation::Track::Types::ObjectReferenceProperty) { - auto obj = Scripting::FindObject(*(Guid*)value); + Guid id = *(Guid*)value; + _objectsMapping.TryGet(id, id); + auto obj = Scripting::FindObject(id); value = obj ? obj->GetOrCreateManagedInstance() : nullptr; *(void**)target = value; } @@ -680,10 +689,12 @@ void SceneAnimationPlayer::Tick(SceneAnimation* anim, float time, float dt, int3 // Find actor const auto trackData = track.GetData(); + Guid id = trackData->ID; + _objectsMapping.TryGet(id, id); state.Object = Scripting::FindObject(trackData->ID); if (!state.Object) { - LOG(Warning, "Failed to find {3} of ID={0} for track '{1}' in scene animation '{2}'", trackData->ID, track.Name, anim->ToString(), TEXT("actor")); + LOG(Warning, "Failed to find {3} of ID={0} for track '{1}' in scene animation '{2}'", id, track.Name, anim->ToString(), TEXT("actor")); break; } } @@ -708,10 +719,12 @@ void SceneAnimationPlayer::Tick(SceneAnimation* anim, float time, float dt, int3 break; // Find script - state.Object = Scripting::FindObject