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); }
/// <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); } } }
NanoMeshGroup *NanoMeshNewGroup(NanoMesh *mesh, [MarshalAs(UnmanagedType.LPStr)] string groupName);
bool NanoMeshSave(NanoMesh *mesh, [MarshalAs(UnmanagedType.LPStr)] string fileName);
NanoMeshGroup *NanoMeshGetGroup(NanoMesh *mesh, int groupId);
void NanoMeshClose(NanoMesh *mesh);