Files
2023-06-20 13:17:31 -05:00

168 lines
5.0 KiB
C#

using System;
using System.Runtime.InteropServices;
using UnityEngine;
namespace SmartPoint.Mathematics
{
public static class Vector3Ext
{
public static Vector3 FastClear(this ref Vector3 self)
{
return Vector3.zero;
}
public static Vector3 FastNegate(this ref Vector3 self)
{
return -self;
}
public static Vector3 FastReciprocal(this ref Vector3 self)
{
self.x = 1f / self.x;
self.y = 1f / self.y;
self.z = 1f / self.z;
return self;
}
public static Vector3 FastSet(this ref Vector3 self, float s)
{
return new Vector3(s, s, s);
}
public static Vector3 FastSet(this ref Vector3 self, float x, float y, float z)
{
return new Vector3(x, y, z);
}
public static Vector3 FastAdd(this ref Vector3 self, [In] ref Vector3 V)
{
return self + V;
}
public static Vector3 FastScale(this ref Vector3 self, float s)
{
return self * s;
}
public static Vector3 FastMul(this ref Vector3 self, [In] ref Vector3 V)
{
self.x *= V.x;
self.y *= V.y;
self.z *= V.z;
return self;
}
public static Vector3 FastScaleAdd(this ref Vector3 self, [In] ref Vector3 V, float s)
{
self.x += V.x * s;
self.y += V.y * s;
self.z += V.z * s;
return self;
}
public static Vector3 FastLerp(this ref Vector3 self, [In] ref Vector3 V, float s)
{
self.x += (V.x - self.x) * s;
self.y += (V.y - self.y) * s;
self.z += (V.z - self.z) * s;
return self;
}
public static float FastLengthSq(this ref Vector3 self)
{
return (self.x * self.x) + (self.y * self.y) + (self.z * self.z);
}
public static float FastDistanceSq(this ref Vector3 self, [In] ref Vector3 V)
{
var dx = self.x - V.x;
var dy = self.y - V.y;
var dz = self.z - V.z;
return dx * dx + dy * dy + dz * dz;
}
public static float FastLength(this ref Vector3 self)
{
return (float)Math.Sqrt((self.x * self.x) + (self.y * self.y) + (self.z * self.z));
}
public static float FastDot(this ref Vector3 self, [In] ref Vector3 V)
{
return (self.x * V.x) + (self.y * V.y) + (self.z * V.z);
}
public static Vector3 FastCross(this ref Vector3 self, [In] ref Vector3 V)
{
var x = (self.y * V.z) - (self.z * V.y);
var y = (self.z * V.x) - (V.z * self.x);
var z = (V.y * self.x) - (self.y * V.x);
self.x = x;
self.y = y;
self.z = z;
return self;
}
public static Vector3 FastCrossNormalize(this ref Vector3 self, [In] ref Vector3 V)
{
var x = (V.y * self.z) - (self.y * V.z);
var y = (self.z * V.x) - (self.x * V.z);
var z = (self.x * V.y) - (self.y * V.x);
float f = 1f / (float)Math.Sqrt((x * x) + (y * y) + (z * z));
self.x = x * f;
self.y = y * f;
self.z = z * f;
return self;
}
public static float FastNormalize(this ref Vector3 self)
{
float magnitudeSq = (self.x * self.x) + (self.y * self.y) + (self.z * self.z);
float magnitude = (float)Math.Sqrt(magnitudeSq);
if (magnitude >= 0.00001)
{
self.x /= magnitude;
self.y /= magnitude;
self.z /= magnitude;
}
else
{
self = Vector3.zero;
}
return magnitude;
}
public static Vector3 FastRotateX(this ref Vector3 self, float angle)
{
float cos = (float)Math.Cos(angle);
float sin = (float)Math.Sin(angle);
float newY = (self.y * cos) - (self.z * sin);
float newZ = (self.y * sin) + (self.z * cos);
self.y = newY;
self.z = newZ;
return self;
}
public static Vector3 FastRotateY(this ref Vector3 self, float angle)
{
float cos = (float)Math.Cos(angle);
float sin = (float)Math.Sin(angle);
float newX = (self.x * cos) + (self.z * sin);
float newZ = (self.z * cos) - (self.x * sin);
self.x = newX;
self.z = newZ;
return self;
}
public static Vector3 FastRotateZ(this ref Vector3 self, float angle)
{
float cos = (float)Math.Cos(angle);
float sin = (float)Math.Sin(angle);
float newX = (self.y * sin) + (self.x * cos);
float newY = (self.y * cos) - (self.x * sin);
self.x = newX;
self.y = newY;
return self;
}
}
}