// 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()];
}
}
}
}
}