using System;␊ |
using System.Collections.Generic;␊ |
using Microsoft.Xna.Framework;␊ |
using Microsoft.Xna.Framework.Graphics;␊ |
␊ |
namespace Axios.Factories␊ |
{␊ |
public static class Prompt␊ |
{␊ |
// Copied from http://stackoverflow.com/a/17260476/195722␊ |
// Written by Blaze Phoenix␊ |
/// <summary>␊ |
/// Creates a rounded rectangle␊ |
/// </summary>␊ |
/// <param name="graphics"></param>␊ |
/// <param name="width"></param>␊ |
/// <param name="height"></param>␊ |
/// <param name="borderThickness"></param>␊ |
/// <param name="borderRadius"></param>␊ |
/// <param name="borderShadow"></param>␊ |
/// <param name="backgroundColors"></param>␊ |
/// <param name="borderColors"></param>␊ |
/// <param name="initialShadowIntensity"></param>␊ |
/// <param name="finalShadowIntensity"></param>␊ |
/// <returns></returns>␊ |
public static Texture2D CreateRoundedRectangleTexture(this GraphicsDevice graphics, int width, int height, int borderThickness, int borderRadius, int borderShadow, List<Color> backgroundColors, List<Color> borderColors, float initialShadowIntensity, float finalShadowIntensity)␊ |
{␊ |
if (backgroundColors == null || backgroundColors.Count == 0) throw new ArgumentException("Must define at least one background color (up to four).");␊ |
if (borderColors == null || borderColors.Count == 0) throw new ArgumentException("Must define at least one border color (up to three).");␊ |
if (borderRadius < 1) throw new ArgumentException("Must define a border radius (rounds off edges).");␊ |
if (borderThickness < 1) throw new ArgumentException("Must define border thikness.");␊ |
if (borderThickness + borderRadius > height / 2 || borderThickness + borderRadius > width / 2) throw new ArgumentException("Border will be too thick and/or rounded to fit on the texture.");␊ |
if (borderShadow > borderRadius) throw new ArgumentException("Border shadow must be lesser in magnitude than the border radius (suggeted: shadow <= 0.25 * radius).");␊ |
␊ |
Texture2D texture = new Texture2D(graphics, width, height, false, SurfaceFormat.Color);␊ |
Color[] color = new Color[width * height];␊ |
␊ |
for (int x = 0; x < texture.Width; x++)␊ |
{␊ |
for (int y = 0; y < texture.Height; y++)␊ |
{␊ |
switch (backgroundColors.Count)␊ |
{␊ |
case 4:␊ |
Color leftColor0 = Color.Lerp(backgroundColors[0], backgroundColors[1], ((float)y / (width - 1)));␊ |
Color rightColor0 = Color.Lerp(backgroundColors[2], backgroundColors[3], ((float)y / (height - 1)));␊ |
color[x + width * y] = Color.Lerp(leftColor0, rightColor0, ((float)x / (width - 1)));␊ |
break;␊ |
case 3:␊ |
Color leftColor1 = Color.Lerp(backgroundColors[0], backgroundColors[1], ((float)y / (width - 1)));␊ |
Color rightColor1 = Color.Lerp(backgroundColors[1], backgroundColors[2], ((float)y / (height - 1)));␊ |
color[x + width * y] = Color.Lerp(leftColor1, rightColor1, ((float)x / (width - 1)));␊ |
break;␊ |
case 2:␊ |
color[x + width * y] = Color.Lerp(backgroundColors[0], backgroundColors[1], ((float)x / (width - 1)));␊ |
break;␊ |
default:␊ |
color[x + width * y] = backgroundColors[0];␊ |
break;␊ |
}␊ |
␊ |
color[x + width * y] = ColorBorder(x, y, width, height, borderThickness, borderRadius, borderShadow, color[x + width * y], borderColors, initialShadowIntensity, finalShadowIntensity);␊ |
}␊ |
}␊ |
␊ |
texture.SetData<Color>(color);␊ |
return texture;␊ |
}␊ |
␊ |
private static Color ColorBorder(int x, int y, int width, int height, int borderThickness, int borderRadius, int borderShadow, Color initialColor, List<Color> borderColors, float initialShadowIntensity, float finalShadowIntensity)␊ |
{␊ |
Rectangle internalRectangle = new Rectangle((borderThickness + borderRadius), (borderThickness + borderRadius), width - 2 * (borderThickness + borderRadius), height - 2 * (borderThickness + borderRadius));␊ |
␊ |
if (internalRectangle.Contains(x, y)) return initialColor;␊ |
␊ |
Vector2 origin = Vector2.Zero;␊ |
Vector2 point = new Vector2(x, y);␊ |
␊ |
if (x < borderThickness + borderRadius)␊ |
{␊ |
if (y < borderRadius + borderThickness)␊ |
origin = new Vector2(borderRadius + borderThickness, borderRadius + borderThickness);␊ |
else if (y > height - (borderRadius + borderThickness))␊ |
origin = new Vector2(borderRadius + borderThickness, height - (borderRadius + borderThickness));␊ |
else␊ |
origin = new Vector2(borderRadius + borderThickness, y);␊ |
}␊ |
else if (x > width - (borderRadius + borderThickness))␊ |
{␊ |
if (y < borderRadius + borderThickness)␊ |
origin = new Vector2(width - (borderRadius + borderThickness), borderRadius + borderThickness);␊ |
else if (y > height - (borderRadius + borderThickness))␊ |
origin = new Vector2(width - (borderRadius + borderThickness), height - (borderRadius + borderThickness));␊ |
else␊ |
origin = new Vector2(width - (borderRadius + borderThickness), y);␊ |
}␊ |
else␊ |
{␊ |
if (y < borderRadius + borderThickness)␊ |
origin = new Vector2(x, borderRadius + borderThickness);␊ |
else if (y > height - (borderRadius + borderThickness))␊ |
origin = new Vector2(x, height - (borderRadius + borderThickness));␊ |
}␊ |
␊ |
if (!origin.Equals(Vector2.Zero))␊ |
{␊ |
float distance = Vector2.Distance(point, origin);␊ |
␊ |
if (distance > borderRadius + borderThickness + 1)␊ |
{␊ |
return Color.Transparent;␊ |
}␊ |
else if (distance > borderRadius + 1)␊ |
{␊ |
if (borderColors.Count > 2)␊ |
{␊ |
float modNum = distance - borderRadius;␊ |
␊ |
if (modNum < borderThickness / 2)␊ |
{␊ |
return Color.Lerp(borderColors[2], borderColors[1], (float)((modNum) / (borderThickness / 2.0)));␊ |
}␊ |
else␊ |
{␊ |
return Color.Lerp(borderColors[1], borderColors[0], (float)((modNum - (borderThickness / 2.0)) / (borderThickness / 2.0)));␊ |
}␊ |
}␊ |
␊ |
␊ |
if (borderColors.Count > 0)␊ |
return borderColors[0];␊ |
}␊ |
else if (distance > borderRadius - borderShadow + 1)␊ |
{␊ |
float mod = (distance - (borderRadius - borderShadow)) / borderShadow;␊ |
float shadowDiff = initialShadowIntensity - finalShadowIntensity;␊ |
return DarkenColor(initialColor, ((shadowDiff * mod) + finalShadowIntensity));␊ |
}␊ |
}␊ |
␊ |
return initialColor;␊ |
}␊ |
␊ |
private static Color DarkenColor(Color color, float shadowIntensity)␊ |
{␊ |
return Color.Lerp(color, Color.Black, shadowIntensity);␊ |
}␊ |
}␊ |
}␊ |