using System; using System.Runtime.CompilerServices; using Svelto.ECS.Components; public static partial class ExtensionMethods { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float SqrMagnitude(in this ECSVector2 a) { return a.x * a.x + a.y * a.y; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float SqrMagnitude(in this ECSVector3 a) { return a.x * a.x + a.y * a.y + a.z * a.z; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float Magnitude(in this ECSVector2 a) { return (float) Math.Sqrt(a.SqrMagnitude()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float Magnitude(in this ECSVector3 a) { return (float) Math.Sqrt(a.SqrMagnitude()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Add(ref this ECSVector3 vector1, in ECSVector3 vector2) { vector1.x += vector2.x; vector1.y += vector2.y; vector1.z += vector2.z; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Add(ref this ECSVector3 vector1, float x, float y, float z) { vector1.x += x; vector1.y += y; vector1.z += z; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Set(ref this ECSVector3 vector1, float x, float y, float z) { vector1.x = x; vector1.y = y; vector1.z = z; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Zero(ref this ECSVector3 vector1) { vector1.x = 0; vector1.y = 0; vector1.z = 0; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Set(ref this ECSQuaternion quaternion, float x, float y, float z, float w) { quaternion.x = x; quaternion.y = y; quaternion.z = z; quaternion.w = w; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Interpolate(ref this ECSVector3 vector, in ECSVector3 vectorS, in ECSVector3 vectorE, float time) { vector.x = vectorS.x * (1 - time) + vectorE.x * time; vector.y = vectorS.y * (1 - time) + vectorE.y * time; vector.z = vectorS.z * (1 - time) + vectorE.z * time; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float Dot(ref this ECSVector3 vector1, in ECSVector3 vector2) { return vector1.x * vector2.x + vector1.y * vector2.y + vector1.z * vector2.z; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ECSVector3 Cross(ref this ECSVector3 lhs, in ECSVector3 rhs) { return new ECSVector3(lhs.y * rhs.z - lhs.z * rhs.y, lhs.z * rhs.x - lhs.x * rhs.z, lhs.x * rhs.y - lhs.y * rhs.x); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ECSVector3 Mul(in this ECSQuaternion rotation, in ECSVector3 point) { float x = rotation.x * 2F; float y = rotation.y * 2F; float z = rotation.z * 2F; float xx = rotation.x * x; float yy = rotation.y * y; float zz = rotation.z * z; float xy = rotation.x * y; float xz = rotation.x * z; float yz = rotation.y * z; float wx = rotation.w * x; float wy = rotation.w * y; float wz = rotation.w * z; return new ECSVector3((1F - (yy + zz)) * point.x + (xy - wz) * point.y + (xz + wy) * point.z, (xy + wz) * point.x + (1F - (xx + zz)) * point.y + (yz - wx) * point.z, (xz - wy) * point.x + (yz + wx) * point.y + (1F - (xx + yy)) * point.z); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Swap(ref this ECSVector3 vector, ref ECSVector3 vectorS) { float x = vector.x; float y = vector.y; float z = vector.z; vector.x = vectorS.x; vector.y = vectorS.y; vector.z = vectorS.z; vectorS.x = x; vectorS.y = y; vectorS.z = z; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Sub(ref this ECSVector3 vector1, in ECSVector3 vector2) { vector1.x -= vector2.x; vector1.y -= vector2.y; vector1.z -= vector2.z; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ref ECSVector3 Mul(ref this ECSVector3 vector1, float value) { vector1.x *= value; vector1.y *= value; vector1.z *= value; return ref vector1; } }