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

172 lines
5.3 KiB
C#

// Copyright (c) Supernova Technologies LLC
using Nova.Compat;
using Nova.InternalNamespace_0.InternalNamespace_2;
using Nova.InternalNamespace_0.InternalNamespace_10;
using Nova.InternalNamespace_0.InternalNamespace_5;
using System;
using System.Reflection;
using Unity.Collections.LowLevel.Unsafe;
using UnityEngine;
namespace Nova
{
/// <summary>
/// Configures the rendered sorting order of a <see cref="Nova.UIBlock"/> hierarchy.
/// </summary>
/// <seealso cref="UIBlock2D.ZIndex"/>
/// <seealso cref="TextBlock.ZIndex"/>
[DisallowMultipleComponent]
[ExecuteAlways]
[AddComponentMenu("Nova/Sort Group")]
[RequireComponent(typeof(UIBlock))]
[HelpURL("https://novaui.io/manual/RenderOrder.html")]
public sealed class SortGroup : MonoBehaviour
{
#region Public
/// <summary>
/// The sorting order of this <see cref="UIBlock"/> hierarchy. Hierarchies with a higher sorting order render on top of those with a lower sorting order.
/// </summary>
/// <remarks>
/// The default value for hierarchies <i>without</i> a <see cref="SortGroup"/> component is <c>0</c>.
/// </remarks>
/// <seealso cref="UIBlock2D.ZIndex"/>
/// <seealso cref="TextBlock.ZIndex"/>
/// <seealso cref="RenderQueue"/>
public int SortingOrder
{
get => info.SortingOrder;
set
{
if (info.SortingOrder == value)
{
return;
}
info.SortingOrder = value;
InternalMethod_301();
}
}
/// <summary>
/// The render queue value to set on all (transparent) materials used to render this <see cref="UIBlock"/> hierarchy.
/// </summary>
/// <remarks>
/// The default value for hierarchies <i>without</i> a <see cref="SortGroup"/> component is <c>3000</c>.
/// </remarks>
/// <seealso cref="UIBlock2D.ZIndex"/>
/// <seealso cref="TextBlock.ZIndex"/>
/// <seealso cref="SortingOrder"/>
public int RenderQueue
{
get => info.RenderQueue;
set
{
value = Mathf.Clamp(value, 0, InternalType_178.InternalField_474);
if (info.RenderQueue == value)
{
return;
}
info.RenderQueue = value;
InternalMethod_301();
}
}
/// <summary>
/// Whether or not the content in the sort group should render over geometry rendered in the
/// opaque render queue. This is useful for rendering in screen space.
/// </summary>
public bool RenderOverOpaqueGeometry
{
get => info.RenderOverOpaqueGeometry;
set
{
if (info.RenderOverOpaqueGeometry == value)
{
return;
}
info.RenderOverOpaqueGeometry = value;
InternalMethod_301();
}
}
/// <summary>
/// The <see cref="Nova.UIBlock"/> on <c>this.gameObject</c>.
/// </summary>
public UIBlock UIBlock
{
get
{
if (InternalField_3036 == null)
{
InternalField_3036 = GetComponent<UIBlock>();
}
return InternalField_3036;
}
}
#endregion
#region Internal
[NonSerialized]
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private UIBlock InternalField_3036 = null;
[SerializeField]
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private InternalType_40 info = InternalType_40.InternalField_137;
internal void InternalMethod_301()
{
if (!UIBlock.InternalProperty_25 || !enabled)
{
return;
}
InternalType_274.InternalProperty_190.InternalMethod_1262(UIBlock.InternalProperty_29, UnsafeUtility.As<InternalType_40, InternalNamespace_0.InternalType_101>(ref info));
}
private void InternalMethod_302(InternalType_131 InternalParameter_217)
{
if (InternalType_274.InternalProperty_190 == null)
{
return;
}
InternalType_274.InternalProperty_190.InternalMethod_1261(InternalParameter_217);
}
private void OnEnable()
{
UIBlock.InternalMethod_116();
InternalMethod_301();
}
private void OnDisable()
{
InternalMethod_302(UIBlock.InternalProperty_29);
if (NovaApplication.IsEditor)
{
InternalType_131 InternalVar_1 = UIBlock.InternalProperty_29;
NovaApplication.EditorDelayCall += () =>
{
if (this == null)
{
InternalMethod_302(InternalVar_1);
}
};
}
}
[Obfuscation]
private void OnDidApplyAnimationProperties()
{
InternalMethod_301();
}
#endregion
}
}