Example #1
0
    public static void Export()
    {
        var p = EditorPrefs.GetString("projectPath");

        if (Directory.Exists(p))
        {
            Terrn.ExportTerrn();
            Terrn.ExportTextures();
            Tobj.Export();
            Otc.ExportMain();
            Otc.ExportPage();
            var root = GameObject.Find("root");
            if (root != null)
            {
                var objectExported = new List <string>();
                var meshesExported = new List <string>();
                foreach (Transform child in root.transform)
                {
                    if (!objectExported.Contains(child.name) && child.tag != "DefaultContent")
                    {
                        objectExported.Add(child.name);
                        Odef.Export(child.gameObject);

                        /*
                         * var m = child.GetComponentsInChildren<MeshFilter>();
                         * var mr = child.GetComponentsInChildren<MeshRenderer>();
                         *
                         *
                         * if (m.Length > 1 && !meshesExported.Contains(m[0].sharedMesh.name))
                         * {
                         *  var combinedMesh = new Mesh();
                         *  var combineIns = new List<CombineInstance>();
                         *  var materials = new List<Material>();
                         *  for (var i = 0; i < m.Length; i++)
                         *  {
                         *      print("combing " + m[i].sharedMesh.name);
                         *      combineIns.Add(new CombineInstance
                         *      {
                         *          mesh = m[i].sharedMesh,
                         *          transform = m[i].transform.worldToLocalMatrix
                         *
                         *      });
                         *      materials.AddRange(mr[i].sharedMaterials);
                         *  }
                         *  combinedMesh.name = m[0].sharedMesh.name;
                         *  materials = materials.Distinct().ToList();
                         *  combinedMesh.CombineMeshes(combineIns.ToArray(), false);
                         *  Meshes.Export(combinedMesh, materials.ToArray());
                         *  Materials.Export(materials.ToArray());
                         *  meshesExported.Add(combinedMesh.name);
                         * }
                         * else if (m.Length == 1 && !meshesExported.Contains(m[0].sharedMesh.name))
                         * {
                         *  Meshes.Export(m[0].sharedMesh, mr[0].sharedMaterials);
                         *  Materials.Export(mr[0].sharedMaterials);
                         *  meshesExported.Add(m[0].sharedMesh.name);
                         * }
                         */
                    }
                }

                var m  = root.GetComponentsInChildren <MeshFilter>();
                var mr = root.GetComponentsInChildren <MeshRenderer>();

                if (m.Length > 0)
                {
                    for (var i = 0; i < m.Length; i++)
                    {
                        if (!meshesExported.Contains(m[i].sharedMesh.name) && m[i].gameObject.tag != "DefaultContent")
                        {
                            Meshes.Export(m[i].sharedMesh, mr[i].sharedMaterials);
                            Materials.Export(mr[i].sharedMaterials);
                            meshesExported.Add(m[i].sharedMesh.name);
                        }
                    }
                }
            }
        }
    }
 public void testmatexp()
 {
     Materials.Export(GetComponent <MeshRenderer>().sharedMaterials);
 }
Example #3
0
        public IndexedResource <Mesh> ForceExport(Renderer r, Mesh mesh)
        {
            var materialIndices = new List <int>();

            foreach (var m in r.sharedMaterials)
            {
                var materialResource = Materials.Export(m);
                materialIndices.Add(materialResource.Index);
            }

            var primitiveExporter = new PrimitiveExporter(this);

            // Convert to right-handed coordinate system
            var positionAccIndex = ExportPositions(mesh.vertices);

            int?normalAccIndex = null;

            if (mesh.normals.Length > 0)
            {
                normalAccIndex = ExportNormals(mesh.normals);
            }

            int?tangentAccIndex = null;
            //if (mesh.tangents.Length > 0)
            //{
            //    tangentAccIndex = ExportTangents(mesh.tangents);
            //}

            int?texcoord0AccIndex = null;

            if (mesh.uv.Length > 0)
            {
                texcoord0AccIndex = ExportUV(mesh.uv);
            }

            int?texcoord1AccIndex = null;

            if (mesh.uv2.Length > 0)
            {
                texcoord1AccIndex = ExportUV(mesh.uv2);
            }

            int?color0AccIndex = null;

            if (mesh.colors.Length > 0)
            {
                color0AccIndex = ExportColors(mesh.colors);
            }

            int?joints0AccIndex  = null;
            int?weights0AccIndex = null;

            if (mesh.boneWeights.Length > 0)
            {
                var joints = mesh.boneWeights
                             .Select(w => new Vec4 <int>(
                                         w.boneIndex0,
                                         w.boneIndex1,
                                         w.boneIndex2,
                                         w.boneIndex3)
                                     ).ToArray();
                var weights = mesh.boneWeights
                              .Select(w => new Vector4(
                                          w.weight0,
                                          w.weight1,
                                          w.weight2,
                                          w.weight3)
                                      ).ToArray();

                joints0AccIndex  = ExportJoints(joints);
                weights0AccIndex = ExportWeights(weights);
            }

            #region blendSpace
            List <Target> targets = null;
            if (mesh.blendShapeCount > 0)
            {
                targets = new List <Target>();

                for (int i = 0; i < mesh.blendShapeCount; ++i)
                {
                    var name = mesh.GetBlendShapeName(i);

                    var deltaVertices = new Vector3[mesh.vertexCount];
                    var deltaNormals  = new Vector3[mesh.vertexCount];
                    var deltaTangents = new Vector3[mesh.vertexCount];

                    var frameCount = mesh.GetBlendShapeFrameCount(i);
                    mesh.GetBlendShapeFrameVertices(
                        i,
                        frameCount - 1 /* get last frame */,
                        deltaVertices,
                        deltaNormals,
                        deltaTangents);

                    // TODO: Export as sparse accessors
                    var mPositionAccIndex = ExportPositions(deltaVertices);
                    var mNormalsAccIndex  = ExportNormals(deltaNormals);
                    //var mTangentsAccIndex = ExportPositions(deltaTangents);
                    var mTangentsAccIndex = (int?)null;

                    var weight = mesh.GetBlendShapeFrameWeight(
                        i,
                        frameCount - 1 /* get last frame */);

                    targets.Add(new Target
                    {
                        Name = name,

                        Position = mPositionAccIndex,
                        Normal   = mNormalsAccIndex,
                        Tangent  = mTangentsAccIndex,

                        Weight = weight,
                    });
                }
            }

            List <Dictionary <string, int> > primTargets = null;
            if (targets != null)
            {
                primTargets = new List <Dictionary <string, int> >();

                foreach (var t in targets)
                {
                    var primTarget = new Dictionary <string, int>();
                    primTarget[TMPA.POSITION] = t.Position;
                    if (t.Normal != null)
                    {
                        primTarget[TMPA.NORMAL] = t.Normal.Value;
                    }
                    if (t.Tangent != null)
                    {
                        primTarget[TMPA.TANGENT] = t.Tangent.Value;
                    }

                    primTargets.Add(primTarget);
                }
            }
            #endregion

            var primitives = new List <Types.Mesh.PrimitiveType>();
            for (var i = 0; i < mesh.subMeshCount; ++i)
            {
                var indices = mesh.GetIndices(i);
                var positionindicesAccIndex = ExportIndices(indices);

                var attrs = new Dictionary <string, int>();
                attrs[TMPA.POSITION] = positionAccIndex;
                if (normalAccIndex != null)
                {
                    attrs[TMPA.NORMAL] = normalAccIndex.Value;
                }
                if (tangentAccIndex != null)
                {
                    attrs[TMPA.TANGENT] = tangentAccIndex.Value;
                }
                if (texcoord0AccIndex != null)
                {
                    attrs[TMPA.TEXCOORD_0] = texcoord0AccIndex.Value;
                }
                if (texcoord1AccIndex != null)
                {
                    attrs[TMPA.TEXCOORD_1] = texcoord1AccIndex.Value;
                }
                if (color0AccIndex != null)
                {
                    attrs[TMPA.COLOR_0] = color0AccIndex.Value;
                }
                if (joints0AccIndex != null)
                {
                    attrs[TMPA.JOINTS_0] = joints0AccIndex.Value;
                }
                if (weights0AccIndex != null)
                {
                    attrs[TMPA.WEIGHTS_0] = weights0AccIndex.Value;
                }

                var primitive = new Types.Mesh.PrimitiveType
                {
                    Attributes = attrs,
                    Indices    = positionindicesAccIndex,
                    Material   = materialIndices[i < materialIndices.Count ? i : materialIndices.Count - 1],
                    Targets    = primTargets,
                };
                primitives.Add(primitive);
            }

            var gltfMesh = new Types.Mesh
            {
                Name = mesh.name,

                Primitives = primitives,
                // Weights = Should support default morph target weights?
            };
            if (targets != null)
            {
                var targetNames = targets.Select(t => t.Name).ToArray();

                // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#morph-targets
                gltfMesh.Extras = new Dictionary <string, object>
                {
                    { "targetNames", targetNames },
                };
            }

            return(new IndexedResource <Mesh>
            {
                Index = Types.GltfExtensions.AddMesh(Gltf, gltfMesh),
                Value = mesh,
            });
        }