cvr-props/Assets/ABI.CCK/Scripts/CCK_GravityZoneGizmos.cs

820 lines
No EOL
42 KiB
C#
Executable file

using System;
using ABI.CCK.Components;
using UnityEditor;
using UnityEngine;
#if UNITY_EDITOR
namespace ABI.CCK.Components
{
public static class CCK_GravityZoneGizmos
{
static CCK_GravityZoneGizmos()
{
const string gizmoPrefKey = "ABI.CCK.GravityZoneGizmos";
_drawGizmos = EditorPrefs.GetBool(gizmoPrefKey+".DrawGizmos", true);
_gravityVisualAnimation = EditorPrefs.GetBool(gizmoPrefKey+".GravityVisualAnimation", true);
_opacityMultiplier = EditorPrefs.GetFloat(gizmoPrefKey+".OpacityMultiplier", 0.5f);
}
#region Gizmo Setting Properties
private static bool _drawGizmos;
public static bool DrawGizmos
{
get => _drawGizmos;
set
{
if (_drawGizmos == value) return;
_drawGizmos = value;
EditorPrefs.SetBool("ABI.CCK.GravityZoneGizmos.DrawGizmos", value);
}
}
private static bool _gravityVisualAnimation;
public static bool GravityVisualAnimation
{
get => _gravityVisualAnimation;
set
{
if (_gravityVisualAnimation == value) return;
_gravityVisualAnimation = value;
EditorPrefs.SetBool("ABI.CCK.GravityZoneGizmos.GravityVisualAnimation", value);
}
}
private static float _opacityMultiplier;
public static float OpacityMultiplier
{
get => _opacityMultiplier;
set
{
if (Math.Abs(_opacityMultiplier - value) < float.Epsilon) return;
_opacityMultiplier = value;
EditorPrefs.SetFloat("ABI.CCK.GravityZoneGizmos.OpacityMultiplier", value);
}
}
#endregion
private static Mesh Sphere
{
get {
if (_sphere == null)
{
_sphere = Resources.Load<Mesh>("CCKSphere");
}
return _sphere;
}
}
private static Mesh _sphere;
private static Mesh SphereWire
{
get {
if (_sphereWire == null)
{
_sphereWire = Resources.Load<Mesh>("CCKSphereWire");
}
return _sphereWire;
}
}
private static Mesh _sphereWire;
private static Mesh Cylinder
{
get {
if (_cylinder == null)
{
_cylinder = Resources.Load<Mesh>("CCKCylinder");
}
return _cylinder;
}
}
private static Mesh _cylinder;
private static Mesh CylinderWire
{
get {
if (_cylinderWire == null)
{
_cylinderWire = Resources.Load<Mesh>("CCKCylinderWire");
}
return _cylinderWire;
}
}
private static Mesh _cylinderWire;
private static Mesh Circle
{
get {
if (_circle == null)
{
_circle = Resources.Load<Mesh>("CCKCircle");
}
return _circle;
}
}
private static Mesh _circle;
private static Mesh CircleWire
{
get {
if (_circleWire == null)
{
_circleWire = Resources.Load<Mesh>("CCKCircleWire");
}
return _circleWire;
}
}
private static Mesh _circleWire;
private static Mesh Quad
{
get {
if (_quad == null)
{
_quad = Resources.Load<Mesh>("CCKQuad");
}
return _quad;
}
}
private static Mesh _quad;
private static Mesh QuadWire
{
get {
if (_quadWire == null)
{
_quadWire = Resources.Load<Mesh>("CCKQuadWire");
}
return _quadWire;
}
}
private static Mesh _quadWire;
private static Color _color;
private static float _opacity = 0.75f;
public static void DrawGizmo(GravityZone zone, bool isSelected = false)
{
if (!DrawGizmos) return;
Gizmos.matrix = Matrix4x4.TRS(zone.transform.position, zone.transform.rotation, zone.transform.lossyScale);
_opacity = isSelected ? 0.75f : 0.25f;
Gizmos.color = _color = new Color(128, 0, 128, _opacity);
switch (zone.zoneShape)
{
case GravityZone.ZoneShape.Box:
Gizmos.DrawWireCube(zone.center, zone.size);
if (!GravityVisualAnimation) break;
if (zone.gravityDirection == GravityZone.GravityDirection.DirectionX && zone.strength > 0f)
RenderBoxGravityDirection(zone.center, Vector3.left, zone.size);
if (zone.gravityDirection == GravityZone.GravityDirection.DirectionX && zone.strength < 0f)
RenderBoxGravityDirection(zone.center, Vector3.right, zone.size);
if (zone.gravityDirection == GravityZone.GravityDirection.DirectionY && zone.strength > 0f)
RenderBoxGravityDirection(zone.center, Vector3.down, zone.size);
if (zone.gravityDirection == GravityZone.GravityDirection.DirectionY && zone.strength < 0f)
RenderBoxGravityDirection(zone.center, Vector3.up, zone.size);
if (zone.gravityDirection == GravityZone.GravityDirection.DirectionZ && zone.strength > 0f)
RenderBoxGravityDirection(zone.center, Vector3.back, zone.size);
if (zone.gravityDirection == GravityZone.GravityDirection.DirectionZ && zone.strength < 0f)
RenderBoxGravityDirection(zone.center, Vector3.forward, zone.size);
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength > 0f)
RenderBoxGravityInward(zone.center, zone.size, 1f);
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength < 0f)
RenderBoxGravityInward(zone.center, zone.size, -1f);
break;
case GravityZone.ZoneShape.Sphere:
Gizmos.DrawWireSphere(zone.center, zone.size.x);
if (!GravityVisualAnimation) break;
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength > 0f)
RenderSphereGravityInward(zone.center, zone.size.x, 1f);
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength < 0f)
RenderSphereGravityInward(zone.center, zone.size.x, -1f);
break;
case GravityZone.ZoneShape.Capsule:
RenderCapsule(zone.center, zone.size.x, zone.size.y - 2 * zone.size.x, true);
if (!GravityVisualAnimation) break;
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength > 0f)
RenderCapsuleGravityInward(zone.center, zone.size.x, zone.size.y - 2 * zone.size.x, 1f);
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength < 0f)
RenderCapsuleGravityInward(zone.center, zone.size.x, zone.size.y - 2 * zone.size.x, -1f);
break;
case GravityZone.ZoneShape.Cylinder:
RenderCylinder(zone.center, zone.size.x, zone.size.y, true);
if (!GravityVisualAnimation) break;
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength > 0f)
RenderCylinderGravityInward(zone.center, zone.size.x, zone.size.y, 1f);
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength < 0f)
RenderCylinderGravityInward(zone.center, zone.size.x, zone.size.y, -1f);
break;
case GravityZone.ZoneShape.HalfSphere:
RenderHalfSphere(zone.center, zone.size.x, true);
if (!GravityVisualAnimation) break;
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength > 0f)
RenderHalfSphereGravityInward(zone.center, zone.size.x, 1f);
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength < 0f)
RenderHalfSphereGravityInward(zone.center, zone.size.x, -1f);
break;
case GravityZone.ZoneShape.QuarterSphere:
RenderQuarterSphere(zone.center, zone.size.x, true);
if (!GravityVisualAnimation) break;
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength > 0f)
RenderQuarterSphereGravityInward(zone.center, zone.size.x, 1f);
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength < 0f)
RenderQuarterSphereGravityInward(zone.center, zone.size.x, -1f);
break;
case GravityZone.ZoneShape.HalfCapsule:
RenderHalfCapsule(zone.center, zone.size.x, zone.size.y - 2 * zone.size.x, true);
if (!GravityVisualAnimation) break;
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength > 0f)
RenderHalfCapsuleGravityInward(zone.center, zone.size.x, zone.size.y - 2 * zone.size.x, 1f);
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength < 0f)
RenderHalfCapsuleGravityInward(zone.center, zone.size.x, zone.size.y - 2 * zone.size.x, -1f);
break;
case GravityZone.ZoneShape.QuarterCapsule:
RenderQuarterCapsule(zone.center, zone.size.x, zone.size.y - 2 * zone.size.x, true);
if (!GravityVisualAnimation) break;
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength > 0f)
RenderQuarterCapsuleGravityInward(zone.center, zone.size.x, zone.size.y - 2 * zone.size.x, 1f);
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength < 0f)
RenderQuarterCapsuleGravityInward(zone.center, zone.size.x, zone.size.y - 2 * zone.size.x, -1f);
break;
case GravityZone.ZoneShape.HalfCylinder:
RenderHalfCylinder(zone.center, zone.size.x, zone.size.y, true);
if (!GravityVisualAnimation) break;
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength > 0f)
RenderHalfCylinderGravityInward(zone.center, zone.size.x, zone.size.y, 1f);
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength < 0f)
RenderHalfCylinderGravityInward(zone.center, zone.size.x, zone.size.y, -1f);
break;
case GravityZone.ZoneShape.QuarterCylinder:
RenderQuarterCylinder(zone.center, zone.size.x, zone.size.y, true);
if (!GravityVisualAnimation) break;
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength > 0f)
RenderQuarterCylinderGravityInward(zone.center, zone.size.x, zone.size.y, 1f);
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength < 0f)
RenderQuarterCylinderGravityInward(zone.center, zone.size.x, zone.size.y, -1f);
break;
case GravityZone.ZoneShape.Custom:
if (zone.customZoneShapeMesh == null) return;
DrawMesh(zone.customZoneShapeMesh, Vector3.zero, Quaternion.identity, Vector3.one, true);
if (!GravityVisualAnimation) break;
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength > 0f)
RenderCustomGravityInward(zone.customZoneShapeMesh, 1f);
if (zone.gravityDirection == GravityZone.GravityDirection.TowardsCenter && zone.strength < 0f)
RenderCustomGravityInward(zone.customZoneShapeMesh, -1f);
break;
}
}
private static void RenderBoxGravityDirection(Vector3 center, Vector3 direction, Vector3 size)
{
float anim = (float)(EditorApplication.timeSinceStartup % 5f);
float min = 0f;
float max = 0f;
float width = 0f;
if (direction == Vector3.down || direction == Vector3.up)
{
width = size.y;
size.y = 0f;
}
if (direction == Vector3.left || direction == Vector3.right)
{
width = size.x;
size.x = 0f;
}
if (direction == Vector3.forward || direction == Vector3.back)
{
width = size.z;
size.z = 0f;
}
if (direction.x + direction.y + direction.z > 0f)
{
min = 0f;
max = 1f;
}
else
{
min = 1f;
max = 0f;
}
UpdateColor(remapAnim(anim, max, min, 0f) * _opacity);
Gizmos.DrawCube(center + direction * (0.5f * remapAnim(anim, -width, width)), size);
UpdateColor(remapAnim(anim, max, min, 1f) * _opacity);
Gizmos.DrawCube(center + direction * (0.5f * remapAnim(anim, -width, width, 1f)), size);
UpdateColor(remapAnim(anim, max, min, 2f) * _opacity);
Gizmos.DrawCube(center + direction * (0.5f * remapAnim(anim, -width, width, 2f)), size);
UpdateColor(remapAnim(anim, max, min, 3f) * _opacity);
Gizmos.DrawCube(center + direction * (0.5f * remapAnim(anim, -width, width, 3f)), size);
}
private static void RenderBoxGravityInward(Vector3 center, Vector3 size, float direction)
{
float anim = (float)(EditorApplication.timeSinceStartup % 5f);
float min = 0f;
float max = 0f;
if (direction > 0f)
{
min = 1f;
max = 0f;
}
else
{
min = 0f;
max = 1f;
}
UpdateColor(remapAnim(anim, max, min, 0f) * _opacity);
Gizmos.DrawCube(center, size * remapAnim(anim, min, max));
UpdateColor(remapAnim(anim, max, min, 1f) * _opacity);
Gizmos.DrawCube(center, size * remapAnim(anim, min, max, 1f));
UpdateColor(remapAnim(anim, max, min, 2f) * _opacity);
Gizmos.DrawCube(center, size * remapAnim(anim, min, max, 2f));
UpdateColor(remapAnim(anim, max, min, 3f) * _opacity);
Gizmos.DrawCube(center, size * remapAnim(anim, min, max, 3f));
}
private static void RenderSphereGravityInward(Vector3 center, float size, float direction)
{
float anim = (float)(EditorApplication.timeSinceStartup % 5f);
float min = 0f;
float max = 0f;
if (direction > 0f)
{
min = 1f;
max = 0f;
}
else
{
min = 0f;
max = 1f;
}
UpdateColor(remapAnim(anim, max, min, 0f) * _opacity);
Gizmos.DrawSphere(center, size * remapAnim(anim, min, max));
UpdateColor(remapAnim(anim, max, min, 1f) * _opacity);
Gizmos.DrawSphere(center, size * remapAnim(anim, min, max, 1f));
UpdateColor(remapAnim(anim, max, min, 2f) * _opacity);
Gizmos.DrawSphere(center, size * remapAnim(anim, min, max, 2f));
UpdateColor(remapAnim(anim, max, min, 3f) * _opacity);
Gizmos.DrawSphere(center, size * remapAnim(anim, min, max, 3f));
}
private static void RenderCapsuleGravityInward(Vector3 center, float radius, float height, float direction)
{
float anim = (float)(EditorApplication.timeSinceStartup % 5f);
float min = 0f;
float max = 0f;
if (direction > 0f)
{
min = 1f;
max = 0f;
}
else
{
min = 0f;
max = 1f;
}
UpdateColor(remapAnim(anim, max, min, 0f) * _opacity);
RenderCapsule(center, radius * remapAnim(anim, min, max), height);
UpdateColor(remapAnim(anim, max, min, 1f) * _opacity);
RenderCapsule(center, radius * remapAnim(anim, min, max, 1f), height);
UpdateColor(remapAnim(anim, max, min, 2f) * _opacity);
RenderCapsule(center, radius * remapAnim(anim, min, max, 2f), height);
UpdateColor(remapAnim(anim, max, min, 3f) * _opacity);
RenderCapsule(center, radius * remapAnim(anim, min, max, 3f), height);
}
private static void RenderCylinderGravityInward(Vector3 center, float radius, float height, float direction)
{
float anim = (float)(EditorApplication.timeSinceStartup % 5f);
float min = 0f;
float max = 0f;
if (direction > 0f)
{
min = 1f;
max = 0f;
}
else
{
min = 0f;
max = 1f;
}
UpdateColor(remapAnim(anim, max, min, 0f) * _opacity);
RenderCylinder(center, radius * remapAnim(anim, min, max), height, false);
UpdateColor(remapAnim(anim, max, min, 1f) * _opacity);
RenderCylinder(center, radius * remapAnim(anim, min, max, 1f), height, false);
UpdateColor(remapAnim(anim, max, min, 2f) * _opacity);
RenderCylinder(center, radius * remapAnim(anim, min, max, 2f), height, false);
UpdateColor(remapAnim(anim, max, min, 3f) * _opacity);
RenderCylinder(center, radius * remapAnim(anim, min, max, 3f), height, false);
}
private static void RenderHalfSphereGravityInward(Vector3 center, float radius, float direction)
{
float anim = (float)(EditorApplication.timeSinceStartup % 5f);
float min = 0f;
float max = 0f;
if (direction > 0f)
{
min = 1f;
max = 0f;
}
else
{
min = 0f;
max = 1f;
}
UpdateColor(remapAnim(anim, max, min, 0f) * _opacity);
RenderHalfSphere(center, radius * remapAnim(anim, min, max), false);
UpdateColor(remapAnim(anim, max, min, 1f) * _opacity);
RenderHalfSphere(center, radius * remapAnim(anim, min, max, 1f), false);
UpdateColor(remapAnim(anim, max, min, 2f) * _opacity);
RenderHalfSphere(center, radius * remapAnim(anim, min, max, 2f), false);
UpdateColor(remapAnim(anim, max, min, 3f) * _opacity);
RenderHalfSphere(center, radius * remapAnim(anim, min, max, 3f), false);
}
private static void RenderQuarterSphereGravityInward(Vector3 center, float radius, float direction)
{
float anim = (float)(EditorApplication.timeSinceStartup % 5f);
float min = 0f;
float max = 0f;
if (direction > 0f)
{
min = 1f;
max = 0f;
}
else
{
min = 0f;
max = 1f;
}
UpdateColor(remapAnim(anim, max, min, 0f) * _opacity);
RenderQuarterSphere(center, radius * remapAnim(anim, min, max), false);
UpdateColor(remapAnim(anim, max, min, 1f) * _opacity);
RenderQuarterSphere(center, radius * remapAnim(anim, min, max, 1f), false);
UpdateColor(remapAnim(anim, max, min, 2f) * _opacity);
RenderQuarterSphere(center, radius * remapAnim(anim, min, max, 2f), false);
UpdateColor(remapAnim(anim, max, min, 3f) * _opacity);
RenderQuarterSphere(center, radius * remapAnim(anim, min, max, 3f), false);
}
private static void RenderHalfCapsuleGravityInward(Vector3 center, float radius, float height, float direction)
{
float anim = (float)(EditorApplication.timeSinceStartup % 5f);
float min = 0f;
float max = 0f;
if (direction > 0f)
{
min = 1f;
max = 0f;
}
else
{
min = 0f;
max = 1f;
}
UpdateColor(remapAnim(anim, max, min, 0f) * _opacity);
RenderHalfCapsule(center, radius * remapAnim(anim, min, max), height, false);
UpdateColor(remapAnim(anim, max, min, 1f) * _opacity);
RenderHalfCapsule(center, radius * remapAnim(anim, min, max, 1f), height, false);
UpdateColor(remapAnim(anim, max, min, 2f) * _opacity);
RenderHalfCapsule(center, radius * remapAnim(anim, min, max, 2f), height, false);
UpdateColor(remapAnim(anim, max, min, 3f) * _opacity);
RenderHalfCapsule(center, radius * remapAnim(anim, min, max, 3f), height, false);
}
private static void RenderQuarterCapsuleGravityInward(Vector3 center, float radius, float height, float direction)
{
float anim = (float)(EditorApplication.timeSinceStartup % 5f);
float min = 0f;
float max = 0f;
if (direction > 0f)
{
min = 1f;
max = 0f;
}
else
{
min = 0f;
max = 1f;
}
UpdateColor(remapAnim(anim, max, min, 0f) * _opacity);
RenderQuarterCapsule(center, radius * remapAnim(anim, min, max), height, false);
UpdateColor(remapAnim(anim, max, min, 1f) * _opacity);
RenderQuarterCapsule(center, radius * remapAnim(anim, min, max, 1f), height, false);
UpdateColor(remapAnim(anim, max, min, 2f) * _opacity);
RenderQuarterCapsule(center, radius * remapAnim(anim, min, max, 2f), height, false);
UpdateColor(remapAnim(anim, max, min, 3f) * _opacity);
RenderQuarterCapsule(center, radius * remapAnim(anim, min, max, 3f), height, false);
}
private static void RenderCapsule(Vector3 center, float radius, float height, bool isWire = false)
{
DrawMesh(isWire ? SphereWire : Sphere, center + Vector3.up * height * 0.5f, Quaternion.Euler(0f, 0f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? SphereWire : Sphere, center + Vector3.up * height * 0.5f, Quaternion.Euler(0f, 90f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? SphereWire : Sphere, center + Vector3.up * height * 0.5f, Quaternion.Euler(0f, 180f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? SphereWire : Sphere, center + Vector3.up * height * 0.5f, Quaternion.Euler(0f, 270f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CylinderWire : Cylinder, center - Vector3.up * height * 0.5f, Quaternion.Euler(0f, 0f, 0f), (Vector3.right + Vector3.forward) * radius + Vector3.up * height, isWire);
DrawMesh(isWire ? CylinderWire : Cylinder, center - Vector3.up * height * 0.5f, Quaternion.Euler(0f, 90f, 0f), (Vector3.right + Vector3.forward) * radius + Vector3.up * height, isWire);
DrawMesh(isWire ? CylinderWire : Cylinder, center - Vector3.up * height * 0.5f, Quaternion.Euler(0f, 180f, 0f), (Vector3.right + Vector3.forward) * radius + Vector3.up * height, isWire);
DrawMesh(isWire ? CylinderWire : Cylinder, center - Vector3.up * height * 0.5f, Quaternion.Euler(0f, 270f, 0f), (Vector3.right + Vector3.forward) * radius + Vector3.up * height, isWire);
DrawMesh(isWire ? SphereWire : Sphere, center - Vector3.up * height * 0.5f, Quaternion.Euler(180f, 0f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? SphereWire : Sphere, center - Vector3.up * height * 0.5f, Quaternion.Euler(180f, 90f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? SphereWire : Sphere, center - Vector3.up * height * 0.5f, Quaternion.Euler(180f, 180f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? SphereWire : Sphere, center - Vector3.up * height * 0.5f, Quaternion.Euler(180f, 270f, 0f), Vector3.one * radius, isWire);
}
private static void RenderCylinder(Vector3 center, float radius, float height, bool isWire = false, bool drawCaps = true)
{
DrawMesh(isWire ? CylinderWire : Cylinder, center - Vector3.up * height * 0.5f, Quaternion.Euler(0f, 0f, 0f), (Vector3.right + Vector3.forward) * radius + Vector3.up * height, isWire);
DrawMesh(isWire ? CylinderWire : Cylinder, center - Vector3.up * height * 0.5f, Quaternion.Euler(0f, 90f, 0f), (Vector3.right + Vector3.forward) * radius + Vector3.up * height, isWire);
DrawMesh(isWire ? CylinderWire : Cylinder, center - Vector3.up * height * 0.5f, Quaternion.Euler(0f, 180f, 0f), (Vector3.right + Vector3.forward) * radius + Vector3.up * height, isWire);
DrawMesh(isWire ? CylinderWire : Cylinder, center - Vector3.up * height * 0.5f, Quaternion.Euler(0f, 270f, 0f), (Vector3.right + Vector3.forward) * radius + Vector3.up * height, isWire);
if (!drawCaps) return;
DrawMesh(isWire ? CircleWire : Circle, center + Vector3.up * height * 0.5f, Quaternion.Euler(0f, 0f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center + Vector3.up * height * 0.5f, Quaternion.Euler(0f, 90f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center + Vector3.up * height * 0.5f, Quaternion.Euler(0f, 180f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center + Vector3.up * height * 0.5f, Quaternion.Euler(0f, 270f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center - Vector3.up * height * 0.5f, Quaternion.Euler(180f, 0f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center - Vector3.up * height * 0.5f, Quaternion.Euler(180f, 90f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center - Vector3.up * height * 0.5f, Quaternion.Euler(180f, 180f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center - Vector3.up * height * 0.5f, Quaternion.Euler(180f, 270f, 0f), Vector3.one * radius, isWire);
}
private static void RenderHalfSphere(Vector3 center, float radius, bool isWire = false, bool drawCap = true)
{
DrawMesh(isWire ? SphereWire : Sphere, center, Quaternion.Euler(0f, 0f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? SphereWire : Sphere, center, Quaternion.Euler(0f, 90f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? SphereWire : Sphere, center, Quaternion.Euler(0f, 180f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? SphereWire : Sphere, center, Quaternion.Euler(0f, 270f, 0f), Vector3.one * radius, isWire);
if (!drawCap) return;
DrawMesh(isWire ? CircleWire : Circle, center, Quaternion.Euler(180f, 0f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center, Quaternion.Euler(180f, 90f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center, Quaternion.Euler(180f, 180f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center, Quaternion.Euler(180f, 270f, 0f), Vector3.one * radius, isWire);
}
private static void RenderQuarterSphere(Vector3 center, float radius, bool isWire = false, bool drawCap = true)
{
DrawMesh(isWire ? SphereWire : Sphere, center, Quaternion.Euler(0f, 0f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? SphereWire : Sphere, center, Quaternion.Euler(0f, 90f, 0f), Vector3.one * radius, isWire);
if (!drawCap) return;
DrawMesh(isWire ? CircleWire : Circle, center, Quaternion.Euler( 0f, 90f, -90f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center, Quaternion.Euler(-90f, 90f, -90f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center, Quaternion.Euler( 0f, 270f, -180f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center, Quaternion.Euler( 0f, 0f, -180f), Vector3.one * radius, isWire);
}
private static void RenderHalfCapsule(Vector3 center, float radius, float height, bool isWire = false, bool drawCaps = true)
{
DrawMesh(isWire ? SphereWire : Sphere, center + Vector3.up * height * 0.5f, Quaternion.Euler(0f, 0f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? SphereWire : Sphere, center + Vector3.up * height * 0.5f, Quaternion.Euler(0f, 90f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CylinderWire : Cylinder, center - Vector3.up * height * 0.5f, Quaternion.Euler(0f, 0f, 0f), (Vector3.right + Vector3.forward) * radius + Vector3.up * height, isWire);
DrawMesh(isWire ? CylinderWire : Cylinder, center - Vector3.up * height * 0.5f, Quaternion.Euler(0f, 90f, 0f), (Vector3.right + Vector3.forward) * radius + Vector3.up * height, isWire);
DrawMesh(isWire ? SphereWire : Sphere, center - Vector3.up * height * 0.5f, Quaternion.Euler(180f, 90f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? SphereWire : Sphere, center - Vector3.up * height * 0.5f, Quaternion.Euler(180f, 180f, 0f), Vector3.one * radius, isWire);
if (!drawCaps) return;
DrawMesh(isWire ? CircleWire : Circle, center + Vector3.up * height * 0.5f, Quaternion.Euler(-90f, 0f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center + Vector3.up * height * 0.5f, Quaternion.Euler( 0f, 90f, -90f), Vector3.one * radius, isWire);
DrawMesh(isWire ? QuadWire : Quad, center - Vector3.up * height * 0.5f, Quaternion.Euler(-90f, 0f, 0f), (Vector3.right + Vector3.up) * radius + Vector3.forward * height, isWire);
DrawMesh(isWire ? QuadWire : Quad, center - Vector3.up * height * 0.5f, Quaternion.Euler( 0f, 90f, -90f), (Vector3.forward + Vector3.up) * radius + Vector3.right * height, isWire);
DrawMesh(isWire ? CircleWire : Circle, center - Vector3.up * height * 0.5f, Quaternion.Euler(90f, 0f, -180f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center - Vector3.up * height * 0.5f, Quaternion.Euler( 0f, -90f, 90f), Vector3.one * radius, isWire);
}
private static void RenderQuarterCapsule(Vector3 center, float radius, float height, bool isWire = false, bool drawCaps = true)
{
DrawMesh(isWire ? SphereWire : Sphere, center + Vector3.up * height * 0.5f, Quaternion.Euler(0f, 0f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CylinderWire : Cylinder, center - Vector3.up * height * 0.5f, Quaternion.Euler(0f, 0f, 0f), (Vector3.right + Vector3.forward) * radius + Vector3.up * height, isWire);
DrawMesh(isWire ? SphereWire : Sphere, center - Vector3.up * height * 0.5f, Quaternion.Euler(180f, 90f, 0f), Vector3.one * radius, isWire);
if (!drawCaps) return;
DrawMesh(isWire ? CircleWire : Circle, center + Vector3.up * height * 0.5f, Quaternion.Euler(-90f, 0f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center + Vector3.up * height * 0.5f, Quaternion.Euler(0f, 0f, -90f), Vector3.one * radius, isWire);
DrawMesh(isWire ? QuadWire : Quad, center - Vector3.up * height * 0.5f, Quaternion.Euler(-90f, 0f, 0f), (Vector3.right + Vector3.up) * radius + Vector3.forward * height, isWire);
DrawMesh(isWire ? QuadWire : Quad, center - Vector3.up * height * 0.5f, Quaternion.Euler(0f, 0f, -90f), (Vector3.forward + Vector3.up) * radius + Vector3.right * height, isWire);
DrawMesh(isWire ? CircleWire : Circle, center - Vector3.up * height * 0.5f, Quaternion.Euler( 0f, -90f, 90f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center - Vector3.up * height * 0.5f, Quaternion.Euler( 90f, 0f, -90f), Vector3.one * radius, isWire);
}
private static void RenderHalfCylinder (Vector3 center, float radius, float height, bool isWire = false, bool drawCaps = true)
{
DrawMesh(isWire ? CylinderWire : Cylinder, center - Vector3.up * height * 0.5f, Quaternion.Euler(0f, 0f, 0f), (Vector3.right + Vector3.forward) * radius + Vector3.up * height, isWire);
DrawMesh(isWire ? CylinderWire : Cylinder, center - Vector3.up * height * 0.5f, Quaternion.Euler(0f, 90f, 0f), (Vector3.right + Vector3.forward) * radius + Vector3.up * height, isWire);
if (!drawCaps) return;
DrawMesh(isWire ? CircleWire : Circle, center + Vector3.up * height * 0.5f, Quaternion.Euler(0f, 0f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center + Vector3.up * height * 0.5f, Quaternion.Euler(0f, 90f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? QuadWire : Quad, center - Vector3.up * height * 0.5f, Quaternion.Euler(-90f, 0f, 0f), (Vector3.right + Vector3.up) * radius + Vector3.forward * height, isWire);
DrawMesh(isWire ? QuadWire : Quad, center - Vector3.up * height * 0.5f, Quaternion.Euler( 0f, 90f, -90f), (Vector3.forward + Vector3.up) * radius + Vector3.right * height, isWire);
DrawMesh(isWire ? CircleWire : Circle, center - Vector3.up * height * 0.5f, Quaternion.Euler(180f, 90f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? CircleWire : Circle, center - Vector3.up * height * 0.5f, Quaternion.Euler(180f, 180f, 0f), Vector3.one * radius, isWire);
}
private static void RenderHalfCylinderGravityInward(Vector3 center, float radius, float height, float direction)
{
float anim = (float)(EditorApplication.timeSinceStartup % 5f);
float min = 0f;
float max = 0f;
if (direction > 0f)
{
min = 1f;
max = 0f;
}
else
{
min = 0f;
max = 1f;
}
UpdateColor(remapAnim(anim, max, min, 0f) * _opacity);
RenderHalfCylinder(center, radius * remapAnim(anim, min, max), height, false);
UpdateColor(remapAnim(anim, max, min, 1f) * _opacity);
RenderHalfCylinder(center, radius * remapAnim(anim, min, max, 1f), height, false);
UpdateColor(remapAnim(anim, max, min, 2f) * _opacity);
RenderHalfCylinder(center, radius * remapAnim(anim, min, max, 2f), height, false);
UpdateColor(remapAnim(anim, max, min, 3f) * _opacity);
RenderHalfCylinder(center, radius * remapAnim(anim, min, max, 3f), height, false);
}
private static void RenderQuarterCylinder (Vector3 center, float radius, float height, bool isWire = false, bool drawCaps = true)
{
DrawMesh(isWire ? CylinderWire : Cylinder, center - Vector3.up * height * 0.5f, Quaternion.Euler(0f, 0f, 0f), (Vector3.right + Vector3.forward) * radius + Vector3.up * height, isWire);
if (!drawCaps) return;
DrawMesh(isWire ? CircleWire : Circle, center + Vector3.up * height * 0.5f, Quaternion.Euler(0f, 0f, 0f), Vector3.one * radius, isWire);
DrawMesh(isWire ? QuadWire : Quad, center - Vector3.up * height * 0.5f, Quaternion.Euler(-90f, 0f, 0f), (Vector3.right + Vector3.up) * radius + Vector3.forward * height, isWire);
DrawMesh(isWire ? QuadWire : Quad, center - Vector3.up * height * 0.5f, Quaternion.Euler(0f, 0f, -90f), (Vector3.forward + Vector3.up) * radius + Vector3.right * height, isWire);
DrawMesh(isWire ? CircleWire : Circle, center - Vector3.up * height * 0.5f, Quaternion.Euler(180f, 90f, 0f), Vector3.one * radius, isWire);
}
private static void RenderQuarterCylinderGravityInward(Vector3 center, float radius, float height, float direction)
{
float anim = (float)(EditorApplication.timeSinceStartup % 5f);
float min = 0f;
float max = 0f;
if (direction > 0f)
{
min = 1f;
max = 0f;
}
else
{
min = 0f;
max = 1f;
}
UpdateColor(remapAnim(anim, max, min, 0f) * _opacity);
RenderQuarterCylinder(center, radius * remapAnim(anim, min, max), height, false);
UpdateColor(remapAnim(anim, max, min, 1f) * _opacity);
RenderQuarterCylinder(center, radius * remapAnim(anim, min, max, 1f), height, false);
UpdateColor(remapAnim(anim, max, min, 2f) * _opacity);
RenderQuarterCylinder(center, radius * remapAnim(anim, min, max, 2f), height, false);
UpdateColor(remapAnim(anim, max, min, 3f) * _opacity);
RenderQuarterCylinder(center, radius * remapAnim(anim, min, max, 3f), height, false);
}
private static void RenderCustomGravityInward(Mesh mesh, float direction)
{
float anim = (float)(EditorApplication.timeSinceStartup % 5f);
float min = 0f;
float max = 0f;
if (direction > 0f)
{
min = 1f;
max = 0f;
}
else
{
min = 0f;
max = 1f;
}
UpdateColor(remapAnim(anim, max, min, 0f) * _opacity);
DrawMesh(mesh, Vector3.zero, Quaternion.identity, Vector3.one * remapAnim(anim, min, max), false);
UpdateColor(remapAnim(anim, max, min, 1f) * _opacity);
DrawMesh(mesh, Vector3.zero, Quaternion.identity, Vector3.one * remapAnim(anim, min, max, 1f), false);
UpdateColor(remapAnim(anim, max, min, 2f) * _opacity);
DrawMesh(mesh, Vector3.zero, Quaternion.identity, Vector3.one * remapAnim(anim, min, max, 2f), false);
UpdateColor(remapAnim(anim, max, min, 3f) * _opacity);
DrawMesh(mesh, Vector3.zero, Quaternion.identity, Vector3.one * remapAnim(anim, min, max, 3f), false);
}
private static void DrawMesh(Mesh mesh, Vector3 position, Quaternion rotation, Vector3 scale, bool isWire = false)
{
if (isWire) Gizmos.DrawWireMesh(mesh, position, rotation, scale);
else Gizmos.DrawMesh(mesh, position, rotation, scale);
}
private static float remapAnim(float anim, float min, float max, float offset = 0)
{
anim = (anim + offset * 1.25f) % 5f;
anim = anim % 1.25f + 1.25f * offset;
return Mathf.Lerp(min, max, anim / 5f);
}
private static void UpdateColor(float alpha)
{
_color.a = alpha * OpacityMultiplier;
Gizmos.color = _color;
}
}
}
#endif