Exemple #1
0
        private void BuildMeshes(GameObject obj, List <int> LoD0Indices, Transform[] bones)
        {
            // Group Object
            GameObject meshesGroup = new GameObject("Meshes");

            meshesGroup.transform.SetParent(obj.transform);

            // Submeshes
            for (int sm = 0; sm < LoD0Indices.Count; sm++)
            {
                int index = LoD0Indices[sm];

                // Object
                GameObject submesh = new GameObject();
                submesh.name = data.model.submeshes[index].name;
                submesh.transform.SetParent(meshesGroup.transform);

                // Mesh
                Mesh m = new Mesh();
                m.SetVertices(data.model.submeshes[index].vertices);
                m.SetTriangles(data.model.submeshes[index].triangles, 0);
                m.SetNormals(data.model.submeshes[index].normals);
                m.SetTangents(data.model.submeshes[index].tangents);
                m.SetUVs(0, data.model.submeshes[index].uvs);
                SkinnedMeshRenderer meshRenderer = submesh.AddComponent <SkinnedMeshRenderer>();
                MeshFilter          meshFilter   = submesh.AddComponent <MeshFilter>();
                meshFilter.mesh = m;

                // weights
                m.boneWeights = data.model.submeshes[index].boneWeights;

                // bind poses
                Matrix4x4[] bindPoses = new Matrix4x4[bones.Length];
                for (int b = 0; b < bindPoses.Length; b++)
                {
                    bindPoses[b] = bones[b].worldToLocalMatrix * submesh.transform.localToWorldMatrix;
                }
                m.bindposes             = bindPoses;
                meshRenderer.bones      = bones;
                meshRenderer.sharedMesh = m;

                // Texture
                string folderPath   = Path.GetDirectoryName(filePath);
                string textureName_ = data.model.textures[data.model.materials[data.model.submeshes[index].id].texture];      // *sweat in RP*
                textureName_ = PathHelper.GetFileName(textureName_);
                textureName_ = textureName_.Remove(textureName_.Length - 12);

                string diffuseTexturePath  = folderPath + @"\" + textureName_ + "diffuse" + ".dds";
                string emissiveTexturePath = folderPath + @"\" + textureName_ + "emissive" + ".dds";
                string normalTexturePath   = folderPath + @"\" + textureName_ + "normal" + ".dds";
                string ormTexturePath      = folderPath + @"\" + textureName_ + "orm" + ".dds";
                // Material
                UnityEngine.Material mat = new UnityEngine.Material(defaultMaterial);

                if (File.Exists(diffuseTexturePath))
                {
                    Texture2D texture = DDS.ImportToTexture2D(diffuseTexturePath);
                    mat.SetTexture("_MainTex", texture);
                }
                if (File.Exists(emissiveTexturePath))
                {
                    mat.EnableKeyword("_EMISSION");
                    Texture2D texture = DDS.ImportToTexture2D(emissiveTexturePath);
                    mat.SetTexture("_EmissionMap", texture);
                }
                if (File.Exists(normalTexturePath))
                {
                    mat.EnableKeyword("_NORMALMAP");
                    Texture2D texture = DDS.ImportToTexture2D(normalTexturePath);
                    mat.SetTexture("_BumpMap", texture);
                }
                if (File.Exists(ormTexturePath))
                {
                    mat.EnableKeyword("_METALLICGLOSSMAP");
                    Texture2D texture = DDS.ImportToTexture2D(ormTexturePath);
                    //mat.SetTexture("_MetallicGlossMap", texture);
                    mat.SetTexture("_ORM", texture);
                }
                mat.SetFloat("_Glossiness", 0.44f);
                mat.SetFloat("_GlossMapScale", 0.44f);
                meshRenderer.material = mat;
            }
        }