2025-01-03 13:42:53 +08:00

124 lines
4.3 KiB
C#

////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2007-2020 , Inc. All Rights Reserved.
//
////////////////////////////////////////////////////////////////////////////////
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
using GCSeries.Core.Extensions;
using GCSeries.Core.Sdk;
namespace GCSeries.Core
{
public sealed partial class ZCamera
{
////////////////////////////////////////////////////////////////////////
// MonoBehaviour Callbacks
////////////////////////////////////////////////////////////////////////
private void OnDrawGizmos()
{
// Compute the frustum corners for the positive, negative,
// and zero parallax zones.
this.GetFrustumCorners(
ZFrustum.UncoupledZoneDepth, this._positiveParallaxCorners);
this.GetFrustumCorners(
ZFrustum.CoupledZoneDepth, this._negativeParallaxCorners);
this.GetFrustumCorners(0, this._zeroParallaxCorners);
// Draw the positive, negative, and zero parallax zones.
Handles.matrix = this.transform.localToWorldMatrix.ToPoseMatrix();
Handles.color = PositiveParallaxColor;
this.DrawComfortZone(
this._positiveParallaxCorners, this._zeroParallaxCorners);
Handles.color = NegativeParallaxColor;
this.DrawComfortZone(
this._negativeParallaxCorners, this._zeroParallaxCorners);
Handles.color = ZeroParallaxColor;
this.DrawRectangle(this._zeroParallaxCorners);
}
private void OnDrawGizmosSelected()
{
// Draw the positive, negative, and zero parallax zone labels.
Handles.matrix = this.transform.localToWorldMatrix.ToPoseMatrix();
this.DrawLabel(this._positiveParallaxCorners, "Positive Parallax");
this.DrawLabel(this._negativeParallaxCorners, "Negative Parallax");
this.DrawLabel(this._zeroParallaxCorners, "Zero Parallax");
}
////////////////////////////////////////////////////////////////////////
// Private Methods
////////////////////////////////////////////////////////////////////////
private void GetFrustumCorners(float zOffset, Vector3[] corners)
{
float worldScale = this.WorldScale.z;
float screenDistance = this.ZeroParallaxPlane.GetDistanceToPoint(
this.transform.position);
this.Camera.CalculateFrustumCorners(
Viewport,
screenDistance + (zOffset * worldScale),
Camera.MonoOrStereoscopicEye.Mono,
corners);
}
private void DrawComfortZone(
Vector3[] startCorners, Vector3[] endCorners)
{
this.DrawRectangle(startCorners);
for (int i = 0; i < CornerCount; ++i)
{
Handles.DrawLine(startCorners[i], endCorners[i]);
}
}
private void DrawRectangle(Vector3[] corners)
{
Handles.DrawSolidRectangleWithOutline(
corners, Color.clear, Color.white);
}
private void DrawLabel(Vector3[] corners, string label)
{
// Draw label at the top-middle of the rectangle.
Handles.Label((corners[1] + corners[2]) / 2, label);
}
////////////////////////////////////////////////////////////////////////
// Private Members
////////////////////////////////////////////////////////////////////////
private static readonly Rect Viewport = new Rect(0, 0, 1, 1);
private static readonly Color NegativeParallaxColor =
new Color32(30, 144, 255, 255);
private static readonly Color PositiveParallaxColor =
new Color32(60, 179, 113, 255);
private static readonly Color ZeroParallaxColor =
new Color32(200, 125, 0, 255);
private const int CornerCount = 4;
private Vector3[] _positiveParallaxCorners = new Vector3[CornerCount];
private Vector3[] _negativeParallaxCorners = new Vector3[CornerCount];
private Vector3[] _zeroParallaxCorners = new Vector3[CornerCount];
}
}
#endif // UNITY_EDITOR