152 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			152 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | using System; | |||
|  | using UnityEngine; | |||
|  | 
 | |||
|  | public static partial class SRMath | |||
|  | { | |||
|  |     /// <summary> | |||
|  |     /// Lerp from one value to another, without clamping t to 0-1. | |||
|  |     /// </summary> | |||
|  |     /// <param name="from"></param> | |||
|  |     /// <param name="to"></param> | |||
|  |     /// <param name="t"></param> | |||
|  |     /// <returns></returns> | |||
|  |     public static float LerpUnclamped(float from, float to, float t) | |||
|  |     { | |||
|  |         return (1.0f - t)*from + t*to; | |||
|  |     } | |||
|  | 
 | |||
|  |     /// <summary> | |||
|  |     /// Lerp from one vector to another, without clamping t | |||
|  |     /// </summary> | |||
|  |     /// <param name="from"></param> | |||
|  |     /// <param name="to"></param> | |||
|  |     /// <param name="t"></param> | |||
|  |     /// <returns></returns> | |||
|  |     public static Vector3 LerpUnclamped(Vector3 from, Vector3 to, float t) | |||
|  |     { | |||
|  |         return new Vector3( | |||
|  |             LerpUnclamped(from.x, to.x, t), | |||
|  |             LerpUnclamped(from.y, to.y, t), | |||
|  |             LerpUnclamped(from.z, to.z, t) | |||
|  |             ); | |||
|  |     } | |||
|  | 
 | |||
|  |     /// <summary> | |||
|  |     /// Value from 0.0f-1.0f, 0 when facing fully away and 1.0f when facing fully towards | |||
|  |     /// </summary> | |||
|  |     public static float FacingNormalized(Vector3 dir1, Vector3 dir2) | |||
|  |     { | |||
|  |         dir1.Normalize(); | |||
|  |         dir2.Normalize(); | |||
|  | 
 | |||
|  |         return Mathf.InverseLerp(-1, 1, Vector3.Dot(dir1, dir2)); | |||
|  |     } | |||
|  | 
 | |||
|  |     /// <summary> | |||
|  |     /// Reduces a given angle to a value between 180 and -180. | |||
|  |     /// </summary> | |||
|  |     /// <param name="angle">The angle to reduce, in radians.</param> | |||
|  |     /// <returns>The new angle, in radians.</returns> | |||
|  |     /// https://github.com/mono/MonoGame/blob/develop/MonoGame.Framework/MathHelper.cs | |||
|  |     public static float WrapAngle(float angle) | |||
|  |     { | |||
|  |         if (angle <= -180f) | |||
|  |         { | |||
|  |             angle += 360f; | |||
|  |         } | |||
|  |         else | |||
|  |         { | |||
|  |             if (angle > 180f) | |||
|  |             { | |||
|  |                 angle -= 360f; | |||
|  |             } | |||
|  |         } | |||
|  |         return angle; | |||
|  |     } | |||
|  | 
 | |||
|  |     /// <summary> | |||
|  |     /// Return the angle closest to 'to' | |||
|  |     /// </summary> | |||
|  |     /// <param name="to"></param> | |||
|  |     /// <param name="angle1"></param> | |||
|  |     /// <param name="angle2"></param> | |||
|  |     /// <returns></returns> | |||
|  |     public static float NearestAngle(float to, float angle1, float angle2) | |||
|  |     { | |||
|  |         if (Mathf.Abs(Mathf.DeltaAngle(to, angle1)) > Mathf.Abs(Mathf.DeltaAngle(to, angle2))) | |||
|  |         { | |||
|  |             return angle2; | |||
|  |         } | |||
|  |         return angle1; | |||
|  |     } | |||
|  | 
 | |||
|  |     /// <summary> | |||
|  |     /// Wrap value to 0-max (non-inclusive) | |||
|  |     /// </summary> | |||
|  |     /// <param name="max">Max value (non-inclusive)</param> | |||
|  |     /// <param name="value"></param> | |||
|  |     /// <returns>Value wrapped from 0-max</returns> | |||
|  |     public static int Wrap(int max, int value) | |||
|  |     { | |||
|  |         if (max < 0) | |||
|  |         { | |||
|  |             throw new ArgumentOutOfRangeException("max", "max must be greater than 0"); | |||
|  |         } | |||
|  | 
 | |||
|  |         while (value < 0) | |||
|  |         { | |||
|  |             value += max; | |||
|  |         } | |||
|  | 
 | |||
|  |         while (value >= max) | |||
|  |         { | |||
|  |             value -= max; | |||
|  |         } | |||
|  | 
 | |||
|  |         return value; | |||
|  |     } | |||
|  | 
 | |||
|  |     /// <summary> | |||
|  |     /// Wrap value to 0-max (non-inclusive) | |||
|  |     /// </summary> | |||
|  |     /// <param name="max">Max value (non-inclusive)</param> | |||
|  |     /// <param name="value"></param> | |||
|  |     /// <returns>Value wrapped from 0-max</returns> | |||
|  |     public static float Wrap(float max, float value) | |||
|  |     { | |||
|  |         while (value < 0) | |||
|  |         { | |||
|  |             value += max; | |||
|  |         } | |||
|  | 
 | |||
|  |         while (value >= max) | |||
|  |         { | |||
|  |             value -= max; | |||
|  |         } | |||
|  | 
 | |||
|  |         return value; | |||
|  |     } | |||
|  | 
 | |||
|  |     public static float Average(float v1, float v2) | |||
|  |     { | |||
|  |         return (v1 + v2)*0.5f; | |||
|  |     } | |||
|  | 
 | |||
|  |     /// <summary> | |||
|  |     /// Return an angle in range -180, 180 based on direction vector | |||
|  |     /// </summary> | |||
|  |     /// <param name="direction"></param> | |||
|  |     /// <returns></returns> | |||
|  |     public static float Angle(Vector2 direction) | |||
|  |     { | |||
|  |         var angle = Vector3.Angle(Vector3.up, direction); | |||
|  | 
 | |||
|  |         if (Vector3.Cross(direction, Vector3.up).z > 0f) | |||
|  |         { | |||
|  |             angle *= -1; | |||
|  |         } | |||
|  | 
 | |||
|  |         return angle; | |||
|  |     } | |||
|  | } |