예제 #1
0
        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,
            });
        }
예제 #2
0
        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
            //    {

            //    }
            //}
        }