// Magica Cloth.
// Copyright (c) MagicaSoft, 2020-2022.
// https://magicasoft.jp
using System.Collections.Generic;
using UnityEngine;
namespace MagicaCloth
{
///
/// クロス基本パラメータ
///
[System.Serializable]
public class ClothParams
{
// アルゴリズム
public enum Algorithm
{
[InspectorName("Algorithm 1 (Old Style)")]
Algorithm_1 = 0, // 従来
[InspectorName("Algorithm 2")]
Algorithm_2 = 1, // v1.11.0より
}
[SerializeField]
private Algorithm algorithm = Algorithm.Algorithm_1;
// パーティクルサイズ
[SerializeField]
private BezierParam radius = new BezierParam(0.02f, 0.02f, true, 0.0f, false);
// パーティクルの重さ
[SerializeField]
private BezierParam mass = new BezierParam(1.0f, 1.0f, true, 0.0f, false);
// パーティクル重力加速度(m/s)
[SerializeField]
private bool useGravity = true;
[SerializeField]
private BezierParam gravity = new BezierParam(-9.8f, -9.8f, false, 0.0f, false);
[SerializeField]
private Vector3 gravityDirection = new Vector3(0.0f, 1.0f, 0.0f);
//[SerializeField]
//private bool useDirectionalDamping = true;
//[SerializeField]
//private Transform directionalDampingObject = null;
//[SerializeField]
//private BezierParam directionalDamping = new BezierParam(1.0f, 0.1f, true, -0.5f, true);
// パーティクル空気抵抗値
[SerializeField]
private bool useDrag = true;
[SerializeField]
private BezierParam drag = new BezierParam(0.02f, 0.02f, true, 0.0f, false);
// パーティクル最大速度(m/s)
[SerializeField]
private bool useMaxVelocity = true;
[SerializeField]
private BezierParam maxVelocity = new BezierParam(3.0f, 3.0f, false, 0.0f, false);
// ワールド移動影響
[SerializeField]
private Transform influenceTarget = null;
[SerializeField]
private float maxMoveSpeed = 3.0f; // (m/s)
[SerializeField]
private float maxRotationSpeed = 720.0f; // (deg/s)
[SerializeField]
private BezierParam worldMoveInfluence = new BezierParam(0.5f, 0.5f, false, 0.0f, false);
[SerializeField]
private BezierParam worldRotationInfluence = new BezierParam(1.0f, 1.0f, false, 0.0f, false);
// 外力
[SerializeField]
private float massInfluence = 0.3f;
[SerializeField]
private BezierParam depthInfluence = new BezierParam(0.1f, 1.0f, true, 0.5f, true);
[SerializeField]
private float windInfluence = 1.0f;
[SerializeField]
private float windRandomScale = 0.7f;
[SerializeField]
private float windSynchronization = 0.6f;
// 距離無効化
[SerializeField]
private bool useDistanceDisable = false;
[SerializeField]
private Transform disableReferenceObject = null;
[SerializeField]
private float disableDistance = 20.0f;
[SerializeField]
private float disableFadeDistance = 5.0f;
// テレポート
public enum TeleportMode
{
Reset = 0,
Keep = 1,
}
[SerializeField]
private bool useResetTeleport = false;
[SerializeField]
private float teleportDistance = 0.2f;
[SerializeField]
private float teleportRotation = 45.0f;
[SerializeField]
private TeleportMode teleportMode = TeleportMode.Reset;
// リセット後の安定化
[SerializeField]
private float resetStabilizationTime = 0.1f;
// ルートからの最小最大距離拘束
[SerializeField]
private bool useClampDistanceRatio = true;
[SerializeField]
private float clampDistanceMinRatio = 0.7f;
[SerializeField]
private float clampDistanceMaxRatio = 1.05f;
[SerializeField]
private float clampDistanceVelocityInfluence = 0.1f;
// 原点からの移動範囲拘束
[SerializeField]
private bool useClampPositionLength = false;
[SerializeField]
private BezierParam clampPositionLength = new BezierParam(0.03f, 0.2f, true, 0.0f, false);
[SerializeField]
private float clampPositionRatioX = 1.0f;
[SerializeField]
private float clampPositionRatioY = 1.0f;
[SerializeField]
private float clampPositionRatioZ = 1.0f;
[SerializeField]
private float clampPositionVelocityInfluence = 0.2f;
// 最大回転角度拘束
[SerializeField]
private bool useClampRotation = false;
[SerializeField]
private BezierParam clampRotationAngle = new BezierParam(0.0f, 45.0f, true, 0.0f, false); // [Algorithm 1]
[SerializeField]
private BezierParam clampRotationAngle2 = new BezierParam(0.0f, 45.0f, true, 0.0f, false); // [Algorithm 2]
[SerializeField]
private float clampRotationVelocityLimit = 1.0f; // [Algorithm 1]
[SerializeField]
private float clampRotationVelocityInfluence = 0.2f; // [Algorithm 1]
// 距離復元拘束
[SerializeField]
private float restoreDistanceVelocityInfluence = 1.0f;
[SerializeField]
private BezierParam structDistanceStiffness = new BezierParam(1.0f, 1.0f, false, 0.0f, false);
[SerializeField]
private bool useBendDistance = false;
[SerializeField]
private int bendDistanceMaxCount = 2;
[SerializeField]
private BezierParam bendDistanceStiffness = new BezierParam(0.5f, 0.5f, false, 0.0f, false);
[SerializeField]
private bool useNearDistance = false;
[SerializeField]
private int nearDistanceMaxCount = 3;
[SerializeField]
private float nearDistanceMaxDepth = 1.0f;
[SerializeField]
private BezierParam nearDistanceLength = new BezierParam(0.1f, 0.1f, true, 0.0f, false);
[SerializeField]
private BezierParam nearDistanceStiffness = new BezierParam(0.3f, 0.3f, false, 0.0f, false);
// 回転復元拘束
[SerializeField]
private bool useRestoreRotation = false;
[SerializeField]
private BezierParam restoreRotation = new BezierParam(0.05f, 0.005f, true, 0.0f, false); // [Algorithm 1]
[SerializeField]
private BezierParam restoreRotation2 = new BezierParam(0.05f, 0.005f, true, 0.0f, false); // [Algorithm 2]
[SerializeField]
private float restoreRotationVelocityInfluence = 0.2f; // [Algorithm 1]
[SerializeField]
private float restoreRotationVelocityInfluence2 = 0.2f; // [Algorithm 2]
// スプリング拘束
[SerializeField]
private bool useSpring = false;
[SerializeField]
private float springPower = 0.017f;
[SerializeField]
private float springRadius = 0.1f;
[SerializeField]
private float springScaleX = 1;
[SerializeField]
private float springScaleY = 1;
[SerializeField]
private float springScaleZ = 1;
[SerializeField]
private float springIntensity = 1.0f;
[SerializeField]
private BezierParam springDirectionAtten = new BezierParam(1.0f, 0.0f, true, 0.234f, true);
[SerializeField]
private BezierParam springDistanceAtten = new BezierParam(1.0f, 0.0f, true, 0.395f, true);
// スプリング回転調整拘束
public enum AdjustMode
{
Fixed = 0,
XYMove = 1,
XZMove = 2,
YZMove = 3,
}
[SerializeField]
private AdjustMode adjustMode;
[SerializeField]
private float adjustRotationPower = 5.0f;
// トライアングル曲げ拘束
[SerializeField]
private bool useTriangleBend = false;
//[SerializeField]
//private bool useTriangleBendIncludeFixed = false;
[SerializeField]
private BezierParam triangleBend = new BezierParam(1.0f, 1.0f, true, 0.0f, false); // [Algorithm 1]
[SerializeField]
private BezierParam triangleBend2 = new BezierParam(1.0f, 1.0f, true, 0.0f, false); // [Algorithm 2]
// ねじれ補正
[SerializeField]
private bool useTwistCorrection = false;
[SerializeField]
private float twistRecoveryPower = 0.2f;
// ボリューム拘束
[SerializeField]
private bool useVolume = false;
[SerializeField]
private float maxVolumeLength = 0.1f;
[SerializeField]
private BezierParam volumeStretchStiffness = new BezierParam(0.5f, 0.5f, true, 0.0f, false);
[SerializeField]
private BezierParam volumeShearStiffness = new BezierParam(0.5f, 0.5f, true, 0.0f, false);
// コライダーコリジョン拘束
[SerializeField]
private bool useCollision = false;
[SerializeField]
private float friction = 0.1f;
[SerializeField]
private float staticFriction = 0.03f;
// エッジコリジョン
//[SerializeField]
//private bool useEdgeCollision = false;
//[SerializeField]
//private float edgeCollisionRadius = 0.02f;
// 浸透制限
[SerializeField]
private bool usePenetration = false;
public enum PenetrationMode
{
SurfacePenetration = 0,
ColliderPenetration = 1,
//BonePenetration = 2,
}
[SerializeField]
private PenetrationMode penetrationMode = PenetrationMode.SurfacePenetration;
public enum PenetrationAxis
{
X = 0,
Y = 1,
Z = 2,
InverseX = 3,
InverseY = 4,
InverseZ = 5,
}
[SerializeField]
private PenetrationAxis penetrationAxis = PenetrationAxis.InverseZ;
[SerializeField]
private float penetrationMaxDepth = 1.0f;
[SerializeField]
private BezierParam penetrationConnectDistance = new BezierParam(0.1f, 0.2f, true, 0.0f, false);
//[SerializeField]
//private BezierParam penetrationStiffness = new BezierParam(1.0f, 1.0f, false, 0.0f, false);
[SerializeField]
private BezierParam penetrationDistance = new BezierParam(0.02f, 0.05f, true, 0.0f, false);
[SerializeField]
private BezierParam penetrationRadius = new BezierParam(0.3f, 1.0f, true, 0.0f, false);
// 回転補間
[SerializeField]
private bool useLineAvarageRotation = true;
[SerializeField]
private bool useFixedNonRotation = false;
// ベーススキニング
//[SerializeField]
//private bool useBaseSkinning = false;
// コライダー方向移動制限拘束
//[SerializeField]
//private bool useDirectionMoveLimit = false;
//[SerializeField]
//private BezierParam directionMoveLimit = new BezierParam(0.03f, 0.03f, true, 0.0f, false);
// セルフコリジョン拘束
//[SerializeField]
//private bool useSelfCollision = false;
//[SerializeField]
//private float selfCollisionInfluenceRange = 0.2f;
//[SerializeField]
//private int maxSelfCollisionCount = 6;
//[SerializeField]
//private BezierParam selfCollisionStiffness = new BezierParam(0.3f, 0.01f, true, 0.0f, false);
//[SerializeField]
//private BezierParam selfCollisionThickness = new BezierParam(0.01f, 0.01f, true, 0.0f, false);
//=========================================================================================
///
/// 変更チェック用(番号は変えないこと!)
///
public enum ParamType
{
Radius = 0,
Mass = 1,
Gravity = 2,
Drag = 3,
MaxVelocity = 4,
WorldInfluence = 5,
ClampDistance = 6,
ClampPosition = 7,
ClampRotation = 8,
RestoreDistance = 9,
RestoreRotation = 10,
Spring = 11,
AdjustRotation = 12,
AirLine = 13,
TriangleBend = 14,
Volume = 15,
ColliderCollision = 16,
RotationInterpolation = 17,
DistanceDisable = 18,
ExternalForce = 19,
Penetration = 20,
Algorithm = 21,
BaseSkinning = 22,
//DirectionMoveLimit,
//SelfCollision,
Max, // カウンタ用
}
// 変更記録セット
private HashSet changeSet = new HashSet();
public void SetChangeParam(ParamType ptype)
{
changeSet.Add(ptype);
}
public bool ChangedParam(ParamType ptype)
{
return changeSet.Contains(ptype);
}
public void ClearChangeParam()
{
changeSet.Clear();
}
//=========================================================================================
///
/// 各パラメータ別のハッシュを取得する
///
///
///
public int GetParamHash(BaseCloth cloth, ParamType ptype)
{
int hash = 0;
switch (ptype)
{
case ParamType.Algorithm:
hash += algorithm.GetDataHash();
break;
case ParamType.WorldInfluence:
hash += influenceTarget ? influenceTarget.GetDataHash() : 0;
break;
case ParamType.RestoreDistance:
if (useBendDistance)
{
hash += useBendDistance.GetDataHash();
hash += bendDistanceMaxCount.GetDataHash();
}
if (useNearDistance)
{
hash += useNearDistance.GetDataHash();
hash += nearDistanceMaxCount.GetDataHash();
hash += nearDistanceMaxDepth.GetDataHash();
}
break;
case ParamType.ClampDistance:
if (useClampDistanceRatio)
hash += useClampDistanceRatio.GetDataHash();
break;
case ParamType.ClampPosition:
if (useClampPositionLength)
hash += useClampPositionLength.GetDataHash();
break;
case ParamType.RestoreRotation:
if (useRestoreRotation)
{
hash += algorithm.GetDataHash(); // algorithm
hash += useRestoreRotation.GetDataHash();
}
break;
case ParamType.ClampRotation:
if (useClampRotation)
{
hash += algorithm.GetDataHash(); // algorithm
hash += useClampRotation.GetDataHash();
}
break;
case ParamType.TriangleBend:
if (useTriangleBend)
{
hash += algorithm.GetDataHash(); // algorithm
hash += useTriangleBend.GetDataHash();
hash += useTwistCorrection.GetDataHash();
}
break;
case ParamType.Penetration:
if (usePenetration)
{
hash += usePenetration.GetDataHash();
hash += penetrationMode.GetDataHash();
if (penetrationMode == PenetrationMode.SurfacePenetration)
{
hash += penetrationMaxDepth.GetDataHash();
hash += penetrationAxis.GetDataHash();
}
if (penetrationMode == PenetrationMode.ColliderPenetration)
{
hash += penetrationMaxDepth.GetDataHash();
hash += penetrationConnectDistance.GetDataHash();
hash += cloth.TeamData.ColliderList.GetDataHash();
hash += cloth.TeamData.PenetrationIgnoreColliderList.GetDataHash();
}
}
break;
case ParamType.Spring:
if (useSpring)
{
hash += useSpring.GetDataHash();
hash += springRadius.GetDataHash();
hash += springScaleX.GetDataHash();
hash += springScaleY.GetDataHash();
hash += springScaleZ.GetDataHash();
hash += springDirectionAtten.GetDataHash();
hash += springDistanceAtten.GetDataHash();
hash += springIntensity.GetDataHash();
}
break;
case ParamType.ColliderCollision:
if (useCollision)
{
hash += cloth.TeamData.ColliderList.GetDataHash();
}
break;
case ParamType.BaseSkinning:
// 一旦休眠
//if (cloth.SkinningMode == PhysicsTeam.TeamSkinningMode.GenerateFromBones)
//{
// hash += cloth.SkinningUpdateFixed.GetDataHash();
//}
break;
}
return hash;
}
//=========================================================================================
// algorithm
public Algorithm AlgorithmType
{
get => algorithm;
set => algorithm = value;
}
// radius
public void SetRadius(float sval, float eval)
{
radius.SetParam(sval, eval);
}
public float GetRadius(float depth)
{
return radius.Evaluate(depth);
}
public BezierParam GetRadius()
{
return radius;
}
// mass
public void SetMass(float sval, float eval, bool useEval = true, float cval = 0.0f, bool useCval = false)
{
mass.SetParam(sval, eval, useEval, cval, useCval);
}
public BezierParam GetMass()
{
return mass;
}
// gravity
public void SetGravity(bool sw, float sval = -9.8f, float eval = -9.8f)
{
useGravity = sw;
gravity.SetParam(sval, eval);
}
public bool UseGravity
{
get
{
return useGravity;
}
}
public BezierParam GetGravity()
{
if (useGravity)
return gravity;
else
return new BezierParam(0.0f);
}
public Vector3 GravityDirection
{
get
{
return gravityDirection;
}
set
{
gravityDirection = value;
}
}
#if false
// 重力の方向性減衰(現在は保留)
public void SetDirectionalDamping(bool sw, float sval = 1.0f, float eval = 0.1f, float curve = -0.5f, Transform target = null)
{
useDirectionalDamping = sw;
directionalDamping.SetParam(sval, eval, true, curve, true);
directionalDampingObject = target;
}
public bool UseDirectionalDamping
{
get
{
return useDirectionalDamping;
}
}
public Transform DirectionalDampingObject
{
get
{
return directionalDampingObject;
}
set
{
directionalDampingObject = value;
}
}
public BezierParam GetDirectionalDamping()
{
if (useGravity)
return directionalDamping;
else
return new BezierParam(0.0f);
}
#endif
// drag
public void SetDrag(bool sw, float sval = 0.015f, float eval = 0.015f)
{
useDrag = sw;
drag.SetParam(sval, eval);
}
public bool UseDrag
{
get
{
return useDrag;
}
}
public BezierParam GetDrag()
{
if (useDrag)
return drag;
else
return new BezierParam(0);
}
// max velocity
public void SetMaxVelocity(bool sw, float sval = 3, float eval = 3)
{
useMaxVelocity = sw;
maxVelocity.SetParam(sval, eval);
}
public bool UseMaxVelocity
{
get
{
return useMaxVelocity;
}
}
public BezierParam GetMaxVelocity()
{
if (useMaxVelocity)
return maxVelocity;
else
return new BezierParam(1000);
}
// external force
public void SetExternalForce(float massInfluence, float windInfluence, float windRandomScale, float windSynchronization)
{
this.massInfluence = massInfluence;
this.windInfluence = windInfluence;
this.windRandomScale = windRandomScale;
this.windSynchronization = windSynchronization;
}
public float MassInfluence
{
get => massInfluence;
set => massInfluence = value;
}
public BezierParam GetDepthInfluence() => depthInfluence;
public float WindInfluence
{
get => windInfluence;
set => windInfluence = value;
}
public float WindRandomScale
{
get => windRandomScale;
set => windRandomScale = value;
}
public float WindSynchronization
{
get => windSynchronization;
set => windSynchronization = value;
}
// world move/rot influence
public void SetWorldInfluence(float maxspeed, float moveval, float rotval)
{
maxMoveSpeed = maxspeed;
worldMoveInfluence.SetParam(moveval, moveval, false);
worldRotationInfluence.SetParam(rotval, rotval, false);
}
public BezierParam GetWorldMoveInfluence()
{
return worldMoveInfluence;
}
public BezierParam GetWorldRotationInfluence()
{
return worldRotationInfluence;
}
public Transform GetInfluenceTarget()
{
return influenceTarget;
}
public void SetInfluenceTarget(Transform t)
{
influenceTarget = t;
}
public float MaxMoveSpeed
{
get
{
return maxMoveSpeed;
}
set
{
maxMoveSpeed = value;
}
}
public float MaxRotationSpeed
{
get
{
return maxRotationSpeed;
}
set
{
maxRotationSpeed = value;
}
}
// reset teleport
public void SetTeleport(bool sw, float distance = 0.2f, float rotation = 45.0f, TeleportMode mode = TeleportMode.Reset)
{
useResetTeleport = sw;
teleportDistance = distance;
teleportRotation = rotation;
teleportMode = mode;
}
public bool UseResetTeleport
{
get
{
return useResetTeleport;
}
set
{
useResetTeleport = value;
}
}
public float TeleportDistance
{
get
{
//return useResetTeleport ? teleportDistance : 100000.0f;
return teleportDistance;
}
set
{
teleportDistance = value;
}
}
public float TeleportRotation
{
get
{
//return useResetTeleport ? teleportRotation : 360.0f;
return teleportRotation;
}
set
{
teleportRotation = value;
}
}
public TeleportMode TeleportResetMode
{
get
{
return teleportMode;
}
set
{
teleportMode = value;
}
}
// stabilize after reset
public float ResetStabilizationTime
{
get
{
return resetStabilizationTime;
}
set
{
resetStabilizationTime = value;
}
}
// disable distance
public void SetDistanceDisable(bool sw, float distance = 20.0f, float fadeDistance = 5.0f, Transform referenceObject = null)
{
useDistanceDisable = sw;
disableReferenceObject = referenceObject;
disableDistance = distance;
disableFadeDistance = fadeDistance;
}
public bool UseDistanceDisable
{
get
{
return useDistanceDisable;
}
set
{
useDistanceDisable = value;
}
}
public Transform DisableReferenceObject
{
get
{
return disableReferenceObject;
}
set
{
disableReferenceObject = value;
}
}
public float DisableDistance
{
get
{
return disableDistance;
}
set
{
disableDistance = value;
}
}
public float DisableFadeDistance
{
get
{
return disableFadeDistance;
}
set
{
disableFadeDistance = value;
}
}
// clamp distance
public void SetClampDistanceRatio(bool sw, float minval = 0.1f, float maxval = 1.05f, float influence = 0.2f)
{
useClampDistanceRatio = sw;
clampDistanceMinRatio = minval;
clampDistanceMaxRatio = maxval;
clampDistanceVelocityInfluence = influence;
}
public bool UseClampDistanceRatio
{
get
{
return useClampDistanceRatio;
}
}
public float ClampDistanceMinRatio
{
get
{
return useClampDistanceRatio ? clampDistanceMinRatio : 0;
}
}
public float ClampDistanceMaxRatio
{
get
{
return useClampDistanceRatio ? clampDistanceMaxRatio : 0;
}
}
public float ClampDistanceVelocityInfluence
{
get
{
return useClampDistanceRatio ? clampDistanceVelocityInfluence : 1;
}
}
// clamp position
public void SetClampPositionLength(bool sw, float sval = 0.03f, float eval = 0.2f, float ratioX = 1, float ratioY = 1, float ratioZ = 1, float influence = 0.2f)
{
useClampPositionLength = sw;
clampPositionLength.SetParam(sval, eval);
clampPositionRatioX = ratioX;
clampPositionRatioY = ratioY;
clampPositionRatioZ = ratioZ;
clampPositionVelocityInfluence = influence;
}
public bool UseClampPositionLength
{
get
{
return useClampPositionLength;
}
}
public Vector3 ClampPositionAxisRatio
{
get
{
return new Vector3(clampPositionRatioX, clampPositionRatioY, clampPositionRatioZ);
}
}
public BezierParam GetClampPositionLength()
{
return clampPositionLength;
}
public float ClampPositionVelocityInfluence
{
get
{
return useClampPositionLength ? clampPositionVelocityInfluence : 1;
}
}
// clamp rotation
public void SetClampRotationAngle(bool sw, float sval = 0.0f, float eval = 180.0f, float influence = 0.2f)
{
useClampRotation = sw;
clampRotationAngle.SetParam(sval, eval);
clampRotationAngle2.SetParam(sval, eval);
clampRotationVelocityInfluence = influence;
}
public bool UseClampRotation => useClampRotation;
public BezierParam GetClampRotationAngle(Algorithm algo)
{
if (algo == Algorithm.Algorithm_2)
return clampRotationAngle2;
else
return clampRotationAngle;
}
public float ClampRotationVelocityInfluence
{
get
{
return useClampRotation ? clampRotationVelocityInfluence : 1;
}
}
public float GetClampRotationVelocityLimit(Algorithm algo)
{
if (useClampRotation)
{
if (algo == Algorithm.Algorithm_2)
return 1.0f; // On
else
return clampRotationVelocityLimit;
}
else
return 0.0f;
}
// restore distance
public void SetRestoreDistance(float influence = 1.0f, float structStiffness = 1.0f)
{
restoreDistanceVelocityInfluence = influence;
structDistanceStiffness.SetParam(structStiffness, structStiffness, false);
}
public float RestoreDistanceVelocityInfluence
{
get
{
return restoreDistanceVelocityInfluence;
}
}
public BezierParam GetStructDistanceStiffness()
{
return structDistanceStiffness;
}
public bool UseBendDistance
{
get
{
return useBendDistance;
}
}
public int BendDistanceMaxCount
{
get
{
return bendDistanceMaxCount;
}
}
public BezierParam GetBendDistanceStiffness()
{
return bendDistanceStiffness;
}
public bool UseNearDistance
{
get
{
return useNearDistance;
}
}
public int NearDistanceMaxCount
{
get
{
return nearDistanceMaxCount;
}
}
public float NearDistanceMaxDepth
{
get
{
return nearDistanceMaxDepth;
}
}
public BezierParam GetNearDistanceLength()
{
return nearDistanceLength;
}
public BezierParam GetNearDistanceStiffness()
{
return nearDistanceStiffness;
}
// restore rotation
public void SetRestoreRotation(bool sw, float sval = 0.02f, float eval = 0.001f, float influence = 0.3f)
{
useRestoreRotation = sw;
restoreRotation.SetParam(sval, eval);
restoreRotation2.SetParam(sval, eval);
restoreRotationVelocityInfluence = influence;
restoreRotationVelocityInfluence2 = influence;
}
public bool UseRestoreRotation
{
get
{
return useRestoreRotation;
}
}
public BezierParam GetRestoreRotationPower(Algorithm algo)
{
if (algo == Algorithm.Algorithm_2)
return restoreRotation2;
else
return restoreRotation;
}
public float GetRestoreRotationVelocityInfluence(Algorithm algo)
{
if (algo == Algorithm.Algorithm_2)
return restoreRotationVelocityInfluence2;
else
return restoreRotationVelocityInfluence;
}
// spring
public void SetSpring(bool sw, float power = 0.0f, float r = 0.0f, float sclx = 1, float scly = 1, float sclz = 1, float intensity = 1)
{
useSpring = sw;
springPower = power;
springRadius = r;
springScaleX = sclx;
springScaleY = scly;
springScaleZ = sclz;
springIntensity = intensity;
}
public void SetSpringDirectionAtten(float sval, float eval, float cval)
{
springDirectionAtten.SetParam(sval, eval, true, cval, true);
}
public void SetSpringDistanceAtten(float sval, float eval, float cval)
{
springDistanceAtten.SetParam(sval, eval, true, cval, true);
}
public bool UseSpring
{
get
{
return useSpring;
}
}
public float GetSpringPower()
{
if (useSpring)
return springPower;
else
return 0;
}
public float SpringRadius
{
get
{
return springRadius;
}
}
public Vector3 SpringRadiusScale
{
get
{
return new Vector3(springScaleX, springScaleY, springScaleZ);
}
}
public float SpringIntensity
{
get
{
return springIntensity;
}
}
public float GetSpringDirectionAtten(float ratio)
{
return springDirectionAtten.Evaluate(ratio);
}
public float GetSpringDistanceAtten(float ratio)
{
return springDistanceAtten.Evaluate(ratio);
}
// adjust spring rotation
public void SetAdjustRotation(AdjustMode amode = AdjustMode.Fixed, float power = 0.0f)
{
adjustMode = amode;
adjustRotationPower = power;
}
public AdjustMode AdjustRotationMode
{
get
{
return adjustMode;
}
}
public Vector3 AdjustRotationVector
{
get
{
// 移動軸調整の場合は、各軸の回転力が入る
Vector3 vec = Vector3.one;
vec *= adjustRotationPower;
return vec;
}
}
// triangle bend
public void SetTriangleBend(bool sw, float sval = 1.0f, float eval = 1.0f)
{
useTriangleBend = sw;
triangleBend.SetParam(sval, eval);
triangleBend2.SetParam(sval, eval);
}
public bool UseTriangleBend
{
get
{
return useTriangleBend;
}
}
//public bool UseTrianlgeBendIncludeFixed => useTriangleBendIncludeFixed;
public BezierParam GetTriangleBendStiffness(Algorithm algo)
{
if (algo == Algorithm.Algorithm_2)
return triangleBend2;
else
return triangleBend;
}
// Twist
internal bool GetUseTwistCorrection(Algorithm algo)
{
if (algo == Algorithm.Algorithm_2)
return useTwistCorrection;
else
return false;
}
internal float TwistRecoveryPower => twistRecoveryPower;
// volume
public void SetVolume(bool sw, float maxLength = 0.05f, float stiffness = 0.5f, float shear = 0.5f)
{
useVolume = sw;
maxVolumeLength = maxLength;
volumeShearStiffness.SetParam(stiffness, stiffness, false);
volumeShearStiffness.SetParam(shear, shear, false);
}
public bool UseVolume
{
get
{
return useVolume;
}
}
public float GetMaxVolumeLength()
{
if (useVolume)
{
return maxVolumeLength;
}
else
return 0;
}
public BezierParam GetVolumeStretchStiffness()
{
return volumeStretchStiffness;
}
public BezierParam GetVolumeShearStiffness()
{
return volumeShearStiffness;
}
// collider collision
public void SetCollision(bool sw, float dynamicFriction = 0.1f, float staticFriction = 0.03f)
{
useCollision = sw;
this.friction = dynamicFriction;
this.staticFriction = staticFriction;
}
public bool UseCollision => useCollision;
public float DynamicFriction => friction;
public float StaticFriction => staticFriction;
//public bool KeepInitialShape
//{
// get
// {
// return keepInitialShape;
// }
//}
// penetration
public bool UsePenetration
{
get
{
return usePenetration;
}
set
{
usePenetration = value;
}
}
public PenetrationMode GetPenetrationMode()
{
return penetrationMode;
}
public PenetrationAxis GetPenetrationAxis()
{
return penetrationAxis;
}
public float PenetrationMaxDepth
{
get
{
return penetrationMaxDepth;
}
}
public BezierParam GetPenetrationConnectDistance()
{
return penetrationConnectDistance;
}
//public BezierParam GetPenetrationStiffness()
//{
// return penetrationStiffness;
//}
public BezierParam GetPenetrationRadius()
{
return penetrationRadius;
}
public BezierParam GetPenetrationDistance()
{
return penetrationDistance;
}
// rotation interpolation
public bool UseLineAvarageRotation
{
get
{
return useLineAvarageRotation;
}
}
public bool UseFixedNonRotation
{
get
{
return useFixedNonRotation;
}
}
// base skinning
//public bool UseBaseSkinning
//{
// get
// {
// return useBaseSkinning;
// }
//}
// self collision
//public void SetSelfCollision(bool sw)
//{
// useSelfCollision = sw;
//}
//public bool UseSelfCollision
//{
// get
// {
// return useSelfCollision;
// }
//}
//public float SelfCollisionINfluenceRange
//{
// get
// {
// return selfCollisionInfluenceRange;
// }
//}
//public int MaxSelfCollisionCount
//{
// get
// {
// return maxSelfCollisionCount;
// }
//}
//public float GetSelfCollisionStiffness(float depth)
//{
// if (useSelfCollision)
// return selfCollisionStiffness.Evaluate(depth);
// else
// return 0.0f;
//}
//public float GetSelfCollisionThickness(float depth)
//{
// if (useSelfCollision)
// return selfCollisionThickness.Evaluate(depth);
// else
// return 0.0f;
//}
// direction move limit
//public void SetDirectionMoveLimit(bool sw, float sval = 0.05f, float eval = 0.05f)
//{
// useDirectionMoveLimit = sw;
// directionMoveLimit.SetParam(sval, eval);
//}
//public bool UseDirectionMoveLimit
//{
// get
// {
// return useDirectionMoveLimit;
// }
//}
//public float GetDirectionMoveLength(float depth)
//{
// if (useDirectionMoveLimit)
// return directionMoveLimit.Evaluate(depth);
// else
// return -1; // 無効
//}
//=========================================================================================
///
/// 古いパラメータを最新アルゴリズム用にコンバートする
///
public void ConvertToLatestAlgorithmParameter()
{
// ClampRotation
clampRotationAngle2 = clampRotationAngle.Clone();
// RestoreRotation
restoreRotation2 = restoreRotation.Clone();
restoreRotationVelocityInfluence2 = restoreRotationVelocityInfluence;
// Triangle Bend
triangleBend2 = triangleBend.Clone();
}
}
}