using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace Kav { public class SpriteMesh : ICullable, IIndexDrawable { public enum FlipOptions { None, Horizontal, Vertical, Both } private static readonly short[] Indices = new short[] { 0, 1, 2, 1, 3, 2 }; public IndexBuffer IndexBuffer { get; } public VertexBuffer VertexBuffer { get; } public BoundingBox BoundingBox { get; } public SpriteMesh( GraphicsDevice graphicsDevice, int width, int height, FlipOptions flipOptions ) { IndexBuffer = new IndexBuffer( graphicsDevice, IndexElementSize.SixteenBits, 6, BufferUsage.WriteOnly ); IndexBuffer.SetData(Indices); var vertexArray = GenerateVertexArray(width, height, flipOptions); VertexBuffer = new VertexBuffer( graphicsDevice, typeof(VertexPositionNormalTexture), 4, BufferUsage.WriteOnly ); VertexBuffer.SetData(vertexArray); BoundingBox = BoundingBox.CreateFromPoints(Positions(vertexArray)); } private static VertexPositionNormalTexture[] GenerateVertexArray(int pixelWidth, int pixelHeight, FlipOptions flipOptions) { var width = pixelWidth / (float)40; var height = pixelHeight / (float)40; VertexPositionNormalTexture[] result = new VertexPositionNormalTexture[4]; var xLeft = 0; var xRight = 1; var yTop = 0; var yBottom = 1; if (flipOptions == FlipOptions.Horizontal || flipOptions == FlipOptions.Both) { xLeft = 1; xRight = 0; } if (flipOptions == FlipOptions.Vertical || flipOptions == FlipOptions.Both) { yTop = 1; yBottom = 0; } result[0].Position = new Vector3(-width / 2, height / 2, 0); result[0].Normal = new Vector3(0, 0, -1); result[0].TextureCoordinate = new Vector2(xLeft, yTop); result[1].Position = new Vector3(width / 2, height / 2, 0); result[1].Normal = new Vector3(0, 0, -1); result[1].TextureCoordinate = new Vector2(xRight, yTop); result[2].Position = new Vector3(-width / 2, -height / 2, 0); result[2].Normal = new Vector3(0, 0, -1); result[2].TextureCoordinate = new Vector2(xLeft, yBottom); result[3].Position = new Vector3(width / 2, -height / 2, 0); result[3].Normal = new Vector3(0, 0, -1); result[3].TextureCoordinate = new Vector2(xRight, yBottom); return result; } private static IEnumerable Positions(IEnumerable vertices) { foreach (var vertex in vertices) { yield return vertex.Position; } } } }