Hi Monogame,
I am working on a simple 2D Graphics Library for games. It has worked in previous versions but I am currently having a subtle bug problem.
I want points specified in drawing methods to correspond directly to traditional screen pixel coordinates. So, let’s say a screen is 1024 x 768. I want my DrawBox method to take a Rectangle as a parameter (e.g. 0, 0, 1024, 768) and the box to be drawn around the edge pixels of the screen.
My drawbox method uses a linestrip to draw the box, and the results seem to be slightly off. In 1920 x 1080 resolution, for example, the origin 0, 0 is off the screen, and point 1919, 1079 is not the bottom right. So a box the size of the screen is shown missing the top and left boundary lines.
This is the code that sets up the standard BasicEffect used for the transformations -
// Create a convenient coordinate transformation matrix.
screenTransformMatrix = Matrix.CreateScale (2f / (float) surfaceWidth, -2f / (float) surfaceHeight, 0) * Matrix.CreateTranslation (-1, 1, 0);
surfaceTransformMatrix = screenTransformMatrix;
[…]
// This is a 2 dimensional graphics engine. No matrix transformations on points are desirable.
standardEffect.Projection = Matrix.Identity;
// Automatically transform surface points to render points.
standardEffect.View = surfaceTransformMatrix;
standardEffect.World = Matrix.Identity;
// Standard effect basic settings.
standardEffect.Alpha = 1;
standardEffect.TextureEnabled = false;
standardEffect.VertexColorEnabled = true;
I am worried it is slightly incorrect?
This is the code that draws the box -
boxArray [0] = new VertexPositionColorTexture (new Vector3 (box.Left, box.Top, 0), lineColour, new Vector2 (0, 0));
boxArray [1] = new VertexPositionColorTexture (new Vector3 (box.Right - 1, box.Top, 0), lineColour, new Vector2 (0, 0));
boxArray [2] = new VertexPositionColorTexture (new Vector3 (box.Right - 1, box.Bottom - 1, 0), lineColour, new Vector2 (0, 0));
boxArray [3] = new VertexPositionColorTexture (new Vector3 (box.Left, box.Bottom - 1, 0), lineColour, new Vector2 (0, 0));
boxArray [4] = boxArray [0];
lock (synchronisationObject)
{
// Set texture addressing to clamp mode.
outputDevice.BlendState = BlendState.AlphaBlend;
outputDevice.SamplerStates [0] = SamplerState.PointClamp;
// Render the box.
standardEffect.Alpha = (float) lineColour.A / 255f;
standardEffect.TextureEnabled = false;
standardEffect.CurrentTechnique.Passes [0].Apply ();
outputDevice.DrawUserPrimitives<VertexPositionColorTexture> (PrimitiveType.LineStrip, boxArray, 0, 4);
}
I get the impression the problem is with the translation. The resulting boxes are also missing the top left pixel when looked at on screen…