76 lines
2.8 KiB
C#
76 lines
2.8 KiB
C#
![]() |
// Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
|
||
|
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.Animations;
|
||
|
|
||
|
namespace Animancer
|
||
|
{
|
||
|
/// <summary>An <see cref="AnimancerLayerList"/> which uses an <see cref="AnimationLayerMixerPlayable"/>.</summary>
|
||
|
/// <remarks>
|
||
|
/// <strong>Documentation:</strong>
|
||
|
/// <see href="https://kybernetik.com.au/animancer/docs/manual/blending/layers">
|
||
|
/// Layers</see>
|
||
|
/// </remarks>
|
||
|
/// https://kybernetik.com.au/animancer/api/Animancer/AnimancerLayerMixerList
|
||
|
public class AnimancerLayerMixerList : AnimancerLayerList
|
||
|
{
|
||
|
/************************************************************************************************************************/
|
||
|
|
||
|
/// <summary>Creates a new <see cref="AnimancerLayerMixerList"/>.</summary>
|
||
|
public AnimancerLayerMixerList(AnimancerGraph graph)
|
||
|
: base(graph)
|
||
|
{
|
||
|
LayerMixer = AnimationLayerMixerPlayable.Create(graph._PlayableGraph, 1);
|
||
|
Playable = LayerMixer;
|
||
|
}
|
||
|
|
||
|
/************************************************************************************************************************/
|
||
|
|
||
|
/// <summary>The <see cref="AnimationLayerMixerPlayable"/> which blends the layers.</summary>
|
||
|
public AnimationLayerMixerPlayable LayerMixer { get; protected set; }
|
||
|
|
||
|
/************************************************************************************************************************/
|
||
|
|
||
|
/// <inheritdoc/>
|
||
|
public override bool IsAdditive(int index)
|
||
|
=> LayerMixer.IsLayerAdditive((uint)index);
|
||
|
|
||
|
/// <inheritdoc/>
|
||
|
public override void SetAdditive(int index, bool value)
|
||
|
{
|
||
|
SetMinCount(index + 1);
|
||
|
LayerMixer.SetLayerAdditive((uint)index, value);
|
||
|
}
|
||
|
|
||
|
/************************************************************************************************************************/
|
||
|
|
||
|
private static AvatarMask _DefaultMask;
|
||
|
|
||
|
/// <inheritdoc/>
|
||
|
public override void SetMask(int index, AvatarMask mask)
|
||
|
{
|
||
|
var layer = this[index];
|
||
|
|
||
|
if (mask == null)
|
||
|
{
|
||
|
// If the existing mask was already null, do nothing.
|
||
|
// If it was destroyed, we still need to continue and set it to the default.
|
||
|
if (layer._Mask is null)
|
||
|
return;
|
||
|
|
||
|
_DefaultMask ??= new();
|
||
|
|
||
|
mask = _DefaultMask;
|
||
|
}
|
||
|
|
||
|
// Don't check if the same mask was already assigned because it might have been modified.
|
||
|
layer._Mask = mask;
|
||
|
|
||
|
LayerMixer.SetLayerMaskFromAvatarMask((uint)index, mask);
|
||
|
}
|
||
|
|
||
|
/************************************************************************************************************************/
|
||
|
}
|
||
|
}
|
||
|
|