118 lines
3.0 KiB
C#
118 lines
3.0 KiB
C#
using System.Runtime.InteropServices;
|
|
|
|
namespace Prism
|
|
{
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public struct Vec3
|
|
{
|
|
public static Vec3 Zero = new Vec3(0.0f, 0.0f, 0.0f);
|
|
|
|
public static Vec3 Forward = new Vec3(0.0f, 0.0f, -1.0f);
|
|
public static Vec3 Right = new Vec3(1.0f, 0.0f, 0.0f);
|
|
public static Vec3 Up = new Vec3(0.0f, 1.0f, 0.0f);
|
|
|
|
public float X;
|
|
public float Y;
|
|
public float Z;
|
|
|
|
public Vec3(float scalar)
|
|
{
|
|
X = Y = Z = scalar;
|
|
}
|
|
|
|
public Vec3(Vec2 vec) {
|
|
X = vec.X;
|
|
Y = vec.Y;
|
|
Z = 0.0f;
|
|
}
|
|
|
|
public Vec3(float x, float y, float z)
|
|
{
|
|
X = x;
|
|
Y = y;
|
|
Z = z;
|
|
}
|
|
|
|
public Vec3(Vec4 vec) {
|
|
X = vec.X;
|
|
Y = vec.Y;
|
|
Z = vec.Z;
|
|
}
|
|
|
|
public void Clamp(Vec3 min, Vec3 max)
|
|
{
|
|
X = Mathf.Clamp(X, min.X, max.X);
|
|
Y = Mathf.Clamp(Y, min.Y, max.Y);
|
|
Z = Mathf.Clamp(Z, min.Z, max.Z);
|
|
}
|
|
|
|
|
|
public Vec2 XY {
|
|
get { return new Vec2(X, Y); }
|
|
set { X = value.X; Y = value.Y; }
|
|
}
|
|
|
|
public Vec2 XZ
|
|
{
|
|
get { return new Vec2(X, Z); }
|
|
set { X = value.X; Z = value.Y; }
|
|
}
|
|
public Vec2 YZ
|
|
{
|
|
get { return new Vec2(Y, Z); }
|
|
set { Y = value.X; Z = value.Y; }
|
|
}
|
|
|
|
|
|
public static Vec3 operator *(Vec3 left, float scalar)
|
|
{
|
|
return new Vec3(left.X * scalar, left.Y * scalar, left.Z * scalar);
|
|
}
|
|
|
|
public static Vec3 operator *(float scalar, Vec3 right)
|
|
{
|
|
return new Vec3(scalar * right.X, scalar * right.Y, scalar * right.Z);
|
|
}
|
|
|
|
public static Vec3 operator +(Vec3 left, Vec3 right)
|
|
{
|
|
return new Vec3(left.X + right.X, left.Y + right.Y, left.Z + right.Z);
|
|
}
|
|
|
|
public static Vec3 operator -(Vec3 left, Vec3 right)
|
|
{
|
|
return new Vec3(left.X - right.X, left.Y - right.Y, left.Z - right.Z);
|
|
}
|
|
|
|
public static Vec3 operator /(Vec3 left, Vec3 right)
|
|
{
|
|
return new Vec3(left.X / right.X, left.Y / right.Y, left.Z / right.Z);
|
|
}
|
|
|
|
public static Vec3 operator /(Vec3 left, float scalar)
|
|
{
|
|
return new Vec3(left.X / scalar, left.Y / scalar, left.Z / scalar);
|
|
}
|
|
|
|
public static Vec3 operator-(Vec3 vector)
|
|
{
|
|
return new Vec3(-vector.X, -vector.Y, -vector.Z);
|
|
}
|
|
|
|
public static Vec3 Cos(Vec3 vector)
|
|
{
|
|
return new Vec3((float)Math.Cos(vector.X), (float)Math.Cos(vector.Y), (float)Math.Cos(vector.Z));
|
|
}
|
|
|
|
public static Vec3 Sin(Vec3 vector)
|
|
{
|
|
return new Vec3((float)Math.Sin(vector.X), (float)Math.Sin(vector.Y), (float)Math.Sin(vector.Z));
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return $"({X}, {Y}, {Z})";
|
|
}
|
|
|
|
}
|
|
} |