internal void DrawCharacter(Texture texture, ref Matrix worldViewProjectionMatrix, ref RectangleF sourceRectangle, ref Color color, int depthBias, SwizzleMode swizzle) { if (texture == null) { throw new ArgumentNullException(nameof(texture)); } // Calculate the information needed to draw. var drawInfo = new UIImageDrawInfo { Source = { X = sourceRectangle.X / texture.ViewWidth, Y = sourceRectangle.Y / texture.ViewHeight, Width = sourceRectangle.Width / texture.ViewWidth, Height = sourceRectangle.Height / texture.ViewHeight }, DepthBias = depthBias, Color = color, Swizzle = swizzle, Primitive = PrimitiveType.Rectangle, VertexShift = Vector4.Zero, UnitXWorld = worldViewProjectionMatrix.Row1, UnitYWorld = worldViewProjectionMatrix.Row2, LeftTopCornerWorld = worldViewProjectionMatrix.Row4, }; var elementInfo = new ElementInfo(4, 6, ref drawInfo, depthBias); Draw(texture, ref elementInfo); }
private void DrawCube(ref Matrix worldMatrix, ref Vector3 elementSize, ref Color color, int depthBias, bool isReverse) { // Skip items with null size if (elementSize.Length() < MathUtil.ZeroTolerance) { return; } // Calculate the information needed to draw. var drawInfo = new UIImageDrawInfo { DepthBias = depthBias, ColorScale = color, ColorAdd = new Color(0, 0, 0, 0), Primitive = isReverse ? PrimitiveType.ReverseCube : PrimitiveType.Cube, }; var matrix = worldMatrix; matrix.M11 *= elementSize.X; matrix.M12 *= elementSize.X; matrix.M13 *= elementSize.X; matrix.M21 *= elementSize.Y; matrix.M22 *= elementSize.Y; matrix.M23 *= elementSize.Y; matrix.M31 *= elementSize.Z; matrix.M32 *= elementSize.Z; matrix.M33 *= elementSize.Z; Matrix worldViewProjection; Matrix.Multiply(ref matrix, ref viewProjectionMatrix, out worldViewProjection); drawInfo.UnitXWorld = worldViewProjection.Row1; drawInfo.UnitYWorld = worldViewProjection.Row2; drawInfo.UnitZWorld = worldViewProjection.Row3; Vector4.Transform(ref vector4LeftTop, ref worldViewProjection, out drawInfo.LeftTopCornerWorld); var elementInfo = new ElementInfo(8, 6 * 6, ref drawInfo, depthBias); Draw(whiteTexture, ref elementInfo); }
/// <summary> /// Draw a rectangle of the provided size at the position specified by the world matrix having the provided color. /// </summary> /// <param name="worldMatrix">The world matrix specifying the position of the rectangle in the world</param> /// <param name="elementSize">The size of the rectangle</param> /// <param name="color">The color of the rectangle</param> /// <param name="depthBias">The depth bias to use when drawing the element</param> public void DrawRectangle(ref Matrix worldMatrix, ref Vector3 elementSize, ref Color color, int depthBias) { // Skip items with null size if (elementSize.LengthSquared() < MathUtil.ZeroTolerance) { return; } // Calculate the information needed to draw. var drawInfo = new UIImageDrawInfo { DepthBias = depthBias, ColorScale = color, ColorAdd = Color.Zero, Primitive = PrimitiveType.Rectangle, }; var matrix = worldMatrix; matrix.M11 *= elementSize.X; matrix.M12 *= elementSize.X; matrix.M13 *= elementSize.X; matrix.M21 *= elementSize.Y; matrix.M22 *= elementSize.Y; matrix.M23 *= elementSize.Y; matrix.M31 *= elementSize.Z; matrix.M32 *= elementSize.Z; matrix.M33 *= elementSize.Z; Matrix worldViewProjection; Matrix.Multiply(ref matrix, ref viewProjectionMatrix, out worldViewProjection); drawInfo.UnitXWorld = worldViewProjection.Row1; drawInfo.UnitYWorld = worldViewProjection.Row2; drawInfo.UnitZWorld = worldViewProjection.Row3; Vector4.Transform(ref vector4LeftTop, ref worldViewProjection, out drawInfo.LeftTopCornerWorld); var elementInfo = new ElementInfo(4, 6, in drawInfo, depthBias); Draw(whiteTexture, in elementInfo); }
internal void DrawCharacter(Texture texture, ref Matrix worldViewProjectionMatrix, ref RectangleF sourceRectangle, ref Color color, int depthBias, SwizzleMode swizzle) { // Check that texture is not null if (texture == null) { throw new ArgumentNullException("texture"); } // End the current batching session and change the effect if required if (separateAlphaEffectBinded) { End(); separateAlphaEffectBinded = !separateAlphaEffectBinded; Begin(separateAlphaEffectBinded ? uiSeparateAlphaEffect : null, separateAlphaEffectBinded ? uiSeparateAlphaParameterCollectionGroup : null, SortMode, BlendState, SamplerState, DepthStencilState, RasterizerState, StencilReferenceValue); } // Calculate the information needed to draw. var drawInfo = new UIImageDrawInfo { Source = { X = sourceRectangle.X / texture.ViewWidth, Y = sourceRectangle.Y / texture.ViewHeight, Width = sourceRectangle.Width / texture.ViewWidth, Height = sourceRectangle.Height / texture.ViewHeight }, DepthBias = depthBias, Color = color, Swizzle = swizzle, Primitive = PrimitiveType.Rectangle, VertexShift = Vector4.Zero, UnitXWorld = worldViewProjectionMatrix.Row1, UnitYWorld = worldViewProjectionMatrix.Row2, LeftTopCornerWorld = worldViewProjectionMatrix.Row4, }; var elementInfo = new ElementInfo(4, 6, ref drawInfo, depthBias); Draw(texture, null, ref elementInfo); }
/// <summary> /// Batch a new border image draw to the draw list. /// </summary> /// <param name="texture">The texture to use during the draw</param> /// <param name="worldMatrix">The world matrix of the element</param> /// <param name="sourceRectangle">The rectangle indicating the source region of the texture to use</param> /// <param name="elementSize">The size of the ui element</param> /// <param name="borderSize">The size of the borders in the texture in pixels (left/right/top/bottom)</param> /// <param name="color">The color to apply to the texture image.</param> /// <param name="depthBias">The depth bias of the ui element</param> /// <param name="imageOrientation">The rotation to apply on the image uv</param> /// <param name="swizzle">Swizzle mode indicating the swizzle use when sampling the texture in the shader</param> /// <param name="snapImage">Indicate if the image needs to be snapped or not</param> public void DrawImage(Texture texture, ref Matrix worldMatrix, ref RectangleF sourceRectangle, ref Vector3 elementSize, ref Vector4 borderSize, ref Color color, int depthBias, ImageOrientation imageOrientation = ImageOrientation.AsIs, SwizzleMode swizzle = SwizzleMode.None, bool snapImage = false) { if (texture == null) { throw new ArgumentNullException(nameof(texture)); } // Skip items with null size if (elementSize.Length() < MathUtil.ZeroTolerance) { return; } // Calculate the information needed to draw. var drawInfo = new UIImageDrawInfo { Source = { X = sourceRectangle.X / texture.ViewWidth, Y = sourceRectangle.Y / texture.ViewHeight, Width = sourceRectangle.Width / texture.ViewWidth, Height = sourceRectangle.Height / texture.ViewHeight }, DepthBias = depthBias, Color = color, Swizzle = swizzle, SnapImage = snapImage, Primitive = borderSize == Vector4.Zero? PrimitiveType.Rectangle : PrimitiveType.BorderRectangle, BorderSize = new Vector4(borderSize.X / sourceRectangle.Width, borderSize.Y / sourceRectangle.Height, borderSize.Z / sourceRectangle.Width, borderSize.W / sourceRectangle.Height), }; var rotatedSize = imageOrientation == ImageOrientation.AsIs? elementSize: new Vector3(elementSize.Y, elementSize.X, 0); drawInfo.VertexShift = new Vector4(borderSize.X / rotatedSize.X, borderSize.Y / rotatedSize.Y, 1f - borderSize.Z / rotatedSize.X, 1f - borderSize.W / rotatedSize.Y); var matrix = worldMatrix; matrix.M11 *= elementSize.X; matrix.M12 *= elementSize.X; matrix.M13 *= elementSize.X; matrix.M21 *= elementSize.Y; matrix.M22 *= elementSize.Y; matrix.M23 *= elementSize.Y; matrix.M31 *= elementSize.Z; matrix.M32 *= elementSize.Z; matrix.M33 *= elementSize.Z; Matrix worldViewProjection; Matrix.Multiply(ref matrix, ref viewProjectionMatrix, out worldViewProjection); drawInfo.UnitXWorld = worldViewProjection.Row1; drawInfo.UnitYWorld = worldViewProjection.Row2; // rotate origin and unit axis if need. var leftTopCorner = vector4LeftTop; if (imageOrientation == ImageOrientation.Rotated90) { var unitX = drawInfo.UnitXWorld; drawInfo.UnitXWorld = -drawInfo.UnitYWorld; drawInfo.UnitYWorld = unitX; leftTopCorner = new Vector4(-0.5f, 0.5f, 0, 1); } Vector4.Transform(ref leftTopCorner, ref worldViewProjection, out drawInfo.LeftTopCornerWorld); var verticesPerElement = 4; var indicesPerElement = 6; if (drawInfo.Primitive == PrimitiveType.BorderRectangle) { verticesPerElement = 16; indicesPerElement = 54; } var elementInfo = new ElementInfo(verticesPerElement, indicesPerElement, ref drawInfo, depthBias); Draw(texture, ref elementInfo); }
/// <summary> /// Batch a new border image draw to the draw list. /// </summary> /// <param name="texture">The texture to use during the draw</param> /// <param name="texture1">An optional texture that can be used to substitute <paramref name="texture"/>'s alpha</param> /// <param name="worldMatrix">The world matrix of the element</param> /// <param name="sourceRectangle">The rectangle indicating the source region of the texture to use</param> /// <param name="elementSize">The size of the ui element</param> /// <param name="borderSize">The size of the borders in the texture in pixels (left/right/top/bottom)</param> /// <param name="color">The color to apply to the texture image.</param> /// <param name="depthBias">The depth bias of the ui element</param> /// <param name="imageOrientation">The rotation to apply on the image uv</param> /// <param name="swizzle">Swizzle mode indicating the swizzle use when sampling the texture in the shader</param> /// <param name="snapImage">Indicate if the image needs to be snapped or not</param> public void DrawImage(Texture texture, Texture texture1, ref Matrix worldMatrix, ref RectangleF sourceRectangle, ref Vector3 elementSize, ref Vector4 borderSize, ref Color color, int depthBias, ImageOrientation imageOrientation = ImageOrientation.AsIs, SwizzleMode swizzle = SwizzleMode.None, bool snapImage = false) { // Check that texture is not null if (texture == null) { throw new ArgumentNullException("texture"); } // Skip items with null size if (elementSize.Length() < MathUtil.ZeroTolerance) { return; } // End the current batching session and change the effect if required if (texture1 == null && separateAlphaEffectBinded || texture1 != null && !separateAlphaEffectBinded) { End(); separateAlphaEffectBinded = !separateAlphaEffectBinded; Begin(separateAlphaEffectBinded? uiSeparateAlphaEffect: null, separateAlphaEffectBinded ? uiSeparateAlphaParameterCollectionGroup : null, SortMode, BlendState, SamplerState, DepthStencilState, RasterizerState, StencilReferenceValue); } // Calculate the information needed to draw. var drawInfo = new UIImageDrawInfo { Source = { X = sourceRectangle.X / texture.ViewWidth, Y = sourceRectangle.Y / texture.ViewHeight, Width = sourceRectangle.Width / texture.ViewWidth, Height = sourceRectangle.Height / texture.ViewHeight }, DepthBias = depthBias, Color = color, Swizzle = swizzle, SnapImage = snapImage, Primitive = borderSize == Vector4.Zero? PrimitiveType.Rectangle : PrimitiveType.BorderRectangle, BorderSize = new Vector4(borderSize.X / sourceRectangle.Width, borderSize.Y / sourceRectangle.Width, borderSize.Z / sourceRectangle.Height, borderSize.W / sourceRectangle.Height), }; var rotatedSize = imageOrientation == ImageOrientation.AsIs? elementSize: new Vector3(elementSize.Y, elementSize.X, 0); drawInfo.VertexShift = new Vector4(borderSize.X / rotatedSize.X, 1f - borderSize.Y / rotatedSize.X, borderSize.Z / rotatedSize.Y, 1f - borderSize.W / rotatedSize.Y); var matrix = worldMatrix; matrix.M11 *= elementSize.X; matrix.M12 *= elementSize.X; matrix.M13 *= elementSize.X; matrix.M21 *= elementSize.Y; matrix.M22 *= elementSize.Y; matrix.M23 *= elementSize.Y; matrix.M31 *= elementSize.Z; matrix.M32 *= elementSize.Z; matrix.M33 *= elementSize.Z; Matrix worldViewProjection; Matrix.Multiply(ref matrix, ref viewProjectionMatrix, out worldViewProjection); Vector4.Transform(ref vector4UnitX, ref worldViewProjection, out drawInfo.UnitXWorld); Vector4.Transform(ref vector4UnitY, ref worldViewProjection, out drawInfo.UnitYWorld); // rotate origin and unit axis if need. var leftTopCorner = vector4LeftTop; if (imageOrientation == ImageOrientation.Rotated90) { var unitX = drawInfo.UnitXWorld; drawInfo.UnitXWorld = -drawInfo.UnitYWorld; drawInfo.UnitYWorld = unitX; leftTopCorner = new Vector4(-0.5f, 0.5f, 0, 1); } Vector4.Transform(ref leftTopCorner, ref worldViewProjection, out drawInfo.LeftTopCornerWorld); var verticesPerElement = 4; var indicesPerElement = 6; if (drawInfo.Primitive == PrimitiveType.BorderRectangle) { verticesPerElement = 16; indicesPerElement = 54; } var elementInfo = new ElementInfo(verticesPerElement, indicesPerElement, ref drawInfo, depthBias); Draw(texture, texture1, ref elementInfo); }