loudixvmuniu/Assets/GCSeries/Core/Scripts/Utility/ZDisplayAligner.Gizmos.cs

150 lines
5.0 KiB
C#
Raw Normal View History

2025-04-01 16:16:45 +08:00
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2007-2020 , Inc. All Rights Reserved.
//
////////////////////////////////////////////////////////////////////////////////
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
namespace GCSeries.Core.Utility
{
public partial class ZDisplayAligner
{
////////////////////////////////////////////////////////////////////////
// MonoBehaviour Callbacks
////////////////////////////////////////////////////////////////////////
private void OnDrawGizmosSelected()
{
Handles.matrix = this.ComputePivotLocalToWorldMatrix();
// Draw the ground plane.
Handles.DrawSolidRectangleWithOutline(
GroundPlaneVertices, RectFaceColor, RectOutlineColor);
// Draw the pivot cross-hairs.
this.DrawPivotCrossHairs(RectOutlineColor);
// Draw the current display angle.
this.DrawAngle(this.Angle, ArcFaceColor, ArcOutlineColor);
// Draw the clamp region.
if (this.ClampAngle)
{
Color clampColor = (this.MinAngle <= this.MaxAngle) ?
Color.white : Color.red;
this.DrawAngleClamp(this.MinAngle, clampColor);
this.DrawAngleClamp(this.MaxAngle, clampColor);
}
}
////////////////////////////////////////////////////////////////////////
// Private Methods
////////////////////////////////////////////////////////////////////////
private void DrawPivotCrossHairs(Color color)
{
Vector3 windowSize = ZProvider.WindowSize;
Vector3 windowHalfSize = windowSize * 0.5f;
Gizmos.color = color;
Gizmos.matrix = this.transform.localToWorldMatrix;
// Draw horizontal line.
Gizmos.DrawLine(
new Vector3(-windowHalfSize.x, this._localPivot.y, 0),
new Vector3(windowHalfSize.x, this._localPivot.y, 0));
// Draw vertical line.
Gizmos.DrawLine(
new Vector3(this._localPivot.x, -windowHalfSize.y, 0),
new Vector3(this._localPivot.x, windowHalfSize.y, 0));
// Draw the window rectangle.
Gizmos.DrawWireCube(
Vector3.zero, new Vector3(windowSize.x, windowSize.y, 0));
}
private void DrawAngle(
float angle, Color faceColor, Color outlineColor)
{
Vector3 labelPosition = this.ComputePositionOnArc(angle * 0.5f);
Handles.Label(labelPosition * 1.25f, angle + "\u00B0");
// Draw face.
Handles.color = faceColor;
Handles.DrawSolidArc(
Vector3.zero, Vector3.left, Vector3.forward, angle, 1.0f);
// Draw outline.
Handles.color = outlineColor;
Handles.DrawLine(Vector3.zero, Vector3.forward);
Handles.DrawLine(Vector3.zero, this.ComputePositionOnArc(angle));
Handles.DrawWireArc(
Vector3.zero, Vector3.left, Vector3.forward, angle, 1.0f);
}
private void DrawAngleClamp(float angle, Color color)
{
Vector3 position = this.ComputePositionOnArc(angle);
Handles.color = color;
Handles.DrawLine(Vector3.zero, position);
Handles.SphereHandleCap(
0, position, Quaternion.identity, 0.05f, EventType.Repaint);
}
private Vector3 ComputePositionOnArc(float angle)
{
return Quaternion.Euler(-angle, 0, 0) * Vector3.forward;
}
private Matrix4x4 ComputePivotLocalToWorldMatrix()
{
Vector4 position =
this.transform.position +
(this.transform.rotation *
(this._localPivot * this.transform.lossyScale.y));
Quaternion rotation =
this.transform.parent?.rotation ?? Quaternion.identity;
Vector3 scale =
Vector3.one * HandleUtility.GetHandleSize(position) * 0.5f;
return Matrix4x4.TRS(position, rotation, scale);
}
////////////////////////////////////////////////////////////////////////
// Private Static Members
////////////////////////////////////////////////////////////////////////
private static readonly Color RectFaceColor =
new Color32(255, 255, 255, 25);
private static readonly Color RectOutlineColor =
new Color32(255, 255, 255, 155);
private static readonly Color ArcFaceColor =
new Color32(0, 191, 255, 25);
private static readonly Color ArcOutlineColor =
new Color32(0, 191, 255, 155);
private static readonly Vector3[] GroundPlaneVertices =
new Vector3[]
{
new Vector3(1, 0, 1),
new Vector3(1, 0, -1),
new Vector3(-1, 0, -1),
new Vector3(-1, 0, 1),
};
}
}
#endif // UNITY_EDITOR