Files
barotrauma-localmods/Quick Interactions/CSharp/Client/CrabUI/Components/CUICanvas.cs

105 lines
2.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Barotrauma;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Graphics;
namespace QICrabUI
{
/// <summary>
/// Allows you to manipulate pixel data of its texture
/// </summary>
public class CUICanvas : CUIComponent, IDisposable
{
public Color[] Data;
public RenderTarget2D Texture;
/// <summary>
/// Size of the internal texture
/// Will automatically resize the texture and data array of set
/// </summary>
public virtual Point Size
{
get => new Point(Texture.Width, Texture.Height);
set
{
if (value.X == Texture?.Width && value.Y == Texture?.Height) return;
RenderTarget2D oldTexture = Texture;
Texture = new RenderTarget2D(GameMain.Instance.GraphicsDevice, value.X, value.Y);
Data = new Color[Texture.Width * Texture.Height];
BackgroundSprite = new CUISprite(Texture);
oldTexture?.Dispose();
}
}
public void Clear(Color? color = null)
{
Color cl = color ?? Color.Transparent;
for (int i = 0; i < Data.Length; i++)
{
Data[i] = cl;
}
SetData();
}
public Color GetPixel(int x, int y)
{
return Data[y * Texture.Width + x];
}
public void SetPixel(int x, int y, Color cl)
{
Data[y * Texture.Width + x] = cl;
}
/// <summary>
/// Call this method to transfer values from Data array into texture
/// </summary>
public void SetData()
{
Texture.SetData<Color>(Data);
}
/// <summary>
/// Uses renderFunc to render stuff directy onto Canvas.Texture
/// You can for example use GUI "Draw" methods with provided spriteBatch
/// </summary>
/// <param name="renderFunc"> Action<SpriteBatch> where you can draw whatever you want </param>
public void Render(Action<SpriteBatch> renderFunc)
{
GameMain.Instance.GraphicsDevice.SetRenderTarget(Texture);
//TODO save and restore scissor rect
spriteBatch.Begin(SpriteSortMode.Deferred, null, GUI.SamplerState, null, GameMain.ScissorTestEnable);
renderFunc(spriteBatch);
spriteBatch.End();
GameMain.Instance.GraphicsDevice.SetRenderTarget(null);
}
public SpriteBatch spriteBatch;
public CUICanvas(int x, int y) : base()
{
Size = new Point(x, y);
spriteBatch = new SpriteBatch(GameMain.Instance.GraphicsDevice);
}
public CUICanvas() : this(100, 100) { }
public override void CleanUp()
{
Texture?.Dispose();
}
}
}