Files
FlaxEngine/Source/Engine/UI/GUI/Brushes/TextureBrush.cs
Ari Vuollet 58445f04c4 Fix potential incorrect null checks in FlaxEngine.Objects
The null-conditional operator checks for reference equality of the
Object, but doesn't check the validity of the unmanaged pointer. This
check is corrected in cases where the object was not immediately
returned from the bindings layer and may have been destroyed earlier.
2023-09-28 22:05:58 +03:00

135 lines
4.5 KiB
C#

// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
namespace FlaxEngine.GUI
{
/// <summary>
/// Implementation of <see cref="IBrush"/> for <see cref="FlaxEngine.Texture"/>.
/// </summary>
/// <seealso cref="IBrush" />
public sealed class TextureBrush : IBrush
{
/// <summary>
/// The texture.
/// </summary>
[ExpandGroups, EditorOrder(0), Tooltip("The texture asset.")]
public Texture Texture;
/// <summary>
/// The texture sampling filter mode.
/// </summary>
[ExpandGroups, EditorOrder(1), Tooltip("The texture sampling filter mode.")]
public BrushFilter Filter = BrushFilter.Linear;
/// <summary>
/// Initializes a new instance of the <see cref="TextureBrush"/> class.
/// </summary>
public TextureBrush()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="TextureBrush"/> struct.
/// </summary>
/// <param name="texture">The texture.</param>
public TextureBrush(Texture texture)
{
Texture = texture;
}
/// <inheritdoc />
public Float2 Size => Texture != null && !Texture.WaitForLoaded() ? Texture.Size : Float2.Zero;
/// <inheritdoc />
public void Draw(Rectangle rect, Color color)
{
if (Filter == BrushFilter.Point)
Render2D.DrawTexturePoint(Texture?.Texture, rect, color);
else
Render2D.DrawTexture(Texture, rect, color);
}
}
/// <summary>
/// Implementation of <see cref="IBrush"/> for <see cref="FlaxEngine.Texture"/> using 9-slicing.
/// </summary>
/// <seealso cref="IBrush" />
public sealed class Texture9SlicingBrush : IBrush
{
/// <summary>
/// The texture.
/// </summary>
[ExpandGroups, EditorOrder(0), Tooltip("The texture asset.")]
public Texture Texture;
/// <summary>
/// The texture sampling filter mode.
/// </summary>
[ExpandGroups, EditorOrder(1), Tooltip("The texture sampling filter mode.")]
public BrushFilter Filter = BrushFilter.Linear;
/// <summary>
/// The border size.
/// </summary>
[ExpandGroups, EditorOrder(2), Limit(0), Tooltip("The border size.")]
public float BorderSize = 10.0f;
/// <summary>
/// The texture borders (in texture space, range 0-1).
/// </summary>
[ExpandGroups, EditorOrder(3), Limit(0, 1), Tooltip("The texture borders (in texture space, range 0-1).")]
public Margin Border = new Margin(0.1f);
#if FLAX_EDITOR
/// <summary>
/// Displays borders (editor only).
/// </summary>
[NoSerialize, EditorOrder(4), Tooltip("Displays borders (editor only).")]
public bool ShowBorders;
#endif
/// <summary>
/// Initializes a new instance of the <see cref="Texture9SlicingBrush"/> class.
/// </summary>
public Texture9SlicingBrush()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="Texture9SlicingBrush"/> struct.
/// </summary>
/// <param name="texture">The texture.</param>
public Texture9SlicingBrush(Texture texture)
{
Texture = texture;
}
/// <inheritdoc />
public Float2 Size => Texture != null ? Texture.Size : Float2.Zero;
/// <inheritdoc />
public unsafe void Draw(Rectangle rect, Color color)
{
if (Texture == null)
return;
var border = Border;
var borderUV = *(Float4*)&border;
var borderSize = borderUV * new Float4(BorderSize, BorderSize, BorderSize, BorderSize);
if (Filter == BrushFilter.Point)
Render2D.Draw9SlicingTexturePoint(Texture, rect, borderSize, borderUV, color);
else
Render2D.Draw9SlicingTexture(Texture, rect, borderSize, borderUV, color);
#if FLAX_EDITOR
if (ShowBorders)
{
var bordersRect = rect;
bordersRect.Location.X += borderSize.X;
bordersRect.Location.Y += borderSize.Z;
bordersRect.Size.X -= borderSize.X + borderSize.Y;
bordersRect.Size.Y -= borderSize.Z + borderSize.W;
Render2D.DrawRectangle(bordersRect, Color.YellowGreen, 2.0f);
}
#endif
}
}
}