Exemplo n.º 1
0
        void BaseClothDispose()
        {
            if (MagicaPhysicsManager.IsInstance() == false)
            {
                return;
            }

            // デフォーマとの状態の連動を解除
            int dcount = GetDeformerCount();

            for (int i = 0; i < dcount; i++)
            {
                var deformer = GetDeformer(i);
                if (deformer != null)
                {
                    LinkDeformerStatus(deformer, false);
                }
            }

            if (Status.IsInitSuccess)
            {
                // 頂点無効化
                SetUseVertex(false);

                // クロス破棄
                // この中ですべてのコンストレイントとワーカーからチームのデータが自動削除される
                setup.ClothDispose(this);

                ClothDispose();
            }
        }
Exemplo n.º 2
0
        //=========================================================================================
        /// <summary>
        /// ブレンド率更新
        /// </summary>
        public void UpdateBlend()
        {
            if (MagicaPhysicsManager.IsInstance() == false)
            {
                return;
            }
            if (teamId <= 0)
            {
                return;
            }

            // ユーザーブレンド率
            float blend = TeamData.UserBlendRatio;

            // 距離ブレンド率
            blend *= setup.DistanceBlendRatio;

            // 変更チェック
            blend = Mathf.Clamp01(blend);
            if (blend != oldBlendRatio)
            {
                // チームデータへ反映
                MagicaPhysicsManager.Instance.Team.SetBlendRatio(teamId, blend);

                // コンポーネント有効化判定
                SetUserEnable(blend > 0.01f);

                oldBlendRatio = blend;
            }
        }
Exemplo n.º 3
0
        //=========================================================================================
        /// <summary>
        /// 使用デフォーマー設定
        /// </summary>
        /// <param name="sw"></param>
        void SetUseMesh(bool sw)
        {
            if (MagicaPhysicsManager.IsInstance() == false)
            {
                return;
            }

            if (Status.IsInitSuccess == false)
            {
                return;
            }

            int dcount = GetDeformerCount();

            for (int i = 0; i < dcount; i++)
            {
                var deformer = GetDeformer(i);
                if (deformer != null)
                {
                    if (sw)
                    {
                        deformer.AddUseMesh(this);
                    }
                    else
                    {
                        deformer.RemoveUseMesh(this);
                    }
                }
            }
        }
        void MainInspector()
        {
            MagicaPhysicsManager scr = target as MagicaPhysicsManager;

            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Update", EditorStyles.boldLabel);
            using (new EditorGUI.IndentLevelScope())
            {
                var prop = serializedObject.FindProperty("updateTime.updatePerSeccond");
                EditorGUILayout.PropertyField(prop);

                var prop2 = serializedObject.FindProperty("updateTime.updateMode");
                EditorGUILayout.PropertyField(prop2);

                // 以下は遅延実行時のみ
                if (scr.UpdateTime.IsDelay)
                {
                    var prop3 = serializedObject.FindProperty("updateTime.futurePredictionRate");
                    EditorGUILayout.PropertyField(prop3);
                }

                Help1();

#if (UNITY_2018 || UNITY_2019_1 || UNITY_2019_2_1 || UNITY_2019_2_2 || UNITY_2019_2_3 || UNITY_2019_2_4 || UNITY_2019_2_5 || UNITY_2019_2_6 || UNITY_2019_2_7 || UNITY_2019_2_8 || UNITY_2019_2_9 || UNITY_2019_2_10 || UNITY_2019_2_11 || UNITY_2019_2_12 || UNITY_2019_2_13)
                var prop4 = serializedObject.FindProperty("updateTime.updateBoneScale");
                //EditorGUILayout.PropertyField(prop4);
                //prop4.boolValue = EditorGUILayout.Toggle("Update Bone Scale (2019.2.13 or earlier)", prop4.boolValue);
                prop4.boolValue = EditorGUILayout.Toggle("Update Bone Scale", prop4.boolValue);

                Help2();
#endif
            }
        }
Exemplo n.º 5
0
 /// <summary>
 /// 実行状態から抜けた場合に呼ばれます
 /// </summary>
 protected override void OnInactive()
 {
     if (MagicaPhysicsManager.IsInstance())
     {
         // チーム無効化
         MagicaPhysicsManager.Instance.Team.SetEnable(teamId, false);
     }
 }
Exemplo n.º 6
0
        /// <summary>
        /// 破棄
        /// </summary>
        public override void Dispose()
        {
            if (MagicaPhysicsManager.IsInstance())
            {
                // メッシュ解除
                MagicaPhysicsManager.Instance.Mesh.RemoveRenderMesh(MeshIndex);
            }

            base.Dispose();
        }
        /// <summary>
        /// 破棄
        /// </summary>
        protected virtual void OnDispose()
        {
            if (MagicaPhysicsManager.IsInstance() == false)
            {
                return;
            }

            // パーティクルを破棄する
            RemoveParticle();
        }
 /// <summary>
 /// パーティクル無効化
 /// </summary>
 protected void DisableParticle()
 {
     if (MagicaPhysicsManager.IsInstance())
     {
         foreach (var teamId in particleDict.Keys)
         {
             DisableTeamParticle(teamId);
         }
     }
 }
Exemplo n.º 9
0
        /// <summary>
        /// 破棄
        /// 通常はOnDestroy()で呼ぶ
        /// </summary>
        public virtual void Dispose()
        {
            // マネージャから削除
            if (MagicaPhysicsManager.IsInstance())
            {
                MagicaPhysicsManager.Instance.Mesh.RemoveMesh(this);
            }

            status.SetDispose();
        }
        /// <summary>
        /// 破棄
        /// </summary>
        protected virtual void OnDispose()
        {
            if (MagicaPhysicsManager.IsInstance() == false)
            {
                return;
            }

            // 風を破棄する
            RemoveWind();
        }
 //=========================================================================================
 /// <summary>
 /// 風削除
 /// </summary>
 protected void RemoveWind()
 {
     if (MagicaPhysicsManager.IsInstance())
     {
         if (windId >= 0)
         {
             MagicaPhysicsManager.Instance.Wind.RemoveWind(windId);
         }
     }
     windId = -1;
 }
Exemplo n.º 12
0
 /// <summary>
 /// 管理するパーティクルを無効化する
 /// </summary>
 public void DisableParticle(
     System.Func <int, Transform> funcTarget,
     System.Func <int, float3> funcLpos,
     System.Func <int, quaternion> funcLrot
     )
 {
     if (MagicaPhysicsManager.IsInstance())
     {
         MagicaPhysicsManager.Instance.Particle.SetEnable(particleChunk, false, funcTarget, funcLpos, funcLrot);
     }
 }
Exemplo n.º 13
0
 /// <summary>
 /// チームデータが存在するか判定
 /// </summary>
 /// <returns></returns>
 public bool IsValid()
 {
     if (MagicaPhysicsManager.IsInstance())
     {
         return(MagicaPhysicsManager.Instance.Team.IsValid(teamId));
     }
     else
     {
         return(false);
     }
 }
 /// <summary>
 /// パーティクル削除
 /// </summary>
 protected void RemoveParticle()
 {
     if (MagicaPhysicsManager.IsInstance())
     {
         foreach (var teamId in particleDict.Keys)
         {
             RemoveTeamParticle(teamId);
         }
     }
     particleDict.Clear();
 }
        /// <summary>
        /// 風無効化
        /// </summary>
        protected void DisableWind()
        {
            if (MagicaPhysicsManager.IsInstance() == false)
            {
                return;
            }

            if (windId >= 0)
            {
                MagicaPhysicsManager.Instance.Wind.SetEnable(windId, false, transform);
            }
        }
        public override void OnInspectorGUI()
        {
            //DrawDefaultInspector();

            MagicaPhysicsManager scr = target as MagicaPhysicsManager;

            serializedObject.Update();
            Undo.RecordObject(scr, "PhysicsManager");

            MainInspector();

            serializedObject.ApplyModifiedProperties();
        }
        /// <summary>
        /// 指定チームのパーティクルを削除
        /// </summary>
        /// <param name="teamId"></param>
        protected void RemoveTeamParticle(int teamId)
        {
            if (MagicaPhysicsManager.IsInstance())
            {
                // パーティクル無効化
                DisableTeamParticle(teamId);

                // パーティクル削除
                var c = particleDict[teamId];
                MagicaPhysicsManager.Instance.Particle.RemoveParticle(c);
                particleDict.Remove(teamId);
            }
        }
Exemplo n.º 18
0
 public void Dispose(int teamId)
 {
     if (MagicaPhysicsManager.IsInstance())
     {
         // コライダーをチームから除外する
         foreach (var collider in colliderList)
         {
             if (collider)
             {
                 collider.RemoveColliderParticle(teamId);
             }
         }
     }
 }
Exemplo n.º 19
0
        /// <summary>
        /// 実行状態から抜けた場合に呼ばれます
        /// </summary>
        protected override void OnInactive()
        {
            base.OnInactive();
            if (status.IsInitSuccess)
            {
                if (MagicaPhysicsManager.IsInstance())
                {
                    // レンダラートランスフォーム解除
                    MagicaPhysicsManager.Instance.Mesh.RemoveRenderMeshBone(MeshIndex);

                    MagicaPhysicsManager.Instance.Mesh.SetRenderMeshActive(MeshIndex, false);
                }
            }
        }
Exemplo n.º 20
0
        /// <summary>
        /// 実行状態から抜けた場合に呼ばれます
        /// </summary>
        protected override void OnInactive()
        {
            base.OnInactive();
            if (status.IsInitSuccess)
            {
                if (MagicaPhysicsManager.IsInstance())
                {
                    MagicaPhysicsManager.Instance.Mesh.SetVirtualMeshActive(MeshIndex, false);

                    // 利用ボーン解除
                    MagicaPhysicsManager.Instance.Mesh.RemoveVirtualMeshBone(MeshIndex);
                }
            }
        }
Exemplo n.º 21
0
        /// <summary>
        /// 破棄
        /// 通常はOnDestroy()で呼ぶ
        /// </summary>
        protected override void OnDispose()
        {
            // 破棄
            if (TeamId >= 0)
            {
                TeamData.Dispose(TeamId);

                // チーム削除
                if (MagicaPhysicsManager.IsInstance())
                {
                    MagicaPhysicsManager.Instance.Team.RemoveTeam(teamId);
                }
            }
        }
Exemplo n.º 22
0
        public void ClothInactive(PhysicsTeam team)
        {
            if (MagicaPhysicsManager.IsInstance() == false)
            {
                return;
            }

            var manager = MagicaPhysicsManager.Instance;

            // 自身の登録ボーン開放
            manager.Bone.RemoveBone(teamBoneIndex);
            manager.Team.SetBoneIndex(team.TeamId, -1);

            manager.Bone.RemoveBone(teamDirectionalDampingBoneIndex);
            manager.Team.SetDirectionalDampingBoneIndex(team.TeamId, false, -1, 0);
        }
Exemplo n.º 23
0
        //=========================================================================================
        /// <summary>
        /// クロス破棄
        /// </summary>
        public void ClothDispose(PhysicsTeam team)
        {
            if (MagicaPhysicsManager.IsInstance() == false)
            {
                return;
            }

            // コンストレイント解放
            MagicaPhysicsManager.Instance.Compute.RemoveTeam(team.TeamId);

            // パーティクル解放
            team.RemoveAllParticle();

            // 自身の登録ボーン開放
            //MagicaPhysicsManager.Instance.Bone.RemoveBone(teamBoneIndex);
        }
        void Help2()
        {
            MagicaPhysicsManager scr = target as MagicaPhysicsManager;

#if (UNITY_2018 || UNITY_2019_1 || UNITY_2019_2_1 || UNITY_2019_2_2 || UNITY_2019_2_3 || UNITY_2019_2_4 || UNITY_2019_2_5 || UNITY_2019_2_6 || UNITY_2019_2_7 || UNITY_2019_2_8 || UNITY_2019_2_9 || UNITY_2019_2_10 || UNITY_2019_2_11 || UNITY_2019_2_12 || UNITY_2019_2_13)
            //if (scr.UpdateTime.UpdateBoneScale)
            {
                EditorGUILayout.HelpBox(
                    "Required if you want to scale or flip the character at runtime.\n" +
                    "However, it consumes CPU (Main Thread).\n" +
                    "Be careful if you use many cloth simulations.\n" +
                    "This is a problem for Unity 2019.2.13 or earlier.",
                    MessageType.Info);
            }
#endif
        }
        protected virtual void OnDestroy()
        {
            if (Status.IsDispose)
            {
                return;
            }

            //Debug.Log("Core.OnDestroy():" + gameObject.name);
            status.SetDispose();
            OnDispose();

            // 登録削除
            if (MagicaPhysicsManager.IsInstance())
            {
                MagicaPhysicsManager.Instance.Component.RemoveComponent(this);
            }
        }
        void Help1()
        {
            MagicaPhysicsManager scr = target as MagicaPhysicsManager;

            if (scr.UpdateMode == UpdateTimeManager.UpdateMode.OncePerFrame)
            {
                EditorGUILayout.HelpBox("[OncePerFrame] must have stable FPS.", MessageType.Info);
            }
            else if (scr.UpdateTime.IsDelay)
            {
                EditorGUILayout.HelpBox(
                    "Delayed execution. [experimental]\n" +
                    "Improve performance by running simulations during rendering.\n" +
                    "Note, however, that the result is one frame late.\n" +
                    "This delay is covered by future predictions.",
                    MessageType.Info);
            }
        }
Exemplo n.º 27
0
        /// <summary>
        /// 指定チームのコライダーパーティクルを削除
        /// </summary>
        /// <param name="teamId"></param>
        public void RemoveColliderParticle(int teamId)
        {
            if (MagicaPhysicsManager.IsInstance() == false)
            {
                return;
            }

            if (particleDict.ContainsKey(teamId))
            {
                var c = particleDict[teamId];
                for (int i = 0; i < c.dataLength; i++)
                {
                    int pindex = c.startIndex + i;
                    MagicaPhysicsManager.Instance.Team.RemoveCollider(teamId, pindex);
                }
                RemoveTeamParticle(teamId);
            }
        }
Exemplo n.º 28
0
        /// <summary>
        /// 使用頂点設定
        /// </summary>
        /// <param name="sw"></param>
        void SetUseVertex(bool sw)
        {
            if (MagicaPhysicsManager.IsInstance() == false)
            {
                return;
            }

            int dcount = GetDeformerCount();

            for (int i = 0; i < dcount; i++)
            {
                var deformer = GetDeformer(i);
                if (deformer != null)
                {
                    SetDeformerUseVertex(sw, deformer, i);
                }
            }
        }
Exemplo n.º 29
0
        /// <summary>
        /// ルートの親トランスフォームをすべて解除する
        /// </summary>
        public void RemoveParentTransform()
        {
            if (MagicaPhysicsManager.IsInstance())
            {
                if (parentIndexList != null && parentIndexList.Length > 0)
                {
                    for (int i = 0; i < parentIndexList.Length; i++)
                    {
                        var index = parentIndexList[i];
                        if (index >= 0)
                        {
                            MagicaPhysicsManager.Instance.Bone.RemoveBone(index);
                        }
                    }
                }
            }

            parentIndexList = null;
        }
Exemplo n.º 30
0
        /// <summary>
        /// 破棄
        /// </summary>
        public override void Dispose()
        {
            if (MagicaPhysicsManager.IsInstance())
            {
                // メッシュ解除
                if (MagicaPhysicsManager.Instance.Mesh.ExistsVirtualMesh(MeshIndex))
                {
                    foreach (var sharedChildMeshIndex in sharedChildMeshIndexList)
                    {
                        MagicaPhysicsManager.Instance.Mesh.RemoveSharedChildMesh(sharedChildMeshIndex);
                    }

                    // 利用ボーン解除
                    //MagicaPhysicsManager.Instance.Mesh.ResetVirtualMeshBone(MeshIndex);

                    MagicaPhysicsManager.Instance.Mesh.RemoveVirtualMesh(MeshIndex);
                }
            }

            base.Dispose();
        }