您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
82 行
2.6 KiB
82 行
2.6 KiB
using System;
|
|
using UnityEngine;
|
|
|
|
namespace UniVRM10
|
|
{
|
|
[Serializable]
|
|
public struct MorphTargetBinding : IEquatable<MorphTargetBinding>
|
|
{
|
|
/// <summary>
|
|
/// Unity の BlendShape の値域は 0-100
|
|
/// </summary>
|
|
public const float VRM_TO_UNITY = 100.0f;
|
|
|
|
/// <summary>
|
|
/// VRM-1.0 の MorphTargetBinding.Weight の値域は 0-1.0
|
|
/// </summary>
|
|
public const float UNITY_TO_VRM = 0.01f;
|
|
|
|
public const float MAX_WEIGHT = 1.0f;
|
|
|
|
/// <summary>
|
|
/// SkinnedMeshRenderer.BlendShape[Index].Weight を 指し示す。
|
|
///
|
|
/// [トレードオフ]
|
|
///
|
|
/// * SkinnedMeshRenderer そのものの方がわかりやすい
|
|
/// * Prefab 生成時の順番問題
|
|
/// * Prefabの中で、Prefab自体を参照するので String の方が扱いが楽(Prefab生成時にトラブルになりがち。Runtimeロードでは問題ない)
|
|
/// * モデル変更時の改変への強さ
|
|
///
|
|
/// </summary>
|
|
|
|
// シリアライズしてEditorから変更するので readonly 不可
|
|
public /*readonly*/ String RelativePath;
|
|
public /*readonly*/ int Index;
|
|
public /*readonly*/ float Weight;
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="path"></param>
|
|
/// <param name="index"></param>
|
|
/// <param name="weight">0 to 1.0</param>
|
|
public MorphTargetBinding(string path, int index, float weight)
|
|
{
|
|
RelativePath = path;
|
|
Index = index;
|
|
if (weight > MAX_WEIGHT)
|
|
{
|
|
Debug.LogWarning($"MorphTargetBinding: {weight} > {MAX_WEIGHT}");
|
|
}
|
|
Weight = weight;
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return string.Format("{0}[{1}]=>{2}", RelativePath, Index, Weight);
|
|
}
|
|
|
|
public bool Equals(MorphTargetBinding other)
|
|
{
|
|
return string.Equals(RelativePath, other.RelativePath) && Index == other.Index && Weight.Equals(other.Weight);
|
|
}
|
|
|
|
public override bool Equals(object obj)
|
|
{
|
|
if (ReferenceEquals(null, obj)) return false;
|
|
return obj is MorphTargetBinding && Equals((MorphTargetBinding)obj);
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
unchecked
|
|
{
|
|
var hashCode = (RelativePath != null ? RelativePath.GetHashCode() : 0);
|
|
hashCode = (hashCode * 397) ^ Index;
|
|
hashCode = (hashCode * 397) ^ Weight.GetHashCode();
|
|
return hashCode;
|
|
}
|
|
}
|
|
}
|
|
}
|