/// <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); }
/// <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); } }