KINDNICK_URP/Assets/External/VRM10/Runtime/Components/LookAt/LookAtEyeDirectionApplicableToExpression.cs
2025-04-25 21:14:54 +09:00

64 lines
2.4 KiB
C#

using System.Collections.Generic;
using UniGLTF.Extensions.VRMC_vrm;
using UnityEngine;
namespace UniVRM10
{
internal sealed class LookAtEyeDirectionApplicableToExpression : ILookAtEyeDirectionApplicable
{
private readonly CurveMapper _horizontalOuter;
private readonly CurveMapper _horizontalInner;
private readonly CurveMapper _verticalDown;
private readonly CurveMapper _verticalUp;
private readonly ExpressionKey _lookRightKey = ExpressionKey.CreateFromPreset(ExpressionPreset.lookRight);
private readonly ExpressionKey _lookLeftKey = ExpressionKey.CreateFromPreset(ExpressionPreset.lookLeft);
private readonly ExpressionKey _lookUpKey = ExpressionKey.CreateFromPreset(ExpressionPreset.lookUp);
private readonly ExpressionKey _lookDownKey = ExpressionKey.CreateFromPreset(ExpressionPreset.lookDown);
public LookAtEyeDirectionApplicableToExpression(
CurveMapper horizontalOuter, CurveMapper horizontalInner, CurveMapper verticalDown, CurveMapper verticalUp)
{
_horizontalOuter = horizontalOuter;
_horizontalInner = horizontalInner;
_verticalDown = verticalDown;
_verticalUp = verticalUp;
}
public void Apply(LookAtEyeDirection eyeDirection, Dictionary<ExpressionKey, float> actualWeights)
{
var yaw = eyeDirection.Yaw;
var pitch = eyeDirection.Pitch;
if (yaw < 0)
{
// Left
actualWeights[_lookRightKey] = 0;
actualWeights[_lookLeftKey] = Mathf.Clamp(_horizontalOuter.Map(Mathf.Abs(yaw)), 0, 1.0f);
}
else
{
// Right
actualWeights[_lookRightKey] = Mathf.Clamp(_horizontalOuter.Map(Mathf.Abs(yaw)), 0, 1.0f);
actualWeights[_lookLeftKey] = 0;
}
if (pitch < 0)
{
// Down
actualWeights[_lookUpKey] = 0;
actualWeights[_lookDownKey] = Mathf.Clamp(_verticalDown.Map(Mathf.Abs(pitch)), 0, 1.0f);
}
else
{
// Up
actualWeights[_lookUpKey] = Mathf.Clamp(_verticalUp.Map(Mathf.Abs(pitch)), 0, 1.0f);
actualWeights[_lookDownKey] = 0;
}
}
public void Restore()
{
}
}
}