105 lines
4.1 KiB
C#
105 lines
4.1 KiB
C#
|
using System;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace MPUIKIT {
|
||
|
/// <summary>
|
||
|
/// Hexagon shape with two opposite parallel equal sides. It is basically a rectangle where two
|
||
|
/// of it's sides are broken into halves and pulled out of the shape that creates two triangle tips
|
||
|
/// left and right of the shape.
|
||
|
/// </summary>
|
||
|
[Serializable]
|
||
|
public struct Hexagon: IMPUIComponent {
|
||
|
[SerializeField] private Vector4 m_CornerRadius;
|
||
|
[SerializeField] private bool m_UniformCornerRadius;
|
||
|
[SerializeField] private Vector2 m_TipSize;
|
||
|
[SerializeField] private bool m_UniformTipSize;
|
||
|
[SerializeField] private Vector2 m_TipRadius;
|
||
|
[SerializeField] private bool m_UniformTipRadius;
|
||
|
|
||
|
/// <summary>
|
||
|
/// Sizes of the two tips (the triangular part sticking out of the rectangular part of the shape)
|
||
|
/// <para>x => left tip, y => right tip</para>
|
||
|
/// </summary>
|
||
|
public Vector2 TipSize {
|
||
|
get => m_TipSize;
|
||
|
set {
|
||
|
m_TipSize = Vector2.Max(value, Vector2.one);
|
||
|
if (ShouldModifySharedMat) {
|
||
|
SharedMat.SetVector(SpHexagonTipSizes, m_TipSize);
|
||
|
}
|
||
|
OnComponentSettingsChanged?.Invoke(this, EventArgs.Empty);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Radius of the corner of the tips.
|
||
|
/// <para>x => left tip's corner, y => right tip's corner</para>
|
||
|
/// </summary>
|
||
|
public Vector2 TipRadius {
|
||
|
get => m_TipRadius;
|
||
|
set {
|
||
|
m_TipRadius = Vector2.Max(value, Vector2.one);
|
||
|
if (ShouldModifySharedMat) {
|
||
|
SharedMat.SetVector(SpHexagonTipRadius, m_TipRadius);
|
||
|
}
|
||
|
OnComponentSettingsChanged?.Invoke(this, EventArgs.Empty);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// <para>Radius of the four corners of the rectangular part of the shape.
|
||
|
/// Counter-Clockwise from bottom-left</para>
|
||
|
/// <para>x => bottom-left, y => bottom-right</para>
|
||
|
/// <para>z => top-right, w => top-left</para>
|
||
|
/// </summary>
|
||
|
public Vector4 CornerRadius {
|
||
|
get => m_CornerRadius;
|
||
|
set {
|
||
|
m_CornerRadius = Vector4.Max(value, Vector4.one);
|
||
|
if (ShouldModifySharedMat) {
|
||
|
SharedMat.SetVector(SpHexagonRectCornerRadius, m_CornerRadius);
|
||
|
}
|
||
|
OnComponentSettingsChanged?.Invoke(this, EventArgs.Empty);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static readonly int SpHexagonTipSizes = Shader.PropertyToID("_HexagonTipSize");
|
||
|
private static readonly int SpHexagonTipRadius = Shader.PropertyToID("_HexagonTipRadius");
|
||
|
private static readonly int SpHexagonRectCornerRadius = Shader.PropertyToID("_HexagonCornerRadius");
|
||
|
|
||
|
|
||
|
public Material SharedMat { get; set; }
|
||
|
public bool ShouldModifySharedMat { get; set; }
|
||
|
public RectTransform RectTransform { get; set; }
|
||
|
|
||
|
|
||
|
public void Init(Material sharedMat, Material renderMat, RectTransform rectTransform) {
|
||
|
SharedMat = sharedMat;
|
||
|
ShouldModifySharedMat = sharedMat == renderMat;
|
||
|
RectTransform = rectTransform;
|
||
|
|
||
|
TipRadius = m_TipRadius;
|
||
|
TipSize = m_TipSize;
|
||
|
}
|
||
|
|
||
|
public event EventHandler OnComponentSettingsChanged;
|
||
|
|
||
|
public void OnValidate() {
|
||
|
CornerRadius = m_CornerRadius;
|
||
|
TipSize = m_TipSize;
|
||
|
TipRadius = m_TipRadius;
|
||
|
}
|
||
|
|
||
|
public void InitValuesFromMaterial(ref Material material) {
|
||
|
m_CornerRadius = material.GetVector(SpHexagonRectCornerRadius);
|
||
|
m_TipRadius = material.GetVector(SpHexagonTipRadius);
|
||
|
m_TipSize = material.GetVector(SpHexagonTipSizes);
|
||
|
}
|
||
|
|
||
|
public void ModifyMaterial(ref Material material, params object[] otherProperties) {
|
||
|
material.SetVector(SpHexagonTipSizes, m_TipSize);
|
||
|
material.SetVector(SpHexagonTipRadius, m_TipRadius);
|
||
|
material.SetVector(SpHexagonRectCornerRadius, m_CornerRadius);
|
||
|
}
|
||
|
}
|
||
|
}
|