public bool DrawSprite(Texture2D texture, Vector3 position, Vector2 area, Color?hue = null, bool zInc = true, bool Palettized = false) { List <VertexPositionTextureHueExtra> vertexList; if (_drawQueue.ContainsKey(texture)) { vertexList = _drawQueue[texture]; } else { if (_vertexListQueue.Count > 0) { vertexList = _vertexListQueue.Dequeue(); vertexList.Clear(); } else { vertexList = new List <VertexPositionTextureHueExtra>(1024); } _drawQueue.Add(texture, vertexList); } if (zInc) { position += _zOffset; _zOffset.Z++; } PreTransformedQuad q = new PreTransformedQuad(position, area, (hue == null ? Color.White : hue.Value), new Vector2(0, Palettized ? 0 : 1)); for (int i = 0; i < q.Vertices.Length; i++) { vertexList.Add(q.Vertices[i]); } return(true); }
public void GUIDrawSprite(Texture2D texture, Rectangle destinationRectangle, Rectangle?sourceRectangle = null, Color?color = null, SpriteEffects effects = SpriteEffects.None, bool Palettized = false, int Palette = 0) { if (texture == null) { return; } Vector4 dest = new Vector4(destinationRectangle.X, destinationRectangle.Y, destinationRectangle.Right, destinationRectangle.Bottom); Vector4 srcDelta = new Vector4(); if (sourceRectangle == null) { sourceRectangle = new Rectangle(0, 0, texture.Width, texture.Height); } // clipping if (dest.X < m_GUIClipRect.X) { if (dest.Z < m_GUIClipRect.X) { return; } float delta = m_GUIClipRect.X - dest.X; dest.X += delta; srcDelta.X = delta / destinationRectangle.Width; } if (dest.Z > m_GUIClipRect.Z) { if (dest.X > m_GUIClipRect.Z) { return; } float delta = m_GUIClipRect.Z - dest.Z; dest.Z += delta; srcDelta.Z = delta / destinationRectangle.Width; } if (dest.Y < m_GUIClipRect.Y) { if (dest.W < m_GUIClipRect.Y) { return; } float delta = m_GUIClipRect.Y - dest.Y; dest.Y += delta; srcDelta.Y = delta / destinationRectangle.Width; } if (dest.W > m_GUIClipRect.W) { if (dest.Y > m_GUIClipRect.W) { return; } float delta = m_GUIClipRect.W - dest.W; dest.W += delta; srcDelta.W = delta / destinationRectangle.Width; } Vector4 source = new Vector4( (float)sourceRectangle.Value.X / texture.Width, (float)sourceRectangle.Value.Y / texture.Height, (float)sourceRectangle.Value.Right / texture.Width, (float)sourceRectangle.Value.Bottom / texture.Height); source.X += srcDelta.X * ((float)sourceRectangle.Value.Width / texture.Width); source.Y += srcDelta.Y * ((float)sourceRectangle.Value.Width / texture.Height); source.Z += srcDelta.Z * ((float)sourceRectangle.Value.Width / texture.Width); source.W += srcDelta.W * ((float)sourceRectangle.Value.Width / texture.Height); if (effects.HasFlag(SpriteEffects.FlipHorizontally)) { float x = source.X; source.X = source.Z; source.Z = x; } if (effects.HasFlag(SpriteEffects.FlipVertically)) { float y = source.Y; source.Y = source.W; source.W = y; } PreTransformedQuad q = new PreTransformedQuad(texture, dest, source, _zOffset.Z++, color == null ? Color.White : color.Value, new Vector2(Palette, Palettized ? 0 : 1)); List <VertexPositionTextureHueExtra> vertexList; if (_drawQueue.ContainsKey(texture)) { vertexList = _drawQueue[texture]; } else { if (_vertexListQueue.Count > 0) { vertexList = _vertexListQueue.Dequeue(); vertexList.Clear(); } else { vertexList = new List <VertexPositionTextureHueExtra>(1024); } _drawQueue.Add(texture, vertexList); } for (int i = 0; i < q.Vertices.Length; i++) { vertexList.Add(q.Vertices[i]); } }