示例#1
0
        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);
        }
示例#2
0
        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]);
            }
        }