Ejemplo n.º 1
0
        /// <summary>
        /// クロス初期化の主にワーカーへの登録
        /// </summary>
        protected override void WorkerInit()
        {
            // センターパーティクル
            int pindex = ParticleChunk.startIndex;

            // デフォーマーごとの設定
            SpringMeshWorker worker = MagicaPhysicsManager.Instance.Compute.SpringMeshWorker;
            {
                // デフォーマー取得
                var deformer = GetDeformer(0);
                Debug.Assert(deformer != null);
                deformer.Init();

                // スプリングデータ取得
                var data = GetDeformerData();
                Debug.Assert(data != null);

                // スプリングワーカー設定
                var minfo = MagicaPhysicsManager.Instance.Mesh.GetVirtualMeshInfo(deformer.MeshIndex);
                for (int j = 0; j < data.UseVertexCount; j++)
                {
                    int vindex = data.useVertexIndexList[j];
                    worker.Add(TeamId, minfo.vertexChunk.startIndex + vindex, pindex, data.weightList[j]);
                }
            }
        }
        /// <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");
        }