using System; using OpenMetaverse; using OpenMetaverse.Rendering; namespace AvatarPreview { /// /// Subclass of LindenMesh that adds vertex, index, and texture coordinate /// arrays suitable for pushing direct to OpenGL /// public class GLMesh : LindenMesh { /// /// Subclass of LODMesh that adds an index array suitable for pushing /// direct to OpenGL /// new public class LODMesh : LindenMesh.LODMesh { public ushort[] Indices; public override void LoadMesh(string filename) { base.LoadMesh(filename); // Generate the index array Indices = new ushort[_numFaces * 3]; int current = 0; for (int i = 0; i < _numFaces; i++) { Indices[current++] = (ushort)_faces[i].Indices[0]; Indices[current++] = (ushort)_faces[i].Indices[1]; Indices[current++] = (ushort)_faces[i].Indices[2]; } } } /// /// /// public struct GLData { public float[] Vertices; public ushort[] Indices; public float[] TexCoords; public Vector3 Center; } public GLData RenderData; public GLMesh(string name) : base(name) { } public override void LoadMesh(string filename) { base.LoadMesh(filename); float minX, minY, minZ; minX = minY = minZ = Single.MaxValue; float maxX, maxY, maxZ; maxX = maxY = maxZ = Single.MinValue; // Generate the vertex array RenderData.Vertices = new float[NumVertices * 3]; int current = 0; for (int i = 0; i < NumVertices; i++) { RenderData.Vertices[current++] = Vertices[i].Coord.X; RenderData.Vertices[current++] = Vertices[i].Coord.Y; RenderData.Vertices[current++] = Vertices[i].Coord.Z; if (Vertices[i].Coord.X < minX) minX = Vertices[i].Coord.X; else if (Vertices[i].Coord.X > maxX) maxX = Vertices[i].Coord.X; if (Vertices[i].Coord.Y < minY) minY = Vertices[i].Coord.Y; else if (Vertices[i].Coord.Y > maxY) maxY = Vertices[i].Coord.Y; if (Vertices[i].Coord.Z < minZ) minZ = Vertices[i].Coord.Z; else if (Vertices[i].Coord.Z > maxZ) maxZ = Vertices[i].Coord.Z; } // Calculate the center-point from the bounding box edges RenderData.Center = new Vector3((minX + maxX) / 2, (minY + maxY) / 2, (minZ + maxZ) / 2); // Generate the index array RenderData.Indices = new ushort[NumFaces * 3]; current = 0; for (int i = 0; i < NumFaces; i++) { RenderData.Indices[current++] = (ushort)Faces[i].Indices[0]; RenderData.Indices[current++] = (ushort)Faces[i].Indices[1]; RenderData.Indices[current++] = (ushort)Faces[i].Indices[2]; } // Generate the texcoord array RenderData.TexCoords = new float[NumVertices * 2]; current = 0; for (int i = 0; i < NumVertices; i++) { RenderData.TexCoords[current++] = Vertices[i].TexCoord.X; RenderData.TexCoords[current++] = Vertices[i].TexCoord.Y; } } public override void LoadLODMesh(int level, string filename) { LODMesh lod = new LODMesh(); lod.LoadMesh(filename); LodMeshes[level] = lod; } } }