// Magica Cloth. // Copyright (c) MagicaSoft, 2020-2022. // https://magicasoft.jp using System.Collections.Generic; using UnityEngine; namespace MagicaCloth { /// /// クロスの実行時設定 /// public class ClothSetup { // チームのボーンインデックス int teamBoneIndex = -1; // 重力方向減衰ボーンインデックス //int teamDirectionalDampingBoneIndex; /// /// 距離によるブレンド率 /// float distanceBlendRatio = 1.0f; //========================================================================================= /// /// クロス初期化 /// /// /// メッシュデータ(不要ならnull) /// /// /// 各頂点の追加フラグ設定アクション /// 各頂点の連動トランスフォーム設定アクション public void ClothInit( PhysicsTeam team, MeshData meshData, ClothData clothData, ClothParams param, System.Func 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); } //========================================================================================= /// /// クロス破棄 /// 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); } /// /// アバター着せ替えによるボーン置換 /// /// internal void ReplaceBone(PhysicsTeam team, ClothParams param, Dictionary 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]); //} } /// /// 現在使用しているボーンを格納して返す /// /// internal HashSet GetUsedBones(PhysicsTeam team, ClothParams param) { var bones = new HashSet(); bones.Add(param.GetInfluenceTarget()); return bones; } /// /// UnityPhysicsでの更新の変更 /// /// public void ChangeUseUnityPhysics(bool sw) { MagicaPhysicsManager.Instance.Bone.ChangeUnityPhysicsCount(teamBoneIndex, sw); } //========================================================================================= /// /// 距離によるブレンド率 /// public float DistanceBlendRatio { get { return distanceBlendRatio; } set { distanceBlendRatio = value; } } //========================================================================================= /// /// ランタイムデータ変更 /// 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(); } } }