private static Vector3[] MeshToVertexArray(TargetPlatform platform, ModelMeshContent mesh) { MemoryStream ms; var buffer = mesh.MeshParts[0].VertexBuffer; // if (platform == TargetPlatform.Xbox360) // { // ms = new MemoryStream(ReverseByteOrder(buffer.VertexData)); // } // else // { ms = new MemoryStream(buffer.VertexData); // } BinaryReader reader = new BinaryReader(ms); var elems = buffer.VertexDeclaration.VertexElements; int count = mesh.MeshParts[0].NumVertices; ms.Seek(mesh.MeshParts[0].VertexOffset * buffer.VertexDeclaration.VertexStride.Value, SeekOrigin.Begin); var vertices = new Vector3[count]; for (int i = 0; i < count; i++) { foreach (var elType in elems) { if (elType.VertexElementUsage == VertexElementUsage.Position) { vertices[i].X = reader.ReadSingle(); vertices[i].Y = reader.ReadSingle(); vertices[i].Z = reader.ReadSingle(); } else { switch (elType.VertexElementFormat) { case VertexElementFormat.Color: reader.ReadUInt32(); break; case VertexElementFormat.Vector2: reader.ReadSingle(); reader.ReadSingle(); break; case VertexElementFormat.Vector3: reader.ReadSingle(); reader.ReadSingle(); reader.ReadSingle(); break; default: throw new InvalidContentException("Unrecognized element type in vertex buffer: " + elType.ToString()); } } } } var transforms = new Stack<Matrix>(); var bone = mesh.ParentBone; while (bone != null) { transforms.Push(bone.Transform); bone = bone.Parent; } var transform = Matrix.Identity; while (transforms.Count > 0) { transform *= transforms.Pop(); } Vector3.Transform(vertices, ref transform, vertices); return vertices; }
// Go through the modelmeshes and replace all basic effects for skinned models // with BasicPaletteEffect. private void ReplaceBasicEffects(ModelMeshContent input) { foreach (ModelMeshPartContent part in input.MeshParts) { SkinningType skinType = ContentUtil.GetSkinningType(part.VertexBuffer.VertexDeclaration.VertexElements); if (skinType != SkinningType.None) { ReplaceBasicEffect(skinType, part); } } }
private static Vector3 GetMeshTranslation(ModelMeshContent mesh) { var pos = Vector3.Zero; var bone = mesh.ParentBone; while (bone != null) { pos += bone.Transform.Translation; bone = bone.Parent; } return pos; }