/// <summary> /// クロスシミュレーション計算開始 /// </summary> /// <param name="update"></param> public void UpdateStartSimulation(UpdateTimeManager update) { // 時間 float dtime = update.DeltaTime; float updatePower = update.UpdatePower; float updateIntervalTime = update.UpdateIntervalTime; int ups = update.UpdatePerSecond; // 活動チームが1つ以上ある場合のみ更新 if (Team.ActiveTeamCount > 0) { // 今回フレームの更新回数 int updateCount = Team.CalcMaxUpdateCount(ups, dtime, updateIntervalTime); //Debug.Log("updateCount:" + updateCount + " dtime:" + Time.deltaTime); // 風更新 Wind.UpdateWind(); // チームデータ更新、更新回数確定、ワールド移動影響、テレポート Team.PreUpdateTeamData(dtime, updateIntervalTime, ups, updateCount); // ワーカー処理 WarmupWorker(); // ボーン姿勢をパーティクルにコピーする Particle.UpdateBoneToParticle(); // 物理更新前ワーカー処理 //MasterJob = RenderMeshWorker.PreUpdate(MasterJob); // 何もなし MasterJob = VirtualMeshWorker.PreUpdate(MasterJob); // 仮想メッシュをスキニングしワールド姿勢を求める MasterJob = MeshParticleWorker.PreUpdate(MasterJob); // 仮想メッシュ頂点姿勢を連動パーティクルにコピーする //MasterJob = SpringMeshWorker.PreUpdate(MasterJob); // 何もなし //MasterJob = AdjustRotationWorker.PreUpdate(MasterJob); // 何もなし //MasterJob = LineWorker.PreUpdate(MasterJob); // 何もなし //MasterJob = BaseSkinningWorker.PreUpdate(MasterJob); // ベーススキニングによりbasePos/baseRotをスキニング // パーティクルのリセット判定 Particle.UpdateResetParticle(); // 物理更新 for (int i = 0, cnt = updateCount; i < cnt; i++) { UpdatePhysics(updateCount, i, updatePower, updateIntervalTime); } // 物理演算後処理 PostUpdatePhysics(updateIntervalTime); // 物理更新後ワーカー処理 MasterJob = TriangleWorker.PostUpdate(MasterJob); // トライアングル回転調整 MasterJob = LineWorker.PostUpdate(MasterJob); // ラインの回転調整 MasterJob = AdjustRotationWorker.PostUpdate(MasterJob); // パーティクル回転調整(Adjust Rotation) Particle.UpdateParticleToBone(); // パーティクル姿勢をボーン姿勢に書き戻す(ここに挟まないと駄目) MasterJob = SpringMeshWorker.PostUpdate(MasterJob); // メッシュスプリング MasterJob = MeshParticleWorker.PostUpdate(MasterJob); // パーティクル姿勢を仮想メッシュに書き出す MasterJob = VirtualMeshWorker.PostUpdate(MasterJob); // 仮想メッシュ座標書き込み(仮想メッシュトライアングル法線計算) MasterJob = RenderMeshWorker.PostUpdate(MasterJob); // レンダーメッシュ座標書き込み(仮想メッシュからレンダーメッシュ座標計算) // 書き込みボーン姿勢をローカル姿勢に変換する Bone.ConvertWorldToLocal(); // チームデータ後処理 Team.PostUpdateTeamData(); } }
//========================================================================================= /// <summary> /// 初期設定 /// </summary> public override void Create() { // 拘束の作成 // ※この並び順が実行順番となります。 // 移動制限 //ClampDistance = new ClampDistanceConstraint(); //constraints.Add(ClampDistance); // コリジョン ColliderExtrusion = new ColliderExtrusionConstraint(); constraints.Add(ColliderExtrusion); Penetration = new PenetrationConstraint(); constraints.Add(Penetration); Collision = new ColliderCollisionConstraint(); constraints.Add(Collision); // 移動制限 ClampDistance = new ClampDistanceConstraint(); constraints.Add(ClampDistance); //ClampDistance2 = new ClampDistance2Constraint(); //constraints.Add(ClampDistance2); //Penatration = new ColliderPenetrationConstraint(); //constraints.Add(Penatration); // コリジョン //EdgeCollision = new EdgeCollisionConstraint(); //constraints.Add(EdgeCollision); //Penetration = new PenetrationConstraint(); //constraints.Add(Penetration); //Collision = new ColliderCollisionConstraint(); //constraints.Add(Collision); // 移動制限 //Penetration = new ColliderPenetrationConstraint(); // コリジョンの前はだめ //constraints.Add(Penetration); //ClampDistance = new ClampDistanceConstraint(); //constraints.Add(ClampDistance); //Penatration = new ColliderPenetrationConstraint(); //constraints.Add(Penatration); // 主なクロスシミュレーション Spring = new SpringConstraint(); constraints.Add(Spring); RestoreDistance = new RestoreDistanceConstraint(); constraints.Add(RestoreDistance); RestoreRotation = new RestoreRotationConstraint(); constraints.Add(RestoreRotation); // コリジョン //EdgeCollision = new EdgeCollisionConstraint(); //constraints.Add(EdgeCollision); //Penetration = new PenetrationConstraint(); //constraints.Add(Penetration); //Collision = new ColliderCollisionConstraint(); //constraints.Add(Collision); //Penetration = new PenetrationConstraint(); //constraints.Add(Penetration); // 形状維持 TriangleBend = new TriangleBendConstraint(); constraints.Add(TriangleBend); //Volume = new VolumeConstraint(); //constraints.Add(Volume); // 移動制限2 //Penetration = new ColliderPenetrationConstraint(); //constraints.Add(Penetration); ClampPosition = new ClampPositionConstraint(); constraints.Add(ClampPosition); ClampRotation = new ClampRotationConstraint(); constraints.Add(ClampRotation); // コリジョン2 //AfterCollision = new ColliderAfterCollisionConstraint(); //constraints.Add(AfterCollision); //EdgeCollision = new EdgeCollisionConstraint(); //constraints.Add(EdgeCollision); //Collision = new ColliderCollisionConstraint(); //constraints.Add(Collision); //Penetration = new PenetrationConstraint(); //constraints.Add(Penetration); foreach (var con in constraints) { con.Init(manager); } // ワーカーの作成 // ※この並び順は変更してはいけません。 RenderMeshWorker = new RenderMeshWorker(); workers.Add(RenderMeshWorker); VirtualMeshWorker = new VirtualMeshWorker(); workers.Add(VirtualMeshWorker); MeshParticleWorker = new MeshParticleWorker(); workers.Add(MeshParticleWorker); SpringMeshWorker = new SpringMeshWorker(); workers.Add(SpringMeshWorker); AdjustRotationWorker = new AdjustRotationWorker(); workers.Add(AdjustRotationWorker); LineWorker = new LineWorker(); workers.Add(LineWorker); TriangleWorker = new TriangleWorker(); workers.Add(TriangleWorker); //BaseSkinningWorker = new BaseSkinningWorker(); //workers.Add(BaseSkinningWorker); foreach (var worker in workers) { worker.Init(manager); } // プロファイラ用 SamplerWriteMesh = CustomSampler.Create("WriteMesh"); }