From d1fbcb95599f6b1de1263ec2a03521e7011d952f Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Thu, 3 Jun 2021 21:33:09 +0200 Subject: [PATCH] added a sprite batch extension to generate a gradient --- MLEM/Extensions/SpriteBatchExtensions.cs | 27 ++++++++++++++++++++++++ Sandbox/GameImpl.cs | 3 +++ 2 files changed, 30 insertions(+) diff --git a/MLEM/Extensions/SpriteBatchExtensions.cs b/MLEM/Extensions/SpriteBatchExtensions.cs index 2b3678a..bf6b67a 100644 --- a/MLEM/Extensions/SpriteBatchExtensions.cs +++ b/MLEM/Extensions/SpriteBatchExtensions.cs @@ -83,6 +83,33 @@ namespace MLEM.Extensions { return tex; } + /// + /// Generates a texture with the given size that contains a gradient between the four specified corner colors. + /// If the same color is specified for two pairs of corners, a horizontal, vertical or diagonal gradient can be achieved. + /// This texture is automatically disposed of when the batch is disposed. + /// + /// The sprite batch + /// The color of the texture's top left corner + /// The color of the texture's top right corner + /// The color of the texture's bottom left corner + /// The color of the texture's bottom right corner + /// The width of the resulting texture, or 256 by default + /// The height of the resulting texture, or 256 by default + /// A new texture with the given data + public static Texture2D GenerateGradientTexture(this SpriteBatch batch, Color topLeft, Color topRight, Color bottomLeft, Color bottomRight, int width = 256, int height = 256) { + var tex = new Texture2D(batch.GraphicsDevice, width, height); + using (var data = tex.GetTextureData()) { + for (var x = 0; x < width; x++) { + var top = Color.Lerp(topLeft, topRight, x / (float) width); + var btm = Color.Lerp(bottomLeft, bottomRight, x / (float) width); + for (var y = 0; y < height; y++) + data[x, y] = Color.Lerp(top, btm, y / (float) height); + } + } + AutoDispose(batch, tex); + return tex; + } + /// public static void Draw(this SpriteBatch batch, Texture2D texture, RectangleF destinationRectangle, Rectangle? sourceRectangle, Color color, float rotation, Vector2 origin, SpriteEffects effects, float layerDepth) { var source = sourceRectangle ?? new Rectangle(0, 0, texture.Width, texture.Height); diff --git a/Sandbox/GameImpl.cs b/Sandbox/GameImpl.cs index aa98ed3..6eea08a 100644 --- a/Sandbox/GameImpl.cs +++ b/Sandbox/GameImpl.cs @@ -128,6 +128,7 @@ namespace Sandbox { var res = this.Content.LoadJson("Test"); Console.WriteLine("The res is " + res); + var gradient = this.SpriteBatch.GenerateGradientTexture(Color.Green, Color.Red, Color.Blue, Color.Yellow); this.OnDraw += (game, time) => { this.SpriteBatch.Begin(); this.SpriteBatch.Draw(this.SpriteBatch.GetBlankTexture(), new Rectangle(640 - 4, 360 - 4, 8, 8), Color.Green); @@ -137,6 +138,8 @@ namespace Sandbox { font.DrawString(this.SpriteBatch, font.TruncateString("This is a very long string", 200, 1, ellipsis: "..."), new Vector2(200, 450), Color.White); font.DrawString(this.SpriteBatch, font.TruncateString("This is a very long string", 200, 1, true), new Vector2(200, 500), Color.White); font.DrawString(this.SpriteBatch, font.TruncateString("This is a very long string", 200, 1, true, "..."), new Vector2(200, 550), Color.White); + + this.SpriteBatch.Draw(gradient, new Rectangle(300, 100, 200, 200), Color.White); this.SpriteBatch.End(); };