2024-06-03 08:52:08 +08:00
|
|
|
|
#region
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
2023-09-30 23:09:43 +08:00
|
|
|
|
using nadena.dev.ndmf;
|
2024-06-03 08:52:08 +08:00
|
|
|
|
using UnityEngine;
|
2024-10-20 09:58:41 +08:00
|
|
|
|
#if MA_VRCSDK3_AVATARS
|
|
|
|
|
#endif
|
2024-06-03 08:52:08 +08:00
|
|
|
|
|
|
|
|
|
#endregion
|
2023-09-30 23:09:43 +08:00
|
|
|
|
|
|
|
|
|
namespace nadena.dev.modular_avatar.animation
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// This extension context amortizes a number of animation-related processing steps - notably,
|
|
|
|
|
/// collecting the set of all animation clips from the animators, and committing changes to them
|
|
|
|
|
/// in a deferred manner.
|
|
|
|
|
///
|
|
|
|
|
/// Restrictions: While this context is active, any changes to clips must be done by editing them via
|
|
|
|
|
/// ClipHolders in the AnimationDatabase. Any newly added clips must be registered in the AnimationDatabase,
|
|
|
|
|
/// and any new references to clips require setting appropriate ClipCommitActions.
|
|
|
|
|
///
|
|
|
|
|
/// New references to objects created in clips must use paths obtained from the
|
|
|
|
|
/// ObjectRenameTracker.GetObjectIdentifier method.
|
|
|
|
|
/// </summary>
|
|
|
|
|
internal sealed class AnimationServicesContext : IExtensionContext
|
|
|
|
|
{
|
2024-06-03 08:52:08 +08:00
|
|
|
|
private BuildContext _context;
|
2023-09-30 23:09:43 +08:00
|
|
|
|
private AnimationDatabase _animationDatabase;
|
|
|
|
|
private PathMappings _pathMappings;
|
2024-07-07 12:39:42 +08:00
|
|
|
|
|
2024-06-03 08:52:08 +08:00
|
|
|
|
private Dictionary<GameObject, string> _selfProxies = new();
|
2023-09-30 23:09:43 +08:00
|
|
|
|
|
|
|
|
|
public void OnActivate(BuildContext context)
|
|
|
|
|
{
|
2024-06-03 08:52:08 +08:00
|
|
|
|
_context = context;
|
|
|
|
|
|
2023-09-30 23:09:43 +08:00
|
|
|
|
_animationDatabase = new AnimationDatabase();
|
|
|
|
|
_animationDatabase.OnActivate(context);
|
|
|
|
|
|
|
|
|
|
_pathMappings = new PathMappings();
|
|
|
|
|
_pathMappings.OnActivate(context, _animationDatabase);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void OnDeactivate(BuildContext context)
|
|
|
|
|
{
|
|
|
|
|
_pathMappings.OnDeactivate(context);
|
|
|
|
|
_animationDatabase.Commit();
|
|
|
|
|
|
|
|
|
|
_pathMappings = null;
|
|
|
|
|
_animationDatabase = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public AnimationDatabase AnimationDatabase
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (_animationDatabase == null)
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidOperationException(
|
|
|
|
|
"AnimationDatabase is not available outside of the AnimationServicesContext");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return _animationDatabase;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public PathMappings PathMappings
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (_pathMappings == null)
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidOperationException(
|
|
|
|
|
"ObjectRenameTracker is not available outside of the AnimationServicesContext");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return _pathMappings;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|