123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804 |
- // Magica Cloth.
- // Copyright (c) MagicaSoft, 2020-2022.
- // https://magicasoft.jp
- using System.Collections.Generic;
- using UnityEngine;
- namespace MagicaCloth
- {
- /// <summary>
- /// クロスの実行時設定
- /// </summary>
- public class ClothSetup
- {
- // チームのボーンインデックス
- int teamBoneIndex = -1;
- // 重力方向減衰ボーンインデックス
- //int teamDirectionalDampingBoneIndex;
- /// <summary>
- /// 距離によるブレンド率
- /// </summary>
- float distanceBlendRatio = 1.0f;
- //=========================================================================================
- /// <summary>
- /// クロス初期化
- /// </summary>
- /// <param name="team"></param>
- /// <param name="meshData">メッシュデータ(不要ならnull)</param>
- /// <param name="clothData"></param>
- /// <param name="param"></param>
- /// <param name="funcUserFlag">各頂点の追加フラグ設定アクション</param>
- /// <param name="funcUserTransform">各頂点の連動トランスフォーム設定アクション</param>
- public void ClothInit(
- PhysicsTeam team,
- MeshData meshData,
- ClothData clothData,
- ClothParams param,
- System.Func<int, uint> funcUserFlag
- )
- {
- var manager = MagicaPhysicsManager.Instance;
- var compute = manager.Compute;
- // チームデータ設定
- manager.Team.SetMass(team.TeamId, param.GetMass());
- manager.Team.SetGravity(team.TeamId, param.GetGravity());
- manager.Team.SetGravityDirection(team.TeamId, param.GravityDirection);
- manager.Team.SetDrag(team.TeamId, param.GetDrag());
- manager.Team.SetMaxVelocity(team.TeamId, param.GetMaxVelocity());
- manager.Team.SetDepthInfluence(team.TeamId, param.GetDepthInfluence());
- manager.Team.SetFriction(team.TeamId, param.DynamicFriction, param.StaticFriction);
- manager.Team.SetExternalForce(team.TeamId, param.MassInfluence, param.WindInfluence, param.WindRandomScale, param.WindSynchronization);
- //manager.Team.SetDirectionalDamping(team.TeamId, param.GetDirectionalDamping());
- // ワールド移動影響
- manager.Team.SetWorldInfluence(
- team.TeamId,
- param.MaxMoveSpeed,
- param.MaxRotationSpeed,
- param.GetWorldMoveInfluence(),
- param.GetWorldRotationInfluence(),
- param.UseResetTeleport,
- param.TeleportDistance,
- param.TeleportRotation,
- param.ResetStabilizationTime,
- param.TeleportResetMode,
- param.UseClampRotation,
- param.GetClampRotationAngle(clothData.clampRotationAlgorithm)
- );
- int vcnt = clothData.VertexUseCount;
- Debug.Assert(vcnt > 0);
- Debug.Assert(clothData.useVertexList.Count > 0);
- // パーティクル追加(使用頂点のみ)
- var c = team.CreateParticle(team.TeamId, clothData.useVertexList.Count,
- // flag
- (i) =>
- {
- bool isFix = clothData.IsFixedVertex(i) || clothData.IsExtendVertex(i); // 固定もしくは拡張
- uint flag = 0;
- if (funcUserFlag != null)
- flag = funcUserFlag(i); // ユーザーフラグ
- if (isFix)
- flag |= (PhysicsManagerParticleData.Flag_Kinematic | PhysicsManagerParticleData.Flag_Step_Update);
- if (clothData.IsFlag(i, ClothData.VertexFlag_TriangleRotation))
- flag |= PhysicsManagerParticleData.Flag_TriangleRotation; // TriangleWorkerによる回転補間
- //flag |= (param.UseCollision && !isFix) ? PhysicsManagerParticleData.Flag_Collision : 0;
- flag |= PhysicsManagerParticleData.Flag_Reset_Position;
- return flag;
- },
- // wpos
- null,
- // wrot
- null,
- // depth
- (i) =>
- {
- return clothData.vertexDepthList[i];
- },
- // radius
- (i) =>
- {
- float depth = clothData.vertexDepthList[i];
- return param.GetRadius(depth);
- },
- // target local pos
- null
- );
- manager.Team.SetParticleChunk(team.TeamId, c);
- // 原点スプリング拘束
- if (param.UseSpring)
- {
- // 拘束データ
- int group = compute.Spring.AddGroup(
- team.TeamId,
- param.UseSpring,
- param.GetSpringPower()
- );
- var teamData = manager.Team.teamDataList[team.TeamId];
- teamData.springGroupIndex = (short)group;
- manager.Team.teamDataList[team.TeamId] = teamData;
- }
- // 原点移動制限
- if (param.UseClampPositionLength)
- {
- // 拘束データ
- int group = compute.ClampPosition.AddGroup(
- team.TeamId,
- param.UseClampPositionLength,
- param.GetClampPositionLength(),
- param.ClampPositionAxisRatio,
- param.ClampPositionVelocityInfluence
- );
- var teamData = manager.Team.teamDataList[team.TeamId];
- teamData.clampPositionGroupIndex = (short)group;
- manager.Team.teamDataList[team.TeamId] = teamData;
- }
- // ルートからの最大最小距離拘束
- if (param.UseClampDistanceRatio && clothData.ClampDistanceConstraintCount > 0)
- {
- // 拘束データ
- int group = compute.ClampDistance.AddGroup(
- team.TeamId,
- param.UseClampDistanceRatio,
- param.ClampDistanceMinRatio,
- param.ClampDistanceMaxRatio,
- param.ClampDistanceVelocityInfluence,
- clothData.rootDistanceDataList,
- clothData.rootDistanceReferenceList
- );
- var teamData = manager.Team.teamDataList[team.TeamId];
- teamData.clampDistanceGroupIndex = (short)group;
- manager.Team.teamDataList[team.TeamId] = teamData;
- }
- #if false
- // パーティクル最大最小距離拘束
- if(param.UseClampDistanceRatio && clothData.ClampDistance2ConstraintCount > 0)
- {
- // 拘束データ
- int group = compute.ClampDistance2.AddGroup(
- team.TeamId,
- param.UseClampDistanceRatio,
- param.ClampDistanceMinRatio,
- param.ClampDistanceMaxRatio,
- param.ClampDistanceVelocityInfluence,
- clothData.clampDistance2DataList,
- clothData.clampDistance2RootInfoList
- );
- var teamData = manager.Team.teamDataList[team.TeamId];
- teamData.clampDistance2GroupIndex = (short)group;
- manager.Team.teamDataList[team.TeamId] = teamData;
- }
- #endif
- // 距離復元拘束
- if (clothData.StructDistanceConstraintCount > 0 || clothData.BendDistanceConstraintCount > 0 || clothData.NearDistanceConstraintCount > 0)
- {
- // 拘束データ
- int group = compute.RestoreDistance.AddGroup(
- team.TeamId,
- param.GetMass(),
- param.RestoreDistanceVelocityInfluence,
- param.GetStructDistanceStiffness(),
- clothData.structDistanceDataList,
- clothData.structDistanceReferenceList,
- param.UseBendDistance,
- param.GetBendDistanceStiffness(),
- clothData.bendDistanceDataList,
- clothData.bendDistanceReferenceList,
- param.UseNearDistance,
- param.GetNearDistanceStiffness(),
- clothData.nearDistanceDataList,
- clothData.nearDistanceReferenceList
- );
- var teamData = manager.Team.teamDataList[team.TeamId];
- teamData.restoreDistanceGroupIndex = (short)group;
- manager.Team.teamDataList[team.TeamId] = teamData;
- }
- // 回転復元拘束[Algorithm 1]
- if (clothData.restoreRotationAlgorithm == ClothParams.Algorithm.Algorithm_1)
- {
- if (param.UseRestoreRotation && clothData.RestoreRotationConstraintCount > 0)
- {
- // 拘束データ
- int group = compute.RestoreRotation.AddGroup(
- team.TeamId,
- param.UseRestoreRotation,
- param.GetRestoreRotationPower(clothData.restoreRotationAlgorithm),
- param.GetRestoreRotationVelocityInfluence(clothData.restoreRotationAlgorithm),
- clothData.restoreRotationDataList,
- clothData.restoreRotationReferenceList
- );
- var teamData = manager.Team.teamDataList[team.TeamId];
- teamData.restoreRotationGroupIndex = (short)group;
- manager.Team.teamDataList[team.TeamId] = teamData;
- }
- }
- // 最大回転復元拘束[Algorithm 1]
- if (clothData.clampRotationAlgorithm == ClothParams.Algorithm.Algorithm_1)
- {
- if (param.UseClampRotation)
- {
- // 拘束データ
- int group = compute.ClampRotation.AddGroup(
- team.TeamId,
- param.UseClampRotation,
- param.GetClampRotationAngle(clothData.clampRotationAlgorithm),
- param.ClampRotationVelocityInfluence,
- clothData.clampRotationDataList,
- clothData.clampRotationRootInfoList
- );
- var teamData = manager.Team.teamDataList[team.TeamId];
- teamData.clampRotationGroupIndex = (short)group;
- manager.Team.teamDataList[team.TeamId] = teamData;
- }
- }
- // 複合回転拘束[Algorithm 2]
- if (param.UseClampRotation || param.UseRestoreRotation)
- {
- if (clothData.CompositeRotationCount > 0)
- {
- int group = compute.CompositeRotation.AddGroup(
- team.TeamId,
- param.UseClampRotation,
- param.GetClampRotationAngle(ClothParams.Algorithm.Algorithm_2),
- param.UseRestoreRotation,
- param.GetRestoreRotationPower(ClothParams.Algorithm.Algorithm_2),
- param.GetRestoreRotationVelocityInfluence(ClothParams.Algorithm.Algorithm_2),
- clothData.compositeRotationDataList,
- clothData.compositeRotationRootInfoList
- );
- var teamData = manager.Team.teamDataList[team.TeamId];
- teamData.compositeRotationGroupIndex = (short)group;
- manager.Team.teamDataList[team.TeamId] = teamData;
- }
- }
- // ねじれ拘束
- if (clothData.TwistConstraintCount > 0 && clothData.triangleBendAlgorithm == ClothParams.Algorithm.Algorithm_2)
- {
- // 拘束データ
- int group = compute.Twist.AddGroup(
- team.TeamId,
- param.UseTriangleBend && param.GetUseTwistCorrection(clothData.triangleBendAlgorithm),
- param.TwistRecoveryPower,
- clothData.twistDataList,
- clothData.twistReferenceList
- );
- var teamData = manager.Team.teamDataList[team.TeamId];
- teamData.twistGroupIndex = (short)group;
- manager.Team.teamDataList[team.TeamId] = teamData;
- }
- // トライアングルベンド拘束
- if (param.UseTriangleBend && clothData.TriangleBendConstraintCount > 0)
- {
- int group = compute.TriangleBend.AddGroup(
- team.TeamId,
- param.UseTriangleBend,
- clothData.triangleBendAlgorithm,
- param.GetTriangleBendStiffness(clothData.triangleBendAlgorithm),
- //param.UseTrianlgeBendIncludeFixed,
- clothData.triangleBendDataList,
- clothData.triangleBendReferenceList,
- clothData.triangleBendWriteBufferCount
- );
- var teamData = manager.Team.teamDataList[team.TeamId];
- teamData.triangleBendGroupIndex = (short)group;
- manager.Team.teamDataList[team.TeamId] = teamData;
- }
- // コライダーコリジョン
- if (param.UseCollision)
- {
- var teamData = manager.Team.teamDataList[team.TeamId];
- // 形状維持フラグ
- //teamData.SetFlag(PhysicsManagerTeamData.Flag_Collision_KeepShape, param.KeepInitialShape);
- teamData.SetFlag(PhysicsManagerTeamData.Flag_Collision, param.UseCollision);
- #if false
- // エッジコリジョン拘束
- if (param.UseEdgeCollision && clothData.EdgeCollisionConstraintCount > 0)
- {
- int group = compute.EdgeCollision.AddGroup(
- team.TeamId,
- param.UseEdgeCollision,
- param.EdgeCollisionRadius,
- clothData.edgeCollisionDataList,
- clothData.edgeCollisionReferenceList,
- clothData.edgeCollisionWriteBufferCount
- );
- teamData.edgeCollisionGroupIndex = (short)group;
- }
- #endif
- manager.Team.teamDataList[team.TeamId] = teamData;
- }
- // 浸透制限
- if (param.UsePenetration && clothData.PenetrationCount > 0)
- {
- int group = compute.Penetration.AddGroup(
- team.TeamId,
- param.UsePenetration,
- //param.GetPenetrationMode(),
- clothData.penetrationMode, // データ作成時のモード
- param.GetPenetrationDistance(),
- param.GetPenetrationRadius(),
- param.PenetrationMaxDepth,
- clothData.penetrationDataList,
- clothData.penetrationReferenceList,
- clothData.penetrationDirectionDataList
- );
- var teamData = manager.Team.teamDataList[team.TeamId];
- teamData.penetrationGroupIndex = (short)group;
- manager.Team.teamDataList[team.TeamId] = teamData;
- }
- #if false // 一旦休眠
- // ベーススキニング(ワーカー)
- if (team.SkinningMode == PhysicsTeam.TeamSkinningMode.GenerateFromBones && clothData.BaseSkinningCount > 0)
- {
- int group = compute.BaseSkinningWorker.AddGroup(
- team.TeamId,
- true,
- team.SkinningUpdateFixed,
- clothData.baseSkinningDataList,
- clothData.baseSkinningBindPoseList
- );
- var teamData = manager.Team.teamDataList[team.TeamId];
- teamData.baseSkinningGroupIndex = (short)group;
- manager.Team.teamDataList[team.TeamId] = teamData;
- }
- #endif
- #if false
- // ボリューム拘束
- if (param.UseVolume && clothData.VolumeConstraintCount > 0)
- {
- //var sw = new StopWatch().Start();
- int group = compute.Volume.AddGroup(
- team.TeamId,
- param.UseVolume,
- param.GetVolumeStretchStiffness(),
- param.GetVolumeShearStiffness(),
- clothData.volumeDataList,
- clothData.volumeReferenceList,
- clothData.volumeWriteBufferCount
- );
- var teamData = manager.Team.teamDataList[team.TeamId];
- teamData.volumeGroupIndex = group;
- manager.Team.teamDataList[team.TeamId] = teamData;
- //sw.Stop();
- //Debug.Log("Volume.AddGroup():" + sw.ElapsedMilliseconds);
- }
- #endif
- // 回転調整(これはワーカー):BoneSpring / MeshSpringのみ
- if (team is MagicaBoneSpring || team is MagicaMeshSpring)
- {
- // 拘束データ
- int group = compute.AdjustRotationWorker.AddGroup(
- team.TeamId,
- true,
- (int)param.AdjustRotationMode,
- param.AdjustRotationVector,
- clothData.adjustRotationDataList
- );
- var teamData = manager.Team.teamDataList[team.TeamId];
- teamData.adjustRotationGroupIndex = (short)group;
- manager.Team.teamDataList[team.TeamId] = teamData;
- }
- // ライン回転調整(ワーカー)
- if (clothData.lineRotationDataList != null && clothData.lineRotationDataList.Length > 0)
- {
- // 拘束データ
- int group = compute.LineWorker.AddGroup(
- team.TeamId,
- param.UseLineAvarageRotation,
- clothData.lineRotationDataList,
- clothData.lineRotationRootInfoList
- );
- var teamData = manager.Team.teamDataList[team.TeamId];
- teamData.lineWorkerGroupIndex = (short)group;
- manager.Team.teamDataList[team.TeamId] = teamData;
- }
- // トライアングル回転調整(ワーカー)
- if (clothData.triangleRotationDataList != null && clothData.triangleRotationDataList.Length > 0)
- {
- // 拘束データ
- int group = compute.TriangleWorker.AddGroup(
- team.TeamId,
- clothData.triangleRotationDataList,
- clothData.triangleRotationIndexList
- );
- var teamData = manager.Team.teamDataList[team.TeamId];
- teamData.triangleWorkerGroupIndex = (short)group;
- manager.Team.teamDataList[team.TeamId] = teamData;
- }
- // 回転補間
- manager.Team.SetFlag(team.TeamId, PhysicsManagerTeamData.Flag_FixedNonRotation, param.UseFixedNonRotation);
- }
- //=========================================================================================
- /// <summary>
- /// クロス破棄
- /// </summary>
- public void ClothDispose(PhysicsTeam team)
- {
- if (MagicaPhysicsManager.IsInstance() == false)
- return;
- // コンストレイント解放
- MagicaPhysicsManager.Instance.Compute.RemoveTeam(team.TeamId);
- // パーティクル解放
- team.RemoveAllParticle();
- }
- //=========================================================================================
- public void ClothActive(PhysicsTeam team, ClothParams param, ClothData clothData)
- {
- var manager = MagicaPhysicsManager.Instance;
- // ワールド移動影響ボーンを登録
- Transform influenceTarget = param.GetInfluenceTarget() ? param.GetInfluenceTarget() : team.transform;
- teamBoneIndex = manager.Bone.AddBone(influenceTarget);
- manager.Team.SetBoneIndex(team.TeamId, teamBoneIndex, clothData.initScale);
- team.InfluenceTarget = influenceTarget;
- // ベーススキニング用ボーンを登録
- // 一旦休眠
- //manager.Team.AddSkinningBoneIndex(team.TeamId, team.TeamData.SkinningBoneList);
- }
- public void ClothInactive(PhysicsTeam team)
- {
- if (MagicaPhysicsManager.IsInstance() == false)
- return;
- var manager = MagicaPhysicsManager.Instance;
- // 自身の登録ボーン開放
- manager.Bone.RemoveBone(teamBoneIndex);
- manager.Team.SetBoneIndex(team.TeamId, -1, Vector3.zero);
- // ベーススキニング用ボーンを解除
- manager.Team.RemoveSkinningBoneIndex(team.TeamId);
- }
- /// <summary>
- /// アバター着せ替えによるボーン置換
- /// </summary>
- /// <param name="boneReplaceDict"></param>
- internal void ReplaceBone<T>(PhysicsTeam team, ClothParams param, Dictionary<T, Transform> boneReplaceDict) where T : class
- {
- // この呼び出しは ClothActive() の前なので注意!
- // ワールド移動影響ボーン切り替え
- Transform influenceTarget = param.GetInfluenceTarget();
- if (influenceTarget)
- param.SetInfluenceTarget(MeshUtility.GetReplaceBone(influenceTarget, boneReplaceDict));
- //if (influenceTarget && boneReplaceDict.ContainsKey(influenceTarget))
- //{
- // param.SetInfluenceTarget(boneReplaceDict[influenceTarget]);
- //}
- }
- /// <summary>
- /// 現在使用しているボーンを格納して返す
- /// </summary>
- /// <returns></returns>
- internal HashSet<Transform> GetUsedBones(PhysicsTeam team, ClothParams param)
- {
- var bones = new HashSet<Transform>();
- bones.Add(param.GetInfluenceTarget());
- return bones;
- }
- /// <summary>
- /// UnityPhysicsでの更新の変更
- /// </summary>
- /// <param name="sw"></param>
- public void ChangeUseUnityPhysics(bool sw)
- {
- MagicaPhysicsManager.Instance.Bone.ChangeUnityPhysicsCount(teamBoneIndex, sw);
- }
- //=========================================================================================
- /// <summary>
- /// 距離によるブレンド率
- /// </summary>
- public float DistanceBlendRatio
- {
- get
- {
- return distanceBlendRatio;
- }
- set
- {
- distanceBlendRatio = value;
- }
- }
- //=========================================================================================
- /// <summary>
- /// ランタイムデータ変更
- /// </summary>
- public void ChangeData(PhysicsTeam team, ClothParams param, ClothData clothData)
- {
- if (Application.isPlaying == false)
- return;
- if (MagicaPhysicsManager.IsInstance() == false)
- return;
- if (team == null)
- return;
- var manager = MagicaPhysicsManager.Instance;
- var compute = manager.Compute;
- bool changeMass = false;
- // 半径
- if (param.ChangedParam(ClothParams.ParamType.Radius))
- {
- // これはパーティクルごと
- for (int i = 0; i < team.ParticleChunk.dataLength; i++)
- {
- int pindex = team.ParticleChunk.startIndex + i;
- float depth = manager.Particle.depthList[pindex];
- float radius = param.GetRadius(depth);
- manager.Particle.SetRadius(pindex, radius);
- }
- }
- // 重量
- if (param.ChangedParam(ClothParams.ParamType.Mass))
- {
- manager.Team.SetMass(team.TeamId, param.GetMass());
- changeMass = true;
- }
- // 重力係数
- if (param.ChangedParam(ClothParams.ParamType.Gravity))
- {
- manager.Team.SetGravity(team.TeamId, param.GetGravity());
- manager.Team.SetGravityDirection(team.TeamId, param.GravityDirection);
- //manager.Team.SetDirectionalDamping(team.TeamId, param.GetDirectionalDamping());
- //manager.Team.SetFlag(team.TeamId, PhysicsManagerTeamData.Flag_DirectionalDamping, param.UseDirectionalDamping);
- }
- // 空気抵抗
- if (param.ChangedParam(ClothParams.ParamType.Drag))
- {
- manager.Team.SetDrag(team.TeamId, param.GetDrag());
- }
- // 最大速度
- if (param.ChangedParam(ClothParams.ParamType.MaxVelocity))
- {
- manager.Team.SetMaxVelocity(team.TeamId, param.GetMaxVelocity());
- }
- // 外力
- if (param.ChangedParam(ClothParams.ParamType.ExternalForce))
- {
- manager.Team.SetExternalForce(team.TeamId, param.MassInfluence, param.WindInfluence, param.WindRandomScale, param.WindSynchronization);
- manager.Team.SetDepthInfluence(team.TeamId, param.GetDepthInfluence());
- }
- // チームの摩擦係数変更
- if (param.ChangedParam(ClothParams.ParamType.ColliderCollision))
- manager.Team.SetFriction(team.TeamId, param.DynamicFriction, param.StaticFriction);
- // チームワールド移動影響変更
- if (param.ChangedParam(ClothParams.ParamType.WorldInfluence))
- {
- manager.Team.SetWorldInfluence(
- team.TeamId,
- param.MaxMoveSpeed,
- param.MaxRotationSpeed,
- param.GetWorldMoveInfluence(),
- param.GetWorldRotationInfluence(),
- param.UseResetTeleport,
- param.TeleportDistance,
- param.TeleportRotation,
- param.ResetStabilizationTime,
- param.TeleportResetMode,
- param.UseClampRotation,
- param.GetClampRotationAngle(clothData.clampRotationAlgorithm)
- );
- }
- // 距離復元拘束パラメータ再設定
- if (param.ChangedParam(ClothParams.ParamType.RestoreDistance) || changeMass)
- {
- compute.RestoreDistance.ChangeParam(
- team.TeamId,
- param.GetMass(),
- param.RestoreDistanceVelocityInfluence,
- param.GetStructDistanceStiffness(),
- param.UseBendDistance,
- param.GetBendDistanceStiffness(),
- param.UseNearDistance,
- param.GetNearDistanceStiffness()
- );
- }
- // トライアングルベンド拘束パラメータ再設定
- if (param.ChangedParam(ClothParams.ParamType.TriangleBend))
- {
- compute.TriangleBend.ChangeParam(
- team.TeamId,
- param.UseTriangleBend,
- param.GetTriangleBendStiffness(clothData.triangleBendAlgorithm)
- //param.UseTrianlgeBendIncludeFixed
- );
- compute.Twist.ChangeParam(
- team.TeamId,
- param.UseTriangleBend && param.GetUseTwistCorrection(clothData.triangleBendAlgorithm),
- param.TwistRecoveryPower
- );
- }
- // ボリューム拘束パラメータ再設定
- //if (param.ChangedParam(ClothParams.ParamType.Volume))
- //{
- // compute.Volume.ChangeParam(team.TeamId, param.UseVolume, param.GetVolumeStretchStiffness(), param.GetVolumeShearStiffness());
- //}
- // ルートからの最小最大距離拘束パラメータ再設定
- if (param.ChangedParam(ClothParams.ParamType.ClampDistance))
- {
- compute.ClampDistance.ChangeParam(team.TeamId, param.UseClampDistanceRatio, param.ClampDistanceMinRatio, param.ClampDistanceMaxRatio, param.ClampDistanceVelocityInfluence);
- }
- #if false
- // パーティクルからの最大最小距離拘束パラメータ再設定
- if (param.ChangedParam(ClothParams.ParamType.ClampDistance))
- {
- compute.ClampDistance2.ChangeParam(team.TeamId, param.UseClampDistanceRatio, param.ClampDistanceMinRatio, param.ClampDistanceMaxRatio, param.ClampDistanceVelocityInfluence);
- }
- #endif
- // 移動範囲拘束パラメータ再設定
- if (param.ChangedParam(ClothParams.ParamType.ClampPosition))
- {
- compute.ClampPosition.ChangeParam(team.TeamId, param.UseClampPositionLength, param.GetClampPositionLength(), param.ClampPositionAxisRatio, param.ClampPositionVelocityInfluence);
- }
- // 回転復元拘束パラメータ再設定
- if (param.ChangedParam(ClothParams.ParamType.RestoreRotation))
- {
- var algo = clothData.clampRotationAlgorithm;
- if (algo == ClothParams.Algorithm.Algorithm_1)
- {
- // [Algorithm 1]
- compute.RestoreRotation.ChangeParam(
- team.TeamId,
- param.UseRestoreRotation,
- param.GetRestoreRotationPower(clothData.restoreRotationAlgorithm),
- param.GetRestoreRotationVelocityInfluence(clothData.restoreRotationAlgorithm)
- );
- }
- else if (algo == ClothParams.Algorithm.Algorithm_2)
- {
- // [Algorithm 2]
- compute.CompositeRotation.ChangeParam(
- team.TeamId,
- param.UseClampRotation,
- param.GetClampRotationAngle(algo),
- param.UseRestoreRotation,
- param.GetRestoreRotationPower(algo),
- param.GetRestoreRotationVelocityInfluence(algo)
- );
- }
- }
- // 最大回転拘束パラメータ再設定
- if (param.ChangedParam(ClothParams.ParamType.ClampRotation))
- {
- var algo = clothData.clampRotationAlgorithm;
- if (algo == ClothParams.Algorithm.Algorithm_1)
- {
- // [Algorithm 1]
- compute.ClampRotation.ChangeParam(
- team.TeamId,
- param.UseClampRotation,
- param.GetClampRotationAngle(algo),
- param.ClampRotationVelocityInfluence
- );
- }
- else if (algo == ClothParams.Algorithm.Algorithm_2)
- {
- // [Algorithm 2]
- compute.CompositeRotation.ChangeParam(
- team.TeamId,
- param.UseClampRotation,
- param.GetClampRotationAngle(algo),
- param.UseRestoreRotation,
- param.GetRestoreRotationPower(algo),
- param.GetRestoreRotationVelocityInfluence(algo)
- );
- }
- // Algorithm共通
- manager.Team.SetClampRotation(
- team.TeamId,
- param.UseClampRotation,
- param.GetClampRotationAngle(algo)
- );
- }
- // スプリング回転調整パラメータ再設定(これはワーカー)
- if (param.ChangedParam(ClothParams.ParamType.AdjustRotation))
- {
- compute.AdjustRotationWorker.ChangeParam(team.TeamId, true, (int)param.AdjustRotationMode, param.AdjustRotationVector);
- }
- // コリジョン有無
- if (param.ChangedParam(ClothParams.ParamType.ColliderCollision))
- {
- //manager.Team.SetFlag(team.TeamId, PhysicsManagerTeamData.Flag_Collision_KeepShape, param.KeepInitialShape);
- compute.Collision.ChangeParam(team.TeamId, param.UseCollision);
- //compute.EdgeCollision.ChangeParam(team.TeamId, param.UseCollision && param.UseEdgeCollision, param.EdgeCollisionRadius);
- }
- // スプリング拘束パラメータ再設定
- if (param.ChangedParam(ClothParams.ParamType.Spring))
- {
- compute.Spring.ChangeParam(team.TeamId, param.UseSpring, param.GetSpringPower());
- }
- // 回転補間
- if (param.ChangedParam(ClothParams.ParamType.RotationInterpolation))
- {
- compute.LineWorker.ChangeParam(team.TeamId, param.UseLineAvarageRotation);
- manager.Team.SetFlag(team.TeamId, PhysicsManagerTeamData.Flag_FixedNonRotation, param.UseFixedNonRotation);
- }
- // 浸透制限
- if (param.ChangedParam(ClothParams.ParamType.Penetration))
- {
- compute.Penetration.ChangeParam(
- team.TeamId,
- param.UsePenetration,
- param.GetPenetrationDistance(),
- param.GetPenetrationRadius(),
- param.PenetrationMaxDepth
- );
- }
- // ベーススキニング
- // 一旦休眠
- //if (param.ChangedParam(ClothParams.ParamType.BaseSkinning))
- //{
- // compute.BaseSkinningWorker.ChangeParam(team.TeamId, team.SkinningUpdateFixed);
- //}
- //変更フラグクリア
- param.ClearChangeParam();
- }
- }
- }
|