Example #1
0
        static Mesh LoadSubmesh(NanoMesh *sdmesh, int index)
        {
            NanoMeshGroup *g = NanoMeshGetGroup(sdmesh, index);

            if (g == null)
            {
                throw new IndexOutOfRangeException($"Invalid W3D submesh index: {index}");
            }

        #if UNITY_2018_1_OR_NEWER
            var mesh = new Mesh
            {
                name      = g->Name.AsString,
                vertices  = g->Vertices.AsArray,
                normals   = g->Normals.AsArray,
                uv        = g->Coords.AsArray,
                triangles = g->Indices.AsArray
            };
            mesh.RecalculateTangents();
            mesh.RecalculateBounds();
        #else
            var mesh = new Mesh
            {
                Name      = g->Name.AsString,
                Vertices  = g->Vertices.AsArray,
                Normals   = g->Normals.AsArray,
                Coords    = g->Coords.AsArray,
                Triangles = g->Indices.AsArray
            };
        #endif
            return(mesh);
        }
Example #2
0
        /// <summary>
        /// Attempts to load an .OBJ file.
        /// TODO: Currently only 1 meshgroup is supported
        /// </summary>
        /// <param name="meshPath">.OBJ file to load</param>
        /// <param name="options">MeshLoader options control processing steps during loading</param>
        /// <returns>Loaded mesh or throws exception</returns>
        public static Mesh Load(string meshPath, Options options)
        {
            if (!File.Exists(meshPath))
            {
                throw new FileNotFoundException($"Mesh file does not exist: {meshPath}");
            }

            NanoMesh *nanoMesh = null;

            try
            {
                nanoMesh = NanoMeshOpen(meshPath, options);
                if (nanoMesh == null)
                {
                    throw new IOException($"Mesh open failed: {meshPath}\n{NanoGetLastError()}");
                }

                // @todo We only support 1 meshgroup
                return(LoadSubmesh(nanoMesh, 0));
            }
            finally
            {
                if (nanoMesh != null)
                {
                    NanoMeshClose(nanoMesh);
                }
            }
        }
Example #3
0
 NanoMeshGroup *NanoMeshNewGroup(NanoMesh *mesh, [MarshalAs(UnmanagedType.LPStr)] string groupName);
Example #4
0
 bool NanoMeshSave(NanoMesh *mesh, [MarshalAs(UnmanagedType.LPStr)] string fileName);
Example #5
0
 NanoMeshGroup *NanoMeshGetGroup(NanoMesh *mesh, int groupId);
Example #6
0
 void NanoMeshClose(NanoMesh *mesh);