149 lines
4.8 KiB
C#
149 lines
4.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Diagnostics;
|
|
|
|
using Barotrauma;
|
|
using Microsoft.Xna.Framework;
|
|
using Microsoft.Xna.Framework.Input;
|
|
using Microsoft.Xna.Framework.Graphics;
|
|
using System.IO;
|
|
|
|
namespace QICrabUI
|
|
{
|
|
public partial class CUI
|
|
{
|
|
public const float Pi2 = (float)(Math.PI / 2.0);
|
|
|
|
|
|
public static SamplerState NoSmoothing = new SamplerState()
|
|
{
|
|
Filter = TextureFilter.Point,
|
|
AddressU = TextureAddressMode.Clamp,
|
|
AddressV = TextureAddressMode.Clamp,
|
|
AddressW = TextureAddressMode.Clamp,
|
|
BorderColor = Color.White,
|
|
MaxAnisotropy = 4,
|
|
MaxMipLevel = 0,
|
|
MipMapLevelOfDetailBias = -0.8f,
|
|
ComparisonFunction = CompareFunction.Never,
|
|
FilterMode = TextureFilterMode.Default,
|
|
};
|
|
|
|
public static void DrawTexture(SpriteBatch sb, CUIRect cuirect, Color cl, Texture2D texture, float depth = 0.0f)
|
|
{
|
|
Rectangle sourceRect = new Rectangle(0, 0, (int)cuirect.Width, (int)cuirect.Height);
|
|
|
|
sb.Draw(texture, cuirect.Box, sourceRect, cl, 0.0f, Vector2.Zero, SpriteEffects.None, depth);
|
|
}
|
|
public static void DrawRectangle(SpriteBatch sb, CUIRect cuirect, Color cl, CUISprite sprite, float depth = 0.0f)
|
|
{
|
|
Rectangle sourceRect = sprite.DrawMode switch
|
|
{
|
|
CUISpriteDrawMode.Resize => sprite.SourceRect,
|
|
CUISpriteDrawMode.Wrap => new Rectangle(0, 0, (int)cuirect.Width, (int)cuirect.Height),
|
|
CUISpriteDrawMode.Static => cuirect.Box,
|
|
CUISpriteDrawMode.StaticDeep => cuirect.Zoom(0.9f),
|
|
_ => sprite.SourceRect,
|
|
};
|
|
|
|
Rectangle rect = new Rectangle(
|
|
(int)(cuirect.Left + sprite.Offset.X * cuirect.Width),
|
|
(int)(cuirect.Top + sprite.Offset.Y * cuirect.Height),
|
|
(int)(cuirect.Width),
|
|
(int)(cuirect.Height)
|
|
);
|
|
|
|
//rect = cuirect.Box;
|
|
|
|
sb.Draw(sprite.Texture, rect, sourceRect, cl, sprite.Rotation, sprite.Origin, sprite.Effects, depth);
|
|
}
|
|
|
|
//TODO i can calculate those rects in advance
|
|
public static void DrawBorders(SpriteBatch sb, CUIComponent component, float depth = 0.0f)
|
|
{
|
|
Texture2D texture = component.BorderSprite.Texture;
|
|
Rectangle sourceRect = texture.Bounds;
|
|
|
|
Rectangle targetRect;
|
|
Color cl;
|
|
float rotation = 0.0f;
|
|
float thickness = 1.0f;
|
|
bool visible = false;
|
|
|
|
// Right
|
|
visible = component.RigthBorder?.Visible ?? component.Border.Visible;
|
|
thickness = component.RigthBorder?.Thickness ?? component.Border.Thickness;
|
|
cl = component.RigthBorder?.Color ?? component.Border.Color;
|
|
targetRect = CUIRect.CreateRect(
|
|
component.Real.Left + component.Real.Width,
|
|
component.Real.Top,
|
|
component.Real.Height,
|
|
thickness
|
|
);
|
|
sourceRect = CUIRect.CreateRect(
|
|
0, 0,
|
|
targetRect.Width, texture.Height
|
|
);
|
|
rotation = Pi2;
|
|
sb.Draw(texture, targetRect, sourceRect, cl, rotation, Vector2.Zero, SpriteEffects.None, depth);
|
|
|
|
//Left
|
|
visible = component.LeftBorder?.Visible ?? component.Border.Visible;
|
|
thickness = component.LeftBorder?.Thickness ?? component.Border.Thickness;
|
|
cl = component.LeftBorder?.Color ?? component.Border.Color;
|
|
targetRect = CUIRect.CreateRect(
|
|
component.Real.Left + thickness,
|
|
component.Real.Top,
|
|
component.Real.Height,
|
|
thickness
|
|
);
|
|
sourceRect = CUIRect.CreateRect(
|
|
0, 0,
|
|
targetRect.Width, texture.Height
|
|
);
|
|
rotation = Pi2;
|
|
sb.Draw(texture, targetRect, sourceRect, cl, rotation, Vector2.Zero, SpriteEffects.FlipVertically, depth);
|
|
|
|
|
|
//Top
|
|
visible = component.TopBorder?.Visible ?? component.Border.Visible;
|
|
thickness = component.TopBorder?.Thickness ?? component.Border.Thickness;
|
|
cl = component.TopBorder?.Color ?? component.Border.Color;
|
|
targetRect = CUIRect.CreateRect(
|
|
component.Real.Left,
|
|
component.Real.Top,
|
|
component.Real.Width,
|
|
thickness
|
|
);
|
|
sourceRect = CUIRect.CreateRect(
|
|
0, 0,
|
|
targetRect.Width, texture.Height
|
|
);
|
|
rotation = 0.0f;
|
|
sb.Draw(texture, targetRect, sourceRect, cl, rotation, Vector2.Zero, SpriteEffects.None, depth);
|
|
|
|
|
|
|
|
//Bottom
|
|
visible = component.BottomBorder?.Visible ?? component.Border.Visible;
|
|
thickness = component.BottomBorder?.Thickness ?? component.Border.Thickness;
|
|
cl = component.BottomBorder?.Color ?? component.Border.Color;
|
|
targetRect = CUIRect.CreateRect(
|
|
component.Real.Left,
|
|
component.Real.Bottom - thickness,
|
|
component.Real.Width,
|
|
thickness
|
|
);
|
|
sourceRect = CUIRect.CreateRect(
|
|
0, 0,
|
|
targetRect.Width, texture.Height
|
|
);
|
|
rotation = 0;
|
|
sb.Draw(texture, targetRect, sourceRect, cl, rotation, Vector2.Zero, SpriteEffects.FlipVertically, depth);
|
|
|
|
|
|
}
|
|
}
|
|
} |