public CollisionMesh(Model model, uint subdivLevel) { int verticesCapacity = 0; int facesCapacity = 0; foreach (ModelMesh mesh in model.Meshes) { foreach (ModelMeshPart part in mesh.MeshParts) { verticesCapacity += part.VertexBuffer.VertexCount; facesCapacity += part.PrimitiveCount; } } vertices = new Vector3[verticesCapacity]; faces = new CollisionFace[facesCapacity]; int verticesLength = 0; int facesLength = 0; Matrix[] modelTransforms = new Matrix[model.Bones.Count]; model.CopyAbsoluteBoneTransformsTo(modelTransforms); foreach (ModelMesh mesh in model.Meshes) { Matrix meshTransform = modelTransforms[mesh.ParentBone.Index]; foreach (ModelMeshPart part in mesh.MeshParts) { int vertexCount = part.VertexBuffer.VertexCount; CustomVertex[] partVertices = new CustomVertex[vertexCount]; part.VertexBuffer.GetData(partVertices); for (int i = 0; i < vertexCount; i++) { vertices[verticesLength + i] = Vector3.Transform(partVertices[i].Position, meshTransform); } int indexCount = part.IndexBuffer.IndexCount; short[] partIndices = new short[indexCount]; part.IndexBuffer.GetData(partIndices); for (int i = 0; i < part.PrimitiveCount; i++) { faces[facesLength + i] = new CollisionFace( part.StartIndex + i * 3, partIndices, verticesLength + part.VertexOffset, vertices); } verticesLength += vertexCount; facesLength += part.PrimitiveCount; } } CollisionBox box = new CollisionBox(float.MaxValue, -float.MaxValue); for (int i = 0; i < verticesCapacity; i++) box.AddPoint(vertices[i]); if (subdivLevel > 6) subdivLevel = 6; // max 8^6 nodes tree = new CollisionTree(box, subdivLevel); for (int i = 0; i < facesCapacity; i++) tree.AddElement(faces[i]); }
public CollisionMesh(Model model, uint subdivLevel) { int verticesCapacity = 0; int facesCapacity = 0; foreach (ModelMesh mesh in model.Meshes) { foreach (ModelMeshPart part in mesh.MeshParts) { verticesCapacity += part.VertexBuffer.VertexCount; facesCapacity += part.PrimitiveCount; } } vertices = new Vector3[verticesCapacity]; faces = new CollisionFace[facesCapacity]; int verticesLength = 0; int facesLength = 0; Matrix[] modelTransforms = new Matrix[model.Bones.Count]; model.CopyAbsoluteBoneTransformsTo(modelTransforms); foreach (ModelMesh mesh in model.Meshes) { Matrix meshTransform = modelTransforms[mesh.ParentBone.Index]; foreach (ModelMeshPart part in mesh.MeshParts) { int vertexCount = part.VertexBuffer.VertexCount; CustomVertex[] partVertices = new CustomVertex[vertexCount]; part.VertexBuffer.GetData(partVertices); for (int i = 0; i < vertexCount; i++) { vertices[verticesLength + i] = Vector3.Transform(partVertices[i].Position, meshTransform); } int indexCount = part.IndexBuffer.IndexCount; short[] partIndices = new short[indexCount]; part.IndexBuffer.GetData(partIndices); for (int i = 0; i < part.PrimitiveCount; i++) { faces[facesLength + i] = new CollisionFace( part.StartIndex + i * 3, partIndices, verticesLength + part.VertexOffset, vertices); } verticesLength += vertexCount; facesLength += part.PrimitiveCount; } } CollisionBox box = new CollisionBox(float.MaxValue, -float.MaxValue); for (int i = 0; i < verticesCapacity; i++) { box.AddPoint(vertices[i]); } if (subdivLevel > 6) { subdivLevel = 6; // max 8^6 nodes } tree = new CollisionTree(box, subdivLevel); for (int i = 0; i < facesCapacity; i++) { tree.AddElement(faces[i]); } }