///
/// This code is automatically generated by a T4 template.
/// Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
///
using System.Numerics;
using System.Runtime.CompilerServices;
namespace Misaki.HighPerformance.Mathematics.SPMD;
public static unsafe partial class MathV
{
# region Vector2
// Creation Functions
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Create(in TLane x, in TLane y)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = x,
y = y,
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 CreateVector2(in TLane value)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = value,
y = value,
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 LoadVector2(TNumber* pSrc)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
var width = TLane.LaneWidth;
var x = stackalloc TNumber[width];
var y = stackalloc TNumber[width];
for (var i = 0; i < width; i++)
{
x[i] = pSrc[i * 2 + 0];
y[i] = pSrc[i * 2 + 1];
}
return new Vector2
{
x = TLane.Load(x),
y = TLane.Load(y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 LoadVector2(ref TNumber src)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return LoadVector2((TNumber*)Unsafe.AsPointer(ref src));
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Load(TNumber* px, TNumber* py)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Load(px),
y = TLane.Load(py),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Load(ref TNumber x, ref TNumber y)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Load(ref x),
y = TLane.Load(ref y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 GatherVector2(TNumber* pData, TLane indices, int scale)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
var buffer = stackalloc TNumber[TLane.LaneWidth * 2];
for (var i = 0; i < TLane.LaneWidth; i++)
{
var scalarIdx = int.CreateTruncating(indices[i]);
buffer[0 * TLane.LaneWidth + i] = pData[scalarIdx + 0 * scale];
buffer[1 * TLane.LaneWidth + i] = pData[scalarIdx + 1 * scale];
}
return new Vector2
{
x = TLane.Load(buffer + 0 * TLane.LaneWidth),
y = TLane.Load(buffer + 1 * TLane.LaneWidth),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 GatherVector2(TNumber* pData, int* pIndices, int scale)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
var buffer = stackalloc TNumber[TLane.LaneWidth * 2];
for (var i = 0; i < TLane.LaneWidth; i++)
{
var scalarIdx = pIndices[i];
buffer[0 * TLane.LaneWidth + i] = pData[scalarIdx + 0 * scale];
buffer[1 * TLane.LaneWidth + i] = pData[scalarIdx + 1 * scale];
}
return new Vector2
{
x = TLane.Load(buffer + 0 * TLane.LaneWidth),
y = TLane.Load(buffer + 1 * TLane.LaneWidth),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 GatherVector2(ref TNumber baseAddress, TLane indices, int scale)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
var buffer = stackalloc TNumber[TLane.LaneWidth * 2];
for (var i = 0; i < TLane.LaneWidth; i++)
{
var scalarIdx = int.CreateTruncating(indices[i]);
buffer[0 * TLane.LaneWidth + i] = Unsafe.Add(ref baseAddress, scalarIdx + 0 * scale);
buffer[1 * TLane.LaneWidth + i] = Unsafe.Add(ref baseAddress, scalarIdx + 1 * scale);
}
return new Vector2
{
x = TLane.Load(buffer + 0 * TLane.LaneWidth),
y = TLane.Load(buffer + 1 * TLane.LaneWidth),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 GatherVector2(ref TNumber baseAddress, ref int baseIndex, int scale)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
var buffer = stackalloc TNumber[TLane.LaneWidth * 2];
for (var i = 0; i < TLane.LaneWidth; i++)
{
var scalarIdx = Unsafe.Add(ref baseIndex, i);
buffer[0 * TLane.LaneWidth + i] = Unsafe.Add(ref baseAddress, scalarIdx + 0 * scale);
buffer[1 * TLane.LaneWidth + i] = Unsafe.Add(ref baseAddress, scalarIdx + 1 * scale);
}
return new Vector2
{
x = TLane.Load(buffer + 0 * TLane.LaneWidth),
y = TLane.Load(buffer + 1 * TLane.LaneWidth),
};
}
// Math Functions
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Abs(in Vector2 vector)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Abs(vector.x),
y = TLane.Abs(vector.y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static TLane Dot(in Vector2 a, in Vector2 b)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return a.x * b.x + a.y * b.y;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Sqrt(in Vector2 vector)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Sqrt(vector.x),
y = TLane.Sqrt(vector.y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Rsqrt(in Vector2 vector)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Rsqrt(vector.x),
y = TLane.Rsqrt(vector.y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Normalize(in Vector2 vector)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return vector * TLane.Rsqrt(Dot(vector, vector));
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Reflect(in Vector2 incident, in Vector2 normal)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
var dot = Dot(incident, normal);
return incident - normal * (dot + dot);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Min(in Vector2 a, in Vector2 b)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Min(a.x, b.x),
y = TLane.Min(a.y, b.y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Max(in Vector2 a, in Vector2 b)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Max(a.x, b.x),
y = TLane.Max(a.y, b.y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Clamp(in Vector2 value, in Vector2 min, in Vector2 max)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return Min(Max(value, min), max);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Saturate(in Vector2 value)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return Clamp(value, CreateVector2(TLane.Zero), CreateVector2(TLane.One));
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Lerp(in Vector2 a, in Vector2 b, TLane t)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return a + (b - a) * t;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static TLane Length(in Vector2 vector)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return TLane.Sqrt(Dot(vector, vector));
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static TLane LengthSquared(in Vector2 vector)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return Dot(vector, vector);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static TLane Distance(in Vector2 a, in Vector2 b)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
var diff = b - a;
return TLane.Sqrt(Dot(diff, diff));
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static TLane DistanceSquared(in Vector2 a, in Vector2 b)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
var diff = b - a;
return Dot(diff, diff);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Step(in Vector2 edge, in Vector2 value)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return Select(value >= edge, Vector2.One, Vector2.Zero);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Smoothstep(Vector2 xMin, Vector2 xMax, Vector2 x)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
var t = Saturate((x - xMin) / (xMax - xMin));
var two = TLane.Create(TNumber.CreateTruncating(2));
var three = TLane.Create(TNumber.CreateTruncating(3));
return t * t * (CreateVector2(three) - (CreateVector2(two) * t));
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Select(TLane condition, in Vector2 a, in Vector2 b)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2
{
x = TLane.Select(condition, b.x, a.x),
y = TLane.Select(condition, b.y, a.y),
};
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector2 Select(Vector2 condition, in Vector2 a, in Vector2 b)
where TLane : ISPMDLane
where TNumber : unmanaged, INumber, IBinaryNumber, IMinMaxValue, IBitwiseOperators
{
return new Vector2