PO/Library/PackageCache/com.unity.2d.animation@5.0.7/Editor/SkinningModule/SpriteMeshData/BoneWeightExtensions.cs

92 lines
3.1 KiB
C#

using System;
using UnityEngine;
namespace UnityEditor.U2D.Animation
{
internal static class BoneWeightExtensions
{
public static int GetBoneIndex(this BoneWeight boneWeight, int channelIndex)
{
if (channelIndex < 0 || channelIndex >= 4)
throw new ArgumentOutOfRangeException("Channel index out of range");
if (channelIndex == 0)
return boneWeight.boneIndex0;
if (channelIndex == 1)
return boneWeight.boneIndex1;
if (channelIndex == 2)
return boneWeight.boneIndex2;
if (channelIndex == 3)
return boneWeight.boneIndex3;
return -1;
}
public static void SetBoneIndex(ref BoneWeight boneWeight, int channelIndex, int boneIndex)
{
if (channelIndex < 0 || channelIndex >= 4)
throw new ArgumentOutOfRangeException("Channel index out of range");
if (channelIndex == 0)
boneWeight.boneIndex0 = boneIndex;
if (channelIndex == 1)
boneWeight.boneIndex1 = boneIndex;
if (channelIndex == 2)
boneWeight.boneIndex2 = boneIndex;
if (channelIndex == 3)
boneWeight.boneIndex3 = boneIndex;
}
public static float GetWeight(this BoneWeight boneWeight, int channelIndex)
{
if (channelIndex < 0 || channelIndex >= 4)
throw new ArgumentOutOfRangeException("Channel index out of range");
if (channelIndex == 0)
return boneWeight.weight0;
if (channelIndex == 1)
return boneWeight.weight1;
if (channelIndex == 2)
return boneWeight.weight2;
if (channelIndex == 3)
return boneWeight.weight3;
return 0f;
}
public static void SetWeight(ref BoneWeight boneWeight, int channelIndex, float weight)
{
if (channelIndex < 0 || channelIndex >= 4)
throw new ArgumentOutOfRangeException("Channel index out of range");
if (channelIndex == 0)
boneWeight.weight0 = weight;
if (channelIndex == 1)
boneWeight.weight1 = weight;
if (channelIndex == 2)
boneWeight.weight2 = weight;
if (channelIndex == 3)
boneWeight.weight3 = weight;
}
public static float Sum(this BoneWeight boneWeight)
{
return boneWeight.weight0 + boneWeight.weight1 + boneWeight.weight2 + boneWeight.weight3;
}
public static BoneWeight Normalized(this BoneWeight boneWeight)
{
var sum = boneWeight.Sum();
if (sum == 0 || sum == 1f)
return boneWeight;
var normalized = boneWeight;
var sumInv = 1f / sum;
for (var i = 0; i < 4; ++i)
SetWeight(ref normalized, i, normalized.GetWeight(i) * sumInv);
return normalized;
}
}
}