// Magica Cloth 2. // Copyright (c) 2023 MagicaSoft. // https://magicasoft.jp using System.Collections.Generic; using System.Linq; using UnityEngine; namespace MagicaCloth2 { [System.Serializable] public class CustomSkinningSettings : IValid, IDataValidate, ITransform { /// /// valid state. /// 有効状態 /// [NG] Runtime changes. /// [NG] Export/Import with Presets /// public bool enable = false; /// /// bones for skinning. /// Calculated from the parent-child structure line of bones registered here. /// スキニング用ボーン /// ここに登録されたボーンの親子構造ラインから算出される /// [NG] Runtime changes. /// [NG] Export/Import with Presets /// public List skinningBones = new List(); public void DataValidate() { //angularAttenuation = Mathf.Clamp01(angularAttenuation); //distanceReduction = Mathf.Clamp01(distanceReduction); //distancePow = Mathf.Clamp(distancePow, 0.1f, 5.0f); } public bool IsValid() { if (enable == false) return false; if (skinningBones.Count == 0) return false; if (skinningBones.Any(n => n != null) == false) return false; return true; } public CustomSkinningSettings Clone() { return new CustomSkinningSettings() { enable = enable, skinningBones = new List(skinningBones), }; } /// /// エディタメッシュの更新を判定するためのハッシュコード /// (このハッシュは実行時には利用されない編集用のもの) /// /// public override int GetHashCode() { int hash = 0; // おそらくカスタムスキニングは不要 #if false hash += enable.GetHashCode() * 101; hash += angularAttenuation.GetHashCode(); hash += distanceReduction.GetHashCode(); hash += distancePow.GetHashCode(); foreach (var t in skinningBones) hash += t?.GetInstanceID() ?? 0; #endif return hash; } public void GetUsedTransform(HashSet transformSet) { foreach (var t in skinningBones) { if (t) transformSet.Add(t); } } public void ReplaceTransform(Dictionary replaceDict) { for (int i = 0; i < skinningBones.Count; i++) { var t = skinningBones[i]; if (t && replaceDict.ContainsKey(t.GetInstanceID())) { skinningBones[i] = replaceDict[t.GetInstanceID()]; } } } } }