123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- package linalg
- /*
- These procedures are to allow for swizzling with non-compile (runtime) known components
- */
- Scalar_Components :: enum u8 {
- x = 0,
- r = 0,
- }
- Vector2_Components :: enum u8 {
- x = 0,
- y = 1,
- r = 0,
- g = 1,
- }
- Vector3_Components :: enum u8 {
- x = 0,
- y = 1,
- z = 2,
- r = 0,
- g = 1,
- b = 2,
- }
- Vector4_Components :: enum u8 {
- x = 0,
- y = 1,
- z = 2,
- w = 3,
- r = 0,
- g = 1,
- b = 2,
- a = 3,
- }
- scalar_f32_swizzle1 :: proc(f: f32, c0: Scalar_Components) -> f32 {
- return f
- }
- scalar_f32_swizzle2 :: proc(f: f32, c0, c1: Scalar_Components) -> Vector2f32 {
- return {f, f}
- }
- scalar_f32_swizzle3 :: proc(f: f32, c0, c1, c2: Scalar_Components) -> Vector3f32 {
- return {f, f, f}
- }
- scalar_f32_swizzle4 :: proc(f: f32, c0, c1, c2, c3: Scalar_Components) -> Vector4f32 {
- return {f, f, f, f}
- }
- vector2f32_swizzle1 :: proc(v: Vector2f32, c0: Vector2_Components) -> f32 {
- return v[c0]
- }
- vector2f32_swizzle2 :: proc(v: Vector2f32, c0, c1: Vector2_Components) -> Vector2f32 {
- return {v[c0], v[c1]}
- }
- vector2f32_swizzle3 :: proc(v: Vector2f32, c0, c1, c2: Vector2_Components) -> Vector3f32 {
- return {v[c0], v[c1], v[c2]}
- }
- vector2f32_swizzle4 :: proc(v: Vector2f32, c0, c1, c2, c3: Vector2_Components) -> Vector4f32 {
- return {v[c0], v[c1], v[c2], v[c3]}
- }
- vector3f32_swizzle1 :: proc(v: Vector3f32, c0: Vector3_Components) -> f32 {
- return v[c0]
- }
- vector3f32_swizzle2 :: proc(v: Vector3f32, c0, c1: Vector3_Components) -> Vector2f32 {
- return {v[c0], v[c1]}
- }
- vector3f32_swizzle3 :: proc(v: Vector3f32, c0, c1, c2: Vector3_Components) -> Vector3f32 {
- return {v[c0], v[c1], v[c2]}
- }
- vector3f32_swizzle4 :: proc(v: Vector3f32, c0, c1, c2, c3: Vector3_Components) -> Vector4f32 {
- return {v[c0], v[c1], v[c2], v[c3]}
- }
- vector4f32_swizzle1 :: proc(v: Vector4f32, c0: Vector4_Components) -> f32 {
- return v[c0]
- }
- vector4f32_swizzle2 :: proc(v: Vector4f32, c0, c1: Vector4_Components) -> Vector2f32 {
- return {v[c0], v[c1]}
- }
- vector4f32_swizzle3 :: proc(v: Vector4f32, c0, c1, c2: Vector4_Components) -> Vector3f32 {
- return {v[c0], v[c1], v[c2]}
- }
- vector4f32_swizzle4 :: proc(v: Vector4f32, c0, c1, c2, c3: Vector4_Components) -> Vector4f32 {
- return {v[c0], v[c1], v[c2], v[c3]}
- }
- scalar_f64_swizzle1 :: proc(f: f64, c0: Scalar_Components) -> f64 {
- return f
- }
- scalar_f64_swizzle2 :: proc(f: f64, c0, c1: Scalar_Components) -> Vector2f64 {
- return {f, f}
- }
- scalar_f64_swizzle3 :: proc(f: f64, c0, c1, c2: Scalar_Components) -> Vector3f64 {
- return {f, f, f}
- }
- scalar_f64_swizzle4 :: proc(f: f64, c0, c1, c2, c3: Scalar_Components) -> Vector4f64 {
- return {f, f, f, f}
- }
- vector2f64_swizzle1 :: proc(v: Vector2f64, c0: Vector2_Components) -> f64 {
- return v[c0]
- }
- vector2f64_swizzle2 :: proc(v: Vector2f64, c0, c1: Vector2_Components) -> Vector2f64 {
- return {v[c0], v[c1]}
- }
- vector2f64_swizzle3 :: proc(v: Vector2f64, c0, c1, c2: Vector2_Components) -> Vector3f64 {
- return {v[c0], v[c1], v[c2]}
- }
- vector2f64_swizzle4 :: proc(v: Vector2f64, c0, c1, c2, c3: Vector2_Components) -> Vector4f64 {
- return {v[c0], v[c1], v[c2], v[c3]}
- }
- vector3f64_swizzle1 :: proc(v: Vector3f64, c0: Vector3_Components) -> f64 {
- return v[c0]
- }
- vector3f64_swizzle2 :: proc(v: Vector3f64, c0, c1: Vector3_Components) -> Vector2f64 {
- return {v[c0], v[c1]}
- }
- vector3f64_swizzle3 :: proc(v: Vector3f64, c0, c1, c2: Vector3_Components) -> Vector3f64 {
- return {v[c0], v[c1], v[c2]}
- }
- vector3f64_swizzle4 :: proc(v: Vector3f64, c0, c1, c2, c3: Vector3_Components) -> Vector4f64 {
- return {v[c0], v[c1], v[c2], v[c3]}
- }
- vector4f64_swizzle1 :: proc(v: Vector4f64, c0: Vector4_Components) -> f64 {
- return v[c0]
- }
- vector4f64_swizzle2 :: proc(v: Vector4f64, c0, c1: Vector4_Components) -> Vector2f64 {
- return {v[c0], v[c1]}
- }
- vector4f64_swizzle3 :: proc(v: Vector4f64, c0, c1, c2: Vector4_Components) -> Vector3f64 {
- return {v[c0], v[c1], v[c2]}
- }
- vector4f64_swizzle4 :: proc(v: Vector4f64, c0, c1, c2, c3: Vector4_Components) -> Vector4f64 {
- return {v[c0], v[c1], v[c2], v[c3]}
- }
- scalar_swizzle :: proc{
- scalar_f32_swizzle1,
- scalar_f32_swizzle2,
- scalar_f32_swizzle3,
- scalar_f32_swizzle4,
- scalar_f64_swizzle1,
- scalar_f64_swizzle2,
- scalar_f64_swizzle3,
- scalar_f64_swizzle4,
- }
- vector2_swizzle :: proc{
- vector2f32_swizzle1,
- vector2f32_swizzle2,
- vector2f32_swizzle3,
- vector2f32_swizzle4,
- vector2f64_swizzle1,
- vector2f64_swizzle2,
- vector2f64_swizzle3,
- vector2f64_swizzle4,
- }
- vector3_swizzle :: proc{
- vector3f32_swizzle1,
- vector3f32_swizzle2,
- vector3f32_swizzle3,
- vector3f32_swizzle4,
- vector3f64_swizzle1,
- vector3f64_swizzle2,
- vector3f64_swizzle3,
- vector3f64_swizzle4,
- }
- vector4_swizzle :: proc{
- vector4f32_swizzle1,
- vector4f32_swizzle2,
- vector4f32_swizzle3,
- vector4f32_swizzle4,
- vector4f64_swizzle1,
- vector4f64_swizzle2,
- vector4f64_swizzle3,
- vector4f64_swizzle4,
- }
- swizzle :: proc{
- scalar_f32_swizzle1,
- scalar_f32_swizzle2,
- scalar_f32_swizzle3,
- scalar_f32_swizzle4,
- scalar_f64_swizzle1,
- scalar_f64_swizzle2,
- scalar_f64_swizzle3,
- scalar_f64_swizzle4,
- vector2f32_swizzle1,
- vector2f32_swizzle2,
- vector2f32_swizzle3,
- vector2f32_swizzle4,
- vector2f64_swizzle1,
- vector2f64_swizzle2,
- vector2f64_swizzle3,
- vector2f64_swizzle4,
- vector3f32_swizzle1,
- vector3f32_swizzle2,
- vector3f32_swizzle3,
- vector3f32_swizzle4,
- vector3f64_swizzle1,
- vector3f64_swizzle2,
- vector3f64_swizzle3,
- vector3f64_swizzle4,
- vector4f32_swizzle1,
- vector4f32_swizzle2,
- vector4f32_swizzle3,
- vector4f32_swizzle4,
- vector4f64_swizzle1,
- vector4f64_swizzle2,
- vector4f64_swizzle3,
- vector4f64_swizzle4,
- }
|