public static MorphDesc GetMorphDesc(PMX_Morph desc) { MorphSubMorphDesc[] subMorphDescs = null; if (desc.SubMorphs != null) { subMorphDescs = new MorphSubMorphDesc[desc.SubMorphs.Length]; for (int i = 0; i < desc.SubMorphs.Length; i++) { subMorphDescs[i] = GetMorphSubMorphDesc(desc.SubMorphs[i]); } } MorphMaterialDesc[] morphMaterialDescs = null; if (desc.MorphMaterials != null) { morphMaterialDescs = new MorphMaterialDesc[desc.MorphMaterials.Length]; for (int i = 0; i < desc.MorphMaterials.Length; i++) { morphMaterialDescs[i] = GetMorphMaterialDesc(desc.MorphMaterials[i]); } } MorphVertexDesc[] morphVertexDescs = null; if (desc.MorphVertexs != null) { morphVertexDescs = new MorphVertexDesc[desc.MorphVertexs.Length]; for (int i = 0; i < desc.MorphVertexs.Length; i++) { morphVertexDescs[i] = GetMorphVertexDesc(desc.MorphVertexs[i]); } } MorphUVDesc[] morphUVDescs = null; if (desc.MorphUVs != null) { morphUVDescs = new MorphUVDesc[desc.MorphUVs.Length]; for (int i = 0; i < desc.MorphUVs.Length; i++) { morphUVDescs[i] = GetMorphUVDesc(desc.MorphUVs[i]); } } MorphBoneDesc[] morphBoneDescs = null; if (desc.MorphBones != null) { morphBoneDescs = new MorphBoneDesc[desc.MorphBones.Length]; for (int i = 0; i < desc.MorphBones.Length; i++) { morphBoneDescs[i] = GetMorphBoneDesc(desc.MorphBones[i]); } } return(new MorphDesc() { Name = desc.Name, NameEN = desc.NameEN, Category = (MorphCategory)desc.Category, Type = (MorphType)desc.Type, MorphBones = morphBoneDescs, MorphMaterials = morphMaterialDescs, MorphUVs = morphUVDescs, MorphVertexs = morphVertexDescs, SubMorphs = subMorphDescs, }); }
public static void ReloadModel(this MMDRendererComponent rendererComponent, ModelPack modelPack) { rendererComponent.Materials.Clear(); rendererComponent.materialsBaseData.Clear(); rendererComponent.computedMaterialsData.Clear(); rendererComponent.mesh = modelPack.GetMesh(); rendererComponent.meshPosData = modelPack.verticesDataPosPart; rendererComponent.meshVertexCount = rendererComponent.mesh.m_vertexCount; rendererComponent.meshIndexCount = rendererComponent.mesh.m_indexCount; //rendererComponent.meshParticleBuffer = new TwinBuffer(); //rendererComponent.meshParticleBuffer.Reload(rendererComponent.mesh.m_vertexCount * 32); rendererComponent.meshPosData1 = new Vector3[rendererComponent.mesh.m_vertexCount]; rendererComponent.meshPosData2 = new Vector3[rendererComponent.mesh.m_vertexCount]; rendererComponent.meshAppend.Reload(rendererComponent.meshVertexCount); var modelResource = modelPack.pmx; for (int i = 0; i < modelResource.Materials.Count; i++) { var mmdMat = modelResource.Materials[i]; RuntimeMaterial mat = new RuntimeMaterial { Name = mmdMat.Name, NameEN = mmdMat.NameEN, texIndex = mmdMat.TextureIndex, indexCount = mmdMat.TriangeIndexNum, innerStruct = { DiffuseColor = mmdMat.DiffuseColor, SpecularColor = mmdMat.SpecularColor, EdgeSize = mmdMat.EdgeScale, EdgeColor = mmdMat.EdgeColor, AmbientColor = new Vector3(MathF.Pow(mmdMat.AmbientColor.X, 2.2f), MathF.Pow(mmdMat.AmbientColor.Y, 2.2f), MathF.Pow(mmdMat.AmbientColor.Z, 2.2f)), Roughness = 0.5f, Specular = 0.5f, }, DrawFlags = (DrawFlag)mmdMat.DrawFlags, toonIndex = mmdMat.ToonIndex, }; rendererComponent.Materials.Add(mat); rendererComponent.materialsBaseData.Add(mat.innerStruct); rendererComponent.computedMaterialsData.Add(mat.innerStruct); } int morphCount = modelResource.Morphs.Count; rendererComponent.vertexMorphsA = new List <MorphVertexDesc[]>(); rendererComponent.vertexMorphsB = new List <MorphVertexDesc[]>(); for (int i = 0; i < morphCount; i++) { if (modelResource.Morphs[i].Type == PMX_MorphType.Vertex) { MorphVertexDesc[] morphVertexStructs = new MorphVertexDesc[modelResource.Morphs[i].MorphVertexs.Length]; PMX_MorphVertexDesc[] sourceMorph = modelResource.Morphs[i].MorphVertexs; for (int j = 0; j < morphVertexStructs.Length; j++) { morphVertexStructs[j].VertexIndex = sourceMorph[j].VertexIndex; } rendererComponent.vertexMorphsA.Add(morphVertexStructs); rendererComponent.vertexMorphsB.Add(morphVertexStructs); } else { rendererComponent.vertexMorphsA.Add(null); rendererComponent.vertexMorphsB.Add(null); } } //Dictionary<int, int> reportFrequency = new Dictionary<int, int>(10000); //for (int i = 0; i < morphCount; i++) //{ // if (modelResource.Morphs[i].Type == PMX_MorphType.Vertex) // { // PMX_MorphVertexDesc[] sourceMorph = modelResource.Morphs[i].MorphVertexs; // for (int j = 0; j < sourceMorph.Length; j++) // { // if (!reportFrequency.TryAdd(sourceMorph[j].VertexIndex, 1)) // { // reportFrequency[sourceMorph[j].VertexIndex]++; // } // } // } //} //int[] freqResult = new int[32]; //foreach (int value1 in reportFrequency.Values) //{ // if (value1 < 32) // { // freqResult[value1]++; // } // else // { // } //} }