protected unsafe IEnumerable<VertexChannel> GetTriMeshMapChannels(IMesh mesh) { /* 3ds Max SDK Programmer's Guide > 3ds Max SDK Features > Rendering > Textures Maps > Mapping Channels */ /* There are up to 99 user maps in each mesh: * -2 Alpha * -1 Illum * 0 vertex colour * 1 default texcoords * 1 - 99 user uvw maps * Maps can be inspected for a mesh using the Edit > Channel Info... dialog in max. * When maps are added using the modifier stack they are always sequential. I.e. if you add just one uvw unwrap, and set it to map 5, four other preceeding channels will be created. */ List<VertexChannel> channels = new List<VertexChannel>(); //no unsafe code in iterators /* The two hidden maps are not counted in the getNumMaps() return value */ for (int i = 0; i < mesh.NumMaps; i++) { var map = mesh.Map(i); if (map.IsUsed) { VertexChannel channel = new VertexChannel(); channel.m_vertices = new Point3[map.Vnum]; fixed (Point3* dataptr = channel.m_vertices) { CopyMemory((IntPtr)dataptr, map.Tv.Handle, (uint)(sizeof(Point3) * map.Vnum)); } // channel.m_faces = new TVFace[map.Fnum]; //the indices3 struct is identical to the tvface struct but they are different in the sdk. for efficiency we just indices3 directly here. channel.m_faces = new Indices3[map.Fnum]; fixed (Indices3* dataptr = channel.m_faces) { CopyMemory((IntPtr)dataptr, map.Tf.Handle, (uint)(sizeof(Indices3) * map.Fnum)); } channel.m_type = (VertexChannelType)i; channels.Add(channel); } } return channels; }