Example #1
0
        /// <summary>
        /// 現在のデータが正常(実行できる状態)か返す
        /// </summary>
        /// <returns></returns>
        public virtual Define.Error VerifyData()
        {
            if (dataHash == 0)
            {
                return(Define.Error.InvalidDataHash);
            }
            //if (dataVersion != GetVersion())
            //    return Define.Error.DataVersionMismatch;
            if (MeshData == null)
            {
                return(Define.Error.MeshDataNull);
            }
            if (targetObject == null)
            {
                return(Define.Error.TargetObjectNull);
            }
            var mdataError = MeshData.VerifyData();

            if (mdataError != Define.Error.None)
            {
                return(mdataError);
            }

            return(Define.Error.None);
        }
Example #2
0
        /// <summary>
        /// 現在のデータが正常(実行できる状態)か返す
        /// </summary>
        /// <returns></returns>
        public override Define.Error VerifyData()
        {
            var baseError = base.VerifyData();

            if (baseError != Define.Error.None)
            {
                return(baseError);
            }

            if (ClothData == null)
            {
                return(Define.Error.ClothDataNull);
            }
            if (MeshData == null)
            {
                return(Define.Error.MeshDataNull);
            }

            var meshDataError = MeshData.VerifyData();

            if (meshDataError != Define.Error.None)
            {
                return(meshDataError);
            }
            if (meshDataHash != MeshData.SaveDataHash)
            {
                return(Define.Error.MeshDataHashMismatch);
            }
            if (meshDataVersion != MeshData.SaveDataVersion)
            {
                return(Define.Error.MeshDataVersionMismatch);
            }

            if (useTransformList.Count == 0)
            {
                return(Define.Error.UseTransformCountZero);
            }
            if (UseTransformCount != MeshData.VertexCount)
            {
                return(Define.Error.UseTransformCountMismatch);
            }

            foreach (var t in useTransformList)
            {
                if (t == null)
                {
                    return(Define.Error.UseTransformNull);
                }
            }

            return(Define.Error.None);
        }
        /// <summary>
        /// 初期化
        /// </summary>
        protected override void OnInit()
        {
            base.OnInit();
            if (status.IsInitError)
            {
                return;
            }

            // レンダラーチェック
            if (TargetObject == null)
            {
                status.SetInitError();
                return;
            }
            var ren = TargetObject.GetComponent <Renderer>();

            if (ren == null)
            {
                status.SetInitError();
                return;
            }

            if (MeshData.VerifyData() != Define.Error.None)
            {
                status.SetInitError();
                return;
            }

            VertexCount   = MeshData.VertexCount;
            TriangleCount = MeshData.TriangleCount;

            // クローンメッシュ作成
            // ここではメッシュは切り替えない
            mesh = null;
            if (ren is SkinnedMeshRenderer)
            {
                var sren = ren as SkinnedMeshRenderer;
                skinMeshRenderer = sren;

                // メッシュクローン
                mesh = GameObject.Instantiate(sharedMesh);
#if !UNITY_EDITOR_OSX
                // MacではMetal関連でエラーが発生するので対応(エディタ環境のみ)
                mesh.MarkDynamic();
#endif
                originalBones = sren.bones;

                // クローンメッシュ初期化
                // srenのボーンリストはここで配列を作成し最後にレンダラーのトランスフォームを追加する
                var blist = new List <Transform>(originalBones);
                blist.Add(ren.transform); // レンダラートランスフォームを最後に追加
                boneList = blist.ToArray();

                var bindlist = new List <Matrix4x4>(sharedMesh.bindposes);
                bindlist.Add(Matrix4x4.identity); // レンダラーのバインドポーズを最後に追加
                mesh.bindposes = bindlist.ToArray();
            }
            else
            {
                // メッシュクローン
                mesh = GameObject.Instantiate(sharedMesh);
#if !UNITY_EDITOR_OSX
                // MacではMetal関連でエラーが発生するので対応(エディタ環境のみ)
                mesh.MarkDynamic();
#endif

                meshFilter = TargetObject.GetComponent <MeshFilter>();
                Debug.Assert(meshFilter);
            }
            oldUse = false;

            // 共有メッシュのuid
            int  uid   = sharedMesh.GetInstanceID(); // 共有メッシュのIDを使う
            bool first = MagicaPhysicsManager.Instance.Mesh.IsEmptySharedRenderMesh(uid);

            // メッシュ登録
            MeshIndex = MagicaPhysicsManager.Instance.Mesh.AddRenderMesh(
                uid,
                MeshData.isSkinning,
                MeshData.baseScale,
                MeshData.VertexCount,
                IsSkinning ? boneList.Length - 1 : 0, // レンダラーのボーンインデックス
#if UNITY_2018
                IsSkinning ? MeshData.VertexCount : 0 // ボーンウエイト数=頂点数
#else
                IsSkinning ? sharedMesh.GetAllBoneWeights().Length : 0
#endif
                );

            // レンダーメッシュの共有データを一次元配列にコピーする
            if (first)
            {
                MagicaPhysicsManager.Instance.Mesh.SetRenderSharedMeshData(
                    MeshIndex,
                    IsSkinning,
                    mesh.vertices,
                    mesh.normals,
                    mesh.tangents,
#if UNITY_2018
                    IsSkinning ? mesh.boneWeights : null
#else
                    sharedMesh.GetBonesPerVertex(),
                    sharedMesh.GetAllBoneWeights()
#endif
                    );
            }

            // レンダーメッシュ情報確定
            // すべてのデータが確定してから実行しないと駄目なもの
            MagicaPhysicsManager.Instance.Mesh.UpdateMeshState(MeshIndex);

            // 法線/接線再計算モード設定
            SetRecalculateNormalAndTangentMode();
        }
        //=========================================================================================
        /// <summary>
        /// 初期化
        /// </summary>
        protected override void OnInit()
        {
            base.OnInit();
            if (status.IsInitError)
            {
                return;
            }

            // すべてのレンダーデフォーマーを初期化する
            if (MeshData == null || MeshData.VerifyData() != Define.Error.None)
            {
                status.SetInitError();
                return;
            }
            for (int i = 0; i < MeshData.ChildCount; i++)
            {
                if (renderDeformerList[i] == null)
                {
                    status.SetInitError();
                    return;
                }
                var renderDeformer = renderDeformerList[i];
                if (renderDeformer == null)
                {
                    status.SetInitError();
                    return;
                }

                // 初期化はMagicaRenderDeformerのものを呼び出す(v1.5.1)
                renderDeformer.Init();

                if (renderDeformer.Deformer.Status.IsInitError)
                {
                    status.SetInitError();
                    return;
                }
            }

            VertexCount   = MeshData.VertexCount;
            TriangleCount = MeshData.TriangleCount;
            //LineCount = meshData.LineCount;
            int triangleIndexCount = MeshData.vertexToTriangleIndexList != null ? MeshData.vertexToTriangleIndexList.Length : 0;

            // 共有メッシュのユニークID
            int  uid   = MeshData.SaveDataHash; // データハッシュをユニークIDとする
            bool first = MagicaPhysicsManager.Instance.Mesh.IsEmptySharedVirtualMesh(uid);

            //Develop.Log($"★メッシュ登録:{MeshData.name} uid:{uid} first:{first}");

            // メッシュ登録
            MeshIndex = MagicaPhysicsManager.Instance.Mesh.AddVirtualMesh(
                uid,
                MeshData.VertexCount,
                MeshData.WeightCount,
                MeshData.BoneCount,
                MeshData.TriangleCount,
                triangleIndexCount,
                TargetObject.transform
                );

            // スキニング頂点数
            SkinningVertexCount = MeshData.VertexCount;

            // 利用ボーンをマネージャに登録する
            //MagicaPhysicsManager.Instance.Mesh.SetVirtualMeshBone(MeshIndex, boneList);

            // 共有頂点データを設定
            if (first)
            {
                MagicaPhysicsManager.Instance.Mesh.SetSharedVirtualMeshData(
                    MeshIndex,
                    MeshData.vertexInfoList,
                    MeshData.vertexWeightList,
                    MeshData.uvList,
                    MeshData.triangleList,
                    MeshData.vertexToTriangleInfoList,
                    MeshData.vertexToTriangleIndexList
                    );
            }

            // 共有メッシュの子メッシュを登録
            for (int i = 0; i < MeshData.ChildCount; i++)
            {
                var cdata = MeshData.childDataList[i];

                // 子メッシュ登録
                long cuid   = (long)uid << 16 + i;
                bool cfirst = MagicaPhysicsManager.Instance.Mesh.IsEmptySharedChildMesh(cuid);
                int  sharedChildMeshIndex = MagicaPhysicsManager.Instance.Mesh.AddSharedChildMesh(
                    cuid,
                    MeshIndex,
                    cdata.VertexCount,
                    cdata.vertexWeightList.Length
                    );

                // 共有データを設定
                if (cfirst)
                {
                    MagicaPhysicsManager.Instance.Mesh.SetSharedChildMeshData(
                        sharedChildMeshIndex,
                        cdata.vertexInfoList,
                        cdata.vertexWeightList
                        );
                }

                sharedChildMeshIndexList.Add(sharedChildMeshIndex);
            }
        }