Mega Code Archive

 
Categories / C# / Development Class
 

Mesh Utilities

using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Net; using Microsoft.Xna.Framework.Storage; namespace Havok {     namespace Utilities     {         public class HkpMeshBuffer         {             public List<Vector3> VertexBuffer = new List<Vector3>();             public List<short> IndexBuffer = new List<short>();             public List<int> IndexBuffer32Bit = new List<int>();             public IndexElementSize IndexSize;         }         public class MeshUtilities         {             public static List<Vector3> CalculateOverallVertices(Model mdl)             {                 List<Vector3> vertices = new List<Vector3>();                 foreach (ModelMesh mesh in mdl.Meshes)                 {                     foreach (ModelMeshPart meshPart in mesh.MeshParts)                     {                         int offset = vertices.Count;                         Vector3[] a = new Vector3[meshPart.NumVertices];                         mesh.VertexBuffer.GetData<Vector3>(meshPart.StreamOffset + meshPart.BaseVertex * meshPart.VertexStride,                             a, 0, meshPart.NumVertices, meshPart.VertexStride);                         Matrix mat = Matrix.Identity;                         for (int i = 0; i != a.Length; i++)                         {                             Vector3.Transform(ref a[i], ref mat, out a[i]);                         }                         vertices.AddRange(a);                     }                 }                 return vertices;             }             public static HkpMeshBuffer GetMeshPartMeshBuffer(ModelMesh mesh, int partIndex)             {                 HkpMeshBuffer meshBuffer = new HkpMeshBuffer();                 switch (mesh.MeshParts[partIndex].VertexStride)                 {                     case 32:                         {                             VertexPositionNormalTexture[] vb = new VertexPositionNormalTexture[mesh.MeshParts[partIndex].NumVertices];                             mesh.VertexBuffer.GetData<VertexPositionNormalTexture>(vb);                             foreach (VertexPositionNormalTexture vertex in vb)                             {                                 meshBuffer.VertexBuffer.Add(vertex.Position);                             }                             break;                         }                     case 24:                         {                             VertexPositionColorTexture[] vb = new VertexPositionColorTexture[mesh.MeshParts[partIndex].NumVertices];                             mesh.VertexBuffer.GetData<VertexPositionColorTexture>(vb);                             foreach (VertexPositionColorTexture vertex in vb)                             {                                 meshBuffer.VertexBuffer.Add(vertex.Position);                             }                             break;                         }                     case 20:                         {                             VertexPositionTexture[] vb = new VertexPositionTexture[mesh.MeshParts[partIndex].NumVertices];                             mesh.VertexBuffer.GetData<VertexPositionTexture>(vb);                             foreach (VertexPositionTexture vertex in vb)                             {                                 meshBuffer.VertexBuffer.Add(vertex.Position);                             }                             break;                         }                     case 16:                         {                             VertexPositionColor[] vb = new VertexPositionColor[mesh.MeshParts[partIndex].NumVertices];                             mesh.VertexBuffer.GetData<VertexPositionColor>(vb);                             foreach (VertexPositionColor vertex in vb)                             {                                 meshBuffer.VertexBuffer.Add(vertex.Position);                             }                             break;                         }                 }                 if (mesh.IndexBuffer.IndexElementSize == IndexElementSize.SixteenBits)                 {                     meshBuffer.IndexSize = IndexElementSize.SixteenBits;                     short[] ib = new short[mesh.IndexBuffer.SizeInBytes / sizeof(short)];                     mesh.IndexBuffer.GetData<short>(mesh.MeshParts[partIndex].StreamOffset, ib, mesh.MeshParts[partIndex].BaseVertex + mesh.MeshParts[partIndex].StartIndex,                         mesh.IndexBuffer.SizeInBytes / sizeof(short));                     foreach (short index in ib)                     {                         meshBuffer.IndexBuffer.Add(index);                     }                 }                 else if (mesh.IndexBuffer.IndexElementSize == IndexElementSize.ThirtyTwoBits)                 {                     meshBuffer.IndexSize = IndexElementSize.ThirtyTwoBits;                     int[] ib = new int[mesh.IndexBuffer.SizeInBytes / sizeof(int)];                     mesh.IndexBuffer.GetData<int>(mesh.MeshParts[partIndex].StreamOffset, ib, mesh.MeshParts[partIndex].BaseVertex + mesh.MeshParts[partIndex].StartIndex,                         mesh.IndexBuffer.SizeInBytes / sizeof(int));                     foreach (int index in ib)                     {                         meshBuffer.IndexBuffer32Bit.Add(index);                     }                 }                 else                 {                     throw new Exception("Unknown index format!");                 }                 return meshBuffer;             }         }     } }