Files
NovaFree/Scripts/Public/Components/ClipMask.cs
2025-08-02 20:11:41 +08:00

170 lines
5.5 KiB
C#

// Copyright (c) Supernova Technologies LLC
using Nova.Compat;
using Nova.InternalNamespace_0.InternalNamespace_2;
using Nova.InternalNamespace_0.InternalNamespace_10;
using System;
using System.Reflection;
using Unity.Collections.LowLevel.Unsafe;
using UnityEngine;
namespace Nova
{
/// <summary>
/// Clips the rendered bounds of a <see cref="UIBlock"/> hierarchy to a rounded-corner rectangle or custom texture.
/// Supports applying a color <see cref="Tint">tint</see> or fade to the <see cref="UIBlock"/> hierarchy as well.
/// </summary>
/// <remarks>
/// Clipping can be performed via a <see cref="ClipMask.Mask">mask</see> texture or using the rectangular bounds of the
/// <see cref="UIBlock"/> on this gameobject. If the attached <see cref="UIBlock"/> is a <see cref="UIBlock2D"/>, the <see cref="ClipMask"/>
/// defaults to clipping to the rounded-corner rectangle bounds matching the <see cref="UIBlock2D"/>'s <see cref="UIBlock2D.CornerRadius">Corner Radius</see>.
/// </remarks>
[AddComponentMenu("Nova/Clip Mask")]
[DisallowMultipleComponent]
[ExecuteAlways]
[HelpURL("https://novaui.io/manual/ClipMasks.html")]
[RequireComponent(typeof(UIBlock))]
public sealed class ClipMask : MonoBehaviour
{
#region Public
/// <summary>
/// The tint color applied to this <see cref="UIBlock"/> and its descendants.<br/>
/// The tint is applied multiplicatively: <c>finalRenderedColor *= Tint</c>.<br/>
/// Adjust <c>Tint.a</c> (alpha) to apply a fade. Set <c>Tint</c> to <c>Color.white</c> if no tint is desired.
/// </summary>
public Color Tint
{
get => info.Color;
set
{
if (info.Color == value)
{
return;
}
info.Color = value;
InternalMethod_299();
}
}
/// <summary>
/// Enables or disables clipping. Can be used to make the <see cref="ClipMask"/> exclusively apply a <see cref="Tint">Tint</see>.
/// </summary>
/// <seealso cref="Tint"/>
public bool Clip
{
get => info.Clip;
set
{
if (info.Clip == value)
{
return;
}
info.Clip = value;
InternalMethod_299();
}
}
/// <summary>
/// The texture to use as a mask when <c><see cref="Clip">Clip</see> == true</c>. Clip shape defaults to a rectangle or a rounded-corner rectangle,
/// depending on the <see cref="UIBlock"/> attached to <c>this.gameObject</c>, when <c>Mask == null</c>.
/// </summary>
/// <seealso cref="ClipMask"/>
public Texture Mask
{
get => maskTexture;
set
{
if (maskTexture == value)
{
return;
}
maskTexture = value;
InternalMethod_299();
}
}
/// <summary>
/// The <see cref="Nova.UIBlock"/> on <c>this.gameObject</c>.
/// </summary>
public UIBlock UIBlock
{
get
{
if (InternalField_3039 == null)
{
InternalField_3039 = GetComponent<UIBlock>();
}
return InternalField_3039;
}
}
#endregion
#region Internal
[NonSerialized]
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private UIBlock InternalField_3039 = null;
[SerializeField]
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private InternalType_37 info = InternalType_37.InternalField_132;
[SerializeField]
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private Texture maskTexture = null;
internal void InternalMethod_299()
{
if (!UIBlock.InternalProperty_25 || !enabled)
{
return;
}
info.InternalField_131 = maskTexture != null;
InternalType_274.InternalProperty_190.InternalField_874.InternalMethod_1498(UIBlock.InternalProperty_29, UnsafeUtility.As<InternalType_37, InternalNamespace_0.InternalType_109>(ref info), maskTexture);
}
private void InternalMethod_300(InternalType_131 InternalParameter_216)
{
if (InternalType_274.InternalProperty_190 == null)
{
return;
}
InternalType_274.InternalProperty_190.InternalField_874.InternalMethod_1499(InternalParameter_216);
}
private void OnEnable()
{
UIBlock.InternalMethod_116();
InternalMethod_299();
}
private void OnDisable()
{
InternalMethod_300(UIBlock.InternalProperty_29);
if (NovaApplication.IsEditor)
{
InternalType_131 InternalVar_1 = UIBlock.InternalProperty_29;
NovaApplication.EditorDelayCall += () =>
{
if (this == null)
{
InternalMethod_300(InternalVar_1);
}
};
}
}
[Obfuscation]
private void OnDidApplyAnimationProperties()
{
InternalMethod_299();
}
#endregion
}
}