Add support for PrefabObject tracks and automated animation instancing with UsePrefabObjects enabled

This commit is contained in:
Wojtek Figat
2021-12-11 17:27:22 +01:00
parent 77e1ec530b
commit a9aaed6f33
6 changed files with 91 additions and 3 deletions

View File

@@ -26,6 +26,11 @@ namespace FlaxEditor.GUI.Timeline
/// The loop flag. Looped tracks are doing a playback of its data in a loop.
/// </summary>
Loop = 2,
/// <summary>
/// The prefab object reference flag for tracks used to animate objects in prefabs (for reusable instanced animations).
/// </summary>
PrefabObject = 4,
}
/// <summary>

View File

@@ -62,8 +62,57 @@ namespace FlaxEditor.GUI.Timeline.Tracks
/// </summary>
public Actor Actor
{
get => FlaxEngine.Object.TryFind<Actor>(ref ActorID);
set => ActorID = value?.ID ?? Guid.Empty;
get
{
if (Flags.HasFlag(TrackFlags.PrefabObject))
{
// TODO: reuse cached actor to improve perf
foreach (var window in Editor.Instance.Windows.Windows)
{
if (window is Windows.Assets.PrefabWindow prefabWindow && prefabWindow.Graph.MainActor)
{
var actor = FindActorWithPrefabObjectID(prefabWindow.Graph.MainActor, ref ActorID);
if (actor != null)
return actor;
}
}
return null;
}
return FlaxEngine.Object.TryFind<Actor>(ref ActorID);
}
set
{
if (value != null)
{
if (value.HasPrefabLink && value.Scene == null)
{
// Track with prefab object reference assigned in Editor
ActorID = value.PrefabObjectID;
Flags |= TrackFlags.PrefabObject;
}
else
{
ActorID = value.ID;
}
}
else
{
ActorID = Guid.Empty;
}
}
}
private static Actor FindActorWithPrefabObjectID(Actor a, ref Guid id)
{
if (a.PrefabObjectID == id)
return a;
for (int i = 0; i < a.ChildrenCount; i++)
{
var e = FindActorWithPrefabObjectID(a.GetChild(i), ref id);
if (e != null)
return e;
}
return null;
}
/// <summary>

View File

@@ -80,7 +80,7 @@ namespace FlaxEditor.GUI.Timeline.Tracks
var obj = Object;
var hasObject = obj != null;
TitleTintColor = hasObject ? Color.White : Color.Red;
TitleTintColor = hasObject ? (Flags.HasFlag(TrackFlags.PrefabObject) ? Style.Current.ProgressNormal : Color.White) : Color.Red;
if (hasObject != _hasObject)
OnObjectExistenceChanged(obj);
_hasObject = hasObject;