1
0
mirror of https://github.com/originalnicodr/CinematicUnityExplorer.git synced 2025-07-18 17:38:01 +08:00
Files
CinematicUnityExplorer/src/GizmosLibraryPlugin/TransformGizmos/LocalEulerAngleGizmo.cs
2024-06-23 17:17:30 -03:00

116 lines
3.5 KiB
C#

using UnityEngine;
using UnityExplorer.GizmoControls;
namespace UnityExplorer.TransformGizmos
{
internal class LocalEulerAngleGizmo : BaseTransformGizmo
{
CircleControl x = new();
CircleControl y = new();
CircleControl z = new();
float distanceForFullRevolution = 4f;
Vector3 initialLocalEulerRotation;
public override void SetScale(float scale)
{
base.SetScale(scale);
x.Scale = scale;
y.Scale = scale;
z.Scale = scale;
}
public override void Set(Transform transform)
{
base.Set(transform);
x.DistanceForFullRevolution = distanceForFullRevolution;
x.Color = Color.red;
x.SelectedColor = Color.Lerp(Color.red, Color.white, 0.8f);
x.Radius = 1f;
x.Transform = transform;
x.Normal = (t) =>
{
Vector3 localFowardAxis = t.forward;
Vector3 localUp = Vector3MathUtils.ReturnDirectionWithReferencial(t, Vector3.up);
Vector3 yRotationAxis = Vector3.Cross(localUp, localFowardAxis);
//if (yRotationAxis.ApproxEquals(Vector3.zero))
if (Math.Abs(yRotationAxis.x) < 0.0001 && Math.Abs(yRotationAxis.y) < 0.0001 && Math.Abs(yRotationAxis.z) < 0.0001)
{
yRotationAxis = t.right;
}
return yRotationAxis;
};
y.DistanceForFullRevolution = distanceForFullRevolution;
y.Color = Color.yellow;
y.SelectedColor = Color.Lerp(Color.yellow, Color.white, 0.8f);
y.Radius = 1f;
y.Transform = transform;
y.Normal = (t) =>
{
Vector3 localUp = Vector3MathUtils.ReturnDirectionWithReferencial(t, Vector3.up);
return localUp;
};
z.DistanceForFullRevolution = distanceForFullRevolution;
z.Color = Color.cyan;
z.SelectedColor = Color.Lerp(Color.cyan, Color.white, 0.8f);
z.Radius = 1f;
z.Transform = transform;
z.Normal = (t) =>
{
return t.forward;
};
}
public override bool CheckSelected(Ray ray, float maxDistanceToSelect)
{
x.MaxDistanceToSelect = maxDistanceToSelect;
y.MaxDistanceToSelect = maxDistanceToSelect;
z.MaxDistanceToSelect = maxDistanceToSelect;
x.IsSelected(ray);
y.IsSelected(ray);
z.IsSelected(ray);
initialLocalEulerRotation = transform.localEulerAngles;
return IsSelected();
}
public override bool IsSelected()
{
return x.Selected || y.Selected || z.Selected;
}
public override void OnRender()
{
x.Draw();
y.Draw();
z.Draw();
}
public override void OnSelected(Ray ray)
{
Vector3 aditionToAngle = Vector3.zero;
if (x.Selected)
aditionToAngle.x = x.GetValue(ray);
if (y.Selected)
aditionToAngle.y = y.GetValue(ray);
if (z.Selected)
aditionToAngle.z = z.GetValue(ray);
transform.localEulerAngles = initialLocalEulerRotation + aditionToAngle;
}
public override void Reset()
{
x.Reset();
y.Reset();
z.Reset();
}
}
}