//========================================================================================= /// <summary> /// 事前データ作成 /// </summary> /// <param name="scr"></param> private void CreateData(MagicaVirtualDeformer scr) { Debug.Log("Started creating. [" + scr.name + "]"); // 子メッシュの検証 if (VerifyChildData(scr.Deformer) == false) { // error Debug.LogError("Setup failed. Invalid RenderDeformer data."); return; } serializedObject.FindProperty("deformer.targetObject").objectReferenceValue = scr.gameObject; // 新規メッシュデータ var meshData = ShareDataObject.CreateShareData <MeshData>("VirtualMeshData_" + scr.name); // 設計時スケール meshData.baseScale = scr.transform.lossyScale; // 仮想メッシュ作成 var reductionMesh = new MagicaReductionMesh.ReductionMesh(); reductionMesh.WeightMode = MagicaReductionMesh.ReductionMesh.ReductionWeightMode.Average; // 平均法(v1.5.2) reductionMesh.MeshData.MaxWeightCount = scr.Deformer.MaxWeightCount; reductionMesh.MeshData.WeightPow = scr.Deformer.WeightPow; reductionMesh.MeshData.SameSurfaceAngle = scr.Deformer.SameSurfaceAngle; for (int i = 0; i < scr.Deformer.RenderDeformerCount; i++) { var deformer = scr.Deformer.GetRenderDeformer(i).Deformer; if (deformer != null) { var sren = deformer.TargetObject.GetComponent <SkinnedMeshRenderer>(); List <Transform> boneList = new List <Transform>(); if (sren) { boneList = new List <Transform>(sren.bones); } else { boneList.Add(deformer.TargetObject.transform); } reductionMesh.AddMesh( deformer.MeshData.isSkinning, deformer.SharedMesh, boneList, deformer.SharedMesh.bindposes, deformer.SharedMesh.boneWeights ); } } //reductionMesh.DebugData.DispMeshInfo("リダクション前"); // リダクション reductionMesh.Reduction( scr.Deformer.MergeVertexDistance > 0.0f ? 0.0001f : 0.0f, scr.Deformer.MergeVertexDistance, scr.Deformer.MergeTriangleDistance, false ); // (1)ゼロ距離リダクション //if (scr.Deformer.MergeVertexDistance > 0.0f) // reductionMesh.ReductionZeroDistance(); //// (2)頂点距離マージ //if (scr.Deformer.MergeVertexDistance > 0.0001f) // reductionMesh.ReductionRadius(scr.Deformer.MergeVertexDistance); //// (3)トライアングル接続マージ //if (scr.Deformer.MergeTriangleDistance > 0.0f) // reductionMesh.ReductionPolygonLink(scr.Deformer.MergeTriangleDistance); //// (4)未使用ボーンの削除 //reductionMesh.ReductionBone(); // (5)頂点の最大接続トライアングル数制限 //reductionMesh.ReductionTriangleConnect(6); //reductionMesh.DebugData.DispMeshInfo("リダクション後"); // 最終メッシュデータ取得 var final = reductionMesh.GetFinalData(scr.gameObject.transform); // メッシュデータシリアライズ meshData.isSkinning = final.IsSkinning; meshData.vertexCount = final.VertexCount; List <uint> vlist; List <MeshData.VertexWeight> wlist; CreateVertexWeightList( final.VertexCount, final.vertices, final.normals, final.tangents, final.boneWeights, final.bindPoses, out vlist, out wlist ); meshData.vertexInfoList = vlist.ToArray(); meshData.vertexWeightList = wlist.ToArray(); meshData.boneCount = final.BoneCount; meshData.uvList = final.uvs.ToArray(); meshData.lineCount = final.LineCount; meshData.lineList = final.lines.ToArray(); meshData.triangleCount = final.TriangleCount; meshData.triangleList = final.triangles.ToArray(); List <uint> vertexToTriangleInfoList = new List <uint>(); for (int i = 0; i < final.VertexCount; i++) { int tcnt = final.vertexToTriangleCountList[i]; int tstart = final.vertexToTriangleStartList[i]; vertexToTriangleInfoList.Add(DataUtility.Pack8_24(tcnt, tstart)); } meshData.vertexToTriangleInfoList = vertexToTriangleInfoList.ToArray(); meshData.vertexToTriangleIndexList = final.vertexToTriangleIndexList.ToArray(); // 子メッシュ情報 for (int i = 0; i < final.MeshCount; i++) { var minfo = final.meshList[i]; var rdeformer = scr.Deformer.GetRenderDeformer(i).Deformer; var mdata = new MeshData.ChildData(); mdata.childDataHash = rdeformer.GetDataHash(); mdata.vertexCount = minfo.VertexCount; // 頂点ウエイト情報作成 CreateVertexWeightList( minfo.VertexCount, minfo.vertices, minfo.normals, minfo.tangents, minfo.boneWeights, final.vertexBindPoses, out vlist, out wlist ); mdata.vertexInfoList = vlist.ToArray(); mdata.vertexWeightList = wlist.ToArray(); mdata.parentIndexList = minfo.parents.ToArray(); meshData.childDataList.Add(mdata); } // レイヤー情報 //for (int i = 0; i < final.LayerCount; i++) //{ // var linfo = new MeshData.LayerInfo(); // linfo.triangleList = new List<int>(final.layerList[i].triangleList); // meshData.layerInfoList.Add(linfo); //} // 検証 meshData.CreateVerifyData(); serializedObject.FindProperty("deformer.meshData").objectReferenceValue = meshData; // ボーン var property = serializedObject.FindProperty("deformer.boneList"); property.arraySize = final.bones.Count; for (int i = 0; i < final.bones.Count; i++) { property.GetArrayElementAtIndex(i).objectReferenceValue = final.bones[i]; } serializedObject.ApplyModifiedProperties(); // デフォーマーデータの検証とハッシュ scr.Deformer.CreateVerifyData(); serializedObject.ApplyModifiedProperties(); // コアコンポーネントの検証とハッシュ scr.CreateVerifyData(); serializedObject.ApplyModifiedProperties(); EditorUtility.SetDirty(meshData); Debug.Log("Setup completed. [" + scr.name + "]"); }