VS_GS VS_Line(VS_GS input)
 {
     //invert y axis.
     input.Pos.Y  = -input.Pos.Y;
     input.Size.Y = -input.Size.Y; // y position of 2nd line point.
     return(input);
 }
        void GS(VS_GS[] input, TriangleStream <PS_IN> spriteStream)
        {
            PS_IN v = new PS_IN();
            VS_GS g = input[0];

            v.Color = g.Color;


            Matrix2x2 rot    = GetRotation(input[0].Rotation);
            Vector2   origin = g.Origin.XY;
            Vector2   pos    = g.Pos.XY;
            Vector2   size   = g.Size.XY;
            Vector2   uv     = g.UV.XY;
            Vector2   p;


            for (int i = 0; i < 4; i++)
            {
                p      = Mul(size * (spriteCorners[i] - origin), rot);
                p     += pos;
                v.Pos  = new Vector4(p, 0, 1);
                v.Pos  = Mul(v.Pos, wvp);
                v.UV.X = uv[uvTable[i].X];
                v.UV.Y = uv[uvTable[i].Y];
                v.UV.Z = g.ArraySlice;
                spriteStream.Append(v);
            }
        }
 VS_GS VS_Tri(VS_GS input)
 {
     //invert y axis.
     input.Pos.Y    = -input.Pos.Y;
     input.Size.Y   = -input.Size.Y;
     input.Origin.Y = -input.Origin.Y;
     return(input);
 }
        VS_GS VS(VS_GS input)
        {
            input.UV.XZ /= textureSize.X;
            input.UV.YW /= textureSize.Y;

            //invert y axis.
            input.Pos.Y = -input.Pos.Y;

            // Invert Y origin
            input.Origin.Y = -input.Origin.Y;

            return(input);
        }
 VS_GS VS_Circle(VS_GS input)
 {
     //invert y axis.
     input.Pos.Y = -input.Pos.Y;
     return(input);
 }