From 3ee671aed54d4648a4297f7b41efc34769fc168d Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Tue, 8 Apr 2025 22:26:07 +0800 Subject: [PATCH] add quaternion/normal validation --- Runtime/Gizmos/DebugX.base.cs | 4 ++-- Runtime/Gizmos/DebugX.other.cs.meta | 2 ++ Runtime/Gizmos/DebugX.primitives.cs | 4 ++-- Runtime/Gizmos/DebugX.raycasts.cs | 2 ++ Runtime/Utils/ValidationUtils.cs | 27 +++++++++++++++++++++++++++ Runtime/Utils/ValidationUtils.cs.meta | 2 ++ Samples/Scripts/DebugXSample_Other.cs | 2 +- 7 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 Runtime/Gizmos/DebugX.other.cs.meta create mode 100644 Runtime/Utils/ValidationUtils.cs create mode 100644 Runtime/Utils/ValidationUtils.cs.meta diff --git a/Runtime/Gizmos/DebugX.base.cs b/Runtime/Gizmos/DebugX.base.cs index 88615a3..f304299 100644 --- a/Runtime/Gizmos/DebugX.base.cs +++ b/Runtime/Gizmos/DebugX.base.cs @@ -92,7 +92,7 @@ namespace DCFApixels { Mesh = mesh; Position = position; - Rotation = rotation; + Rotation = rotation.CheckQuaternionOrDefault(); Size = size; } public IGizmoRenderer> RegisterNewRenderer() { return new Renderer(); } @@ -146,7 +146,7 @@ namespace DCFApixels public readonly Vector3 Size; public InstancingMeshGizmoLayout(Vector3 position, Quaternion rotation, Vector3 size) { - Rotation = rotation; + Rotation = rotation.CheckQuaternionOrDefault(); Position = position; Size = size; } diff --git a/Runtime/Gizmos/DebugX.other.cs.meta b/Runtime/Gizmos/DebugX.other.cs.meta new file mode 100644 index 0000000..fb0ff9e --- /dev/null +++ b/Runtime/Gizmos/DebugX.other.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c3f0e370bd83bef4a8955d9f9979ce01 \ No newline at end of file diff --git a/Runtime/Gizmos/DebugX.primitives.cs b/Runtime/Gizmos/DebugX.primitives.cs index 1c98d33..c389959 100644 --- a/Runtime/Gizmos/DebugX.primitives.cs +++ b/Runtime/Gizmos/DebugX.primitives.cs @@ -137,7 +137,7 @@ namespace DCFApixels public DrawHandler Circle(Vector3 position, Vector3 normal, float radius) where TMat : struct, IStaticMaterial { - return Mesh(position, Quaternion.LookRotation(normal), new Vector3(radius, radius, radius)); + return Mesh(position, Quaternion.LookRotation(normal.CheckNormalOrDefault()), new Vector3(radius, radius, radius)); } [IN(LINE)] public DrawHandler Circle(Vector3 position, Quaternion rotation, float radius) @@ -148,7 +148,7 @@ namespace DCFApixels [IN(LINE)] public DrawHandler Circle(Vector3 position, Vector3 normal, float radius) { - return Mesh(position, Quaternion.LookRotation(normal), new Vector3(radius, radius, radius)); + return Mesh(position, Quaternion.LookRotation(normal.CheckNormalOrDefault()), new Vector3(radius, radius, radius)); } [IN(LINE)] public DrawHandler Circle(Vector3 position, Quaternion rotation, float radius) diff --git a/Runtime/Gizmos/DebugX.raycasts.cs b/Runtime/Gizmos/DebugX.raycasts.cs index c2b474f..092da4b 100644 --- a/Runtime/Gizmos/DebugX.raycasts.cs +++ b/Runtime/Gizmos/DebugX.raycasts.cs @@ -11,6 +11,7 @@ namespace DCFApixels public readonly partial struct DrawHandler { #if DEBUGX_ENABLE_PHYSICS3D + #region RaycastHit [IN(LINE)] public DrawHandler RaycastHit(RaycastHit hit) @@ -130,6 +131,7 @@ namespace DCFApixels #endif #if DEBUGX_ENABLE_PHYSICS2D + #region RaycastHit2D [IN(LINE)] public DrawHandler RaycastHit(RaycastHit2D hit) diff --git a/Runtime/Utils/ValidationUtils.cs b/Runtime/Utils/ValidationUtils.cs new file mode 100644 index 0000000..b3886ad --- /dev/null +++ b/Runtime/Utils/ValidationUtils.cs @@ -0,0 +1,27 @@ +using UnityEngine; + +namespace DCFApixels.DebugXCore +{ + public static class ValidationUtils + { + public static Quaternion CheckQuaternionOrDefault(this Quaternion quaternion) + { + float sqrMagnitude = quaternion.x * quaternion.x + quaternion.y * quaternion.y + quaternion.z * quaternion.z + quaternion.w * quaternion.w; + if (float.IsNaN(sqrMagnitude) || (sqrMagnitude < float.Epsilon)) + { + return Quaternion.identity; + } + return quaternion; + } + + public static Vector3 CheckNormalOrDefault(this Vector3 normal) + { + float sqrMagnitude = normal.sqrMagnitude; + if (float.IsNaN(sqrMagnitude) || (sqrMagnitude < float.Epsilon)) + { + return Vector3.forward; + } + return normal; + } + } +} \ No newline at end of file diff --git a/Runtime/Utils/ValidationUtils.cs.meta b/Runtime/Utils/ValidationUtils.cs.meta new file mode 100644 index 0000000..d122893 --- /dev/null +++ b/Runtime/Utils/ValidationUtils.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: cfcf280d995044a46b559a8da9d2f25d \ No newline at end of file diff --git a/Samples/Scripts/DebugXSample_Other.cs b/Samples/Scripts/DebugXSample_Other.cs index 33ac9e0..0560698 100644 --- a/Samples/Scripts/DebugXSample_Other.cs +++ b/Samples/Scripts/DebugXSample_Other.cs @@ -26,7 +26,7 @@ namespace DCFApixels.DebugXCore.Samples int i = -1; const float RADIUS_M = 0.5f; - i++; DebugX.Draw(GetColor(Points[i])).Cross(Points[i].position, Points[i].localScale.x); + i++; DebugX.Draw(GetColor(Points[i])).BillboardCross(Points[i].position, Points[i].localScale.x); i++; DebugX.Draw(GetColor(Points[i])).BillboardCircle(Points[i].position, Points[i].localScale.x * RADIUS_M); i++; DebugX.Draw(GetColor(Points[i])).WireMesh(Points[i].position, Points[i].rotation, Points[i].localScale * RADIUS_M); i++; DebugX.Draw(GetColor(Points[i])).Text(Points[i].position, Points[i].name, DebugXTextSettings.WorldSpaceScale.SetSize(26).SetBackground(TextBackgroundColor));