swizzle.odin 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. package linalg
  2. /*
  3. These procedures are to allow for swizzling with non-compile (runtime) known components
  4. */
  5. Scalar_Components :: enum u8 {
  6. x = 0,
  7. r = 0,
  8. }
  9. Vector2_Components :: enum u8 {
  10. x = 0,
  11. y = 1,
  12. r = 0,
  13. g = 1,
  14. }
  15. Vector3_Components :: enum u8 {
  16. x = 0,
  17. y = 1,
  18. z = 2,
  19. r = 0,
  20. g = 1,
  21. b = 2,
  22. }
  23. Vector4_Components :: enum u8 {
  24. x = 0,
  25. y = 1,
  26. z = 2,
  27. w = 3,
  28. r = 0,
  29. g = 1,
  30. b = 2,
  31. a = 3,
  32. }
  33. scalar_f32_swizzle1 :: proc(f: f32, c0: Scalar_Components) -> f32 {
  34. return f
  35. }
  36. scalar_f32_swizzle2 :: proc(f: f32, c0, c1: Scalar_Components) -> Vector2f32 {
  37. return {f, f}
  38. }
  39. scalar_f32_swizzle3 :: proc(f: f32, c0, c1, c2: Scalar_Components) -> Vector3f32 {
  40. return {f, f, f}
  41. }
  42. scalar_f32_swizzle4 :: proc(f: f32, c0, c1, c2, c3: Scalar_Components) -> Vector4f32 {
  43. return {f, f, f, f}
  44. }
  45. vector2f32_swizzle1 :: proc(v: Vector2f32, c0: Vector2_Components) -> f32 {
  46. return v[c0]
  47. }
  48. vector2f32_swizzle2 :: proc(v: Vector2f32, c0, c1: Vector2_Components) -> Vector2f32 {
  49. return {v[c0], v[c1]}
  50. }
  51. vector2f32_swizzle3 :: proc(v: Vector2f32, c0, c1, c2: Vector2_Components) -> Vector3f32 {
  52. return {v[c0], v[c1], v[c2]}
  53. }
  54. vector2f32_swizzle4 :: proc(v: Vector2f32, c0, c1, c2, c3: Vector2_Components) -> Vector4f32 {
  55. return {v[c0], v[c1], v[c2], v[c3]}
  56. }
  57. vector3f32_swizzle1 :: proc(v: Vector3f32, c0: Vector3_Components) -> f32 {
  58. return v[c0]
  59. }
  60. vector3f32_swizzle2 :: proc(v: Vector3f32, c0, c1: Vector3_Components) -> Vector2f32 {
  61. return {v[c0], v[c1]}
  62. }
  63. vector3f32_swizzle3 :: proc(v: Vector3f32, c0, c1, c2: Vector3_Components) -> Vector3f32 {
  64. return {v[c0], v[c1], v[c2]}
  65. }
  66. vector3f32_swizzle4 :: proc(v: Vector3f32, c0, c1, c2, c3: Vector3_Components) -> Vector4f32 {
  67. return {v[c0], v[c1], v[c2], v[c3]}
  68. }
  69. vector4f32_swizzle1 :: proc(v: Vector4f32, c0: Vector4_Components) -> f32 {
  70. return v[c0]
  71. }
  72. vector4f32_swizzle2 :: proc(v: Vector4f32, c0, c1: Vector4_Components) -> Vector2f32 {
  73. return {v[c0], v[c1]}
  74. }
  75. vector4f32_swizzle3 :: proc(v: Vector4f32, c0, c1, c2: Vector4_Components) -> Vector3f32 {
  76. return {v[c0], v[c1], v[c2]}
  77. }
  78. vector4f32_swizzle4 :: proc(v: Vector4f32, c0, c1, c2, c3: Vector4_Components) -> Vector4f32 {
  79. return {v[c0], v[c1], v[c2], v[c3]}
  80. }
  81. scalar_f64_swizzle1 :: proc(f: f64, c0: Scalar_Components) -> f64 {
  82. return f
  83. }
  84. scalar_f64_swizzle2 :: proc(f: f64, c0, c1: Scalar_Components) -> Vector2f64 {
  85. return {f, f}
  86. }
  87. scalar_f64_swizzle3 :: proc(f: f64, c0, c1, c2: Scalar_Components) -> Vector3f64 {
  88. return {f, f, f}
  89. }
  90. scalar_f64_swizzle4 :: proc(f: f64, c0, c1, c2, c3: Scalar_Components) -> Vector4f64 {
  91. return {f, f, f, f}
  92. }
  93. vector2f64_swizzle1 :: proc(v: Vector2f64, c0: Vector2_Components) -> f64 {
  94. return v[c0]
  95. }
  96. vector2f64_swizzle2 :: proc(v: Vector2f64, c0, c1: Vector2_Components) -> Vector2f64 {
  97. return {v[c0], v[c1]}
  98. }
  99. vector2f64_swizzle3 :: proc(v: Vector2f64, c0, c1, c2: Vector2_Components) -> Vector3f64 {
  100. return {v[c0], v[c1], v[c2]}
  101. }
  102. vector2f64_swizzle4 :: proc(v: Vector2f64, c0, c1, c2, c3: Vector2_Components) -> Vector4f64 {
  103. return {v[c0], v[c1], v[c2], v[c3]}
  104. }
  105. vector3f64_swizzle1 :: proc(v: Vector3f64, c0: Vector3_Components) -> f64 {
  106. return v[c0]
  107. }
  108. vector3f64_swizzle2 :: proc(v: Vector3f64, c0, c1: Vector3_Components) -> Vector2f64 {
  109. return {v[c0], v[c1]}
  110. }
  111. vector3f64_swizzle3 :: proc(v: Vector3f64, c0, c1, c2: Vector3_Components) -> Vector3f64 {
  112. return {v[c0], v[c1], v[c2]}
  113. }
  114. vector3f64_swizzle4 :: proc(v: Vector3f64, c0, c1, c2, c3: Vector3_Components) -> Vector4f64 {
  115. return {v[c0], v[c1], v[c2], v[c3]}
  116. }
  117. vector4f64_swizzle1 :: proc(v: Vector4f64, c0: Vector4_Components) -> f64 {
  118. return v[c0]
  119. }
  120. vector4f64_swizzle2 :: proc(v: Vector4f64, c0, c1: Vector4_Components) -> Vector2f64 {
  121. return {v[c0], v[c1]}
  122. }
  123. vector4f64_swizzle3 :: proc(v: Vector4f64, c0, c1, c2: Vector4_Components) -> Vector3f64 {
  124. return {v[c0], v[c1], v[c2]}
  125. }
  126. vector4f64_swizzle4 :: proc(v: Vector4f64, c0, c1, c2, c3: Vector4_Components) -> Vector4f64 {
  127. return {v[c0], v[c1], v[c2], v[c3]}
  128. }
  129. scalar_swizzle :: proc{
  130. scalar_f32_swizzle1,
  131. scalar_f32_swizzle2,
  132. scalar_f32_swizzle3,
  133. scalar_f32_swizzle4,
  134. scalar_f64_swizzle1,
  135. scalar_f64_swizzle2,
  136. scalar_f64_swizzle3,
  137. scalar_f64_swizzle4,
  138. }
  139. vector2_swizzle :: proc{
  140. vector2f32_swizzle1,
  141. vector2f32_swizzle2,
  142. vector2f32_swizzle3,
  143. vector2f32_swizzle4,
  144. vector2f64_swizzle1,
  145. vector2f64_swizzle2,
  146. vector2f64_swizzle3,
  147. vector2f64_swizzle4,
  148. }
  149. vector3_swizzle :: proc{
  150. vector3f32_swizzle1,
  151. vector3f32_swizzle2,
  152. vector3f32_swizzle3,
  153. vector3f32_swizzle4,
  154. vector3f64_swizzle1,
  155. vector3f64_swizzle2,
  156. vector3f64_swizzle3,
  157. vector3f64_swizzle4,
  158. }
  159. vector4_swizzle :: proc{
  160. vector4f32_swizzle1,
  161. vector4f32_swizzle2,
  162. vector4f32_swizzle3,
  163. vector4f32_swizzle4,
  164. vector4f64_swizzle1,
  165. vector4f64_swizzle2,
  166. vector4f64_swizzle3,
  167. vector4f64_swizzle4,
  168. }
  169. swizzle :: proc{
  170. scalar_f32_swizzle1,
  171. scalar_f32_swizzle2,
  172. scalar_f32_swizzle3,
  173. scalar_f32_swizzle4,
  174. scalar_f64_swizzle1,
  175. scalar_f64_swizzle2,
  176. scalar_f64_swizzle3,
  177. scalar_f64_swizzle4,
  178. vector2f32_swizzle1,
  179. vector2f32_swizzle2,
  180. vector2f32_swizzle3,
  181. vector2f32_swizzle4,
  182. vector2f64_swizzle1,
  183. vector2f64_swizzle2,
  184. vector2f64_swizzle3,
  185. vector2f64_swizzle4,
  186. vector3f32_swizzle1,
  187. vector3f32_swizzle2,
  188. vector3f32_swizzle3,
  189. vector3f32_swizzle4,
  190. vector3f64_swizzle1,
  191. vector3f64_swizzle2,
  192. vector3f64_swizzle3,
  193. vector3f64_swizzle4,
  194. vector4f32_swizzle1,
  195. vector4f32_swizzle2,
  196. vector4f32_swizzle3,
  197. vector4f32_swizzle4,
  198. vector4f64_swizzle1,
  199. vector4f64_swizzle2,
  200. vector4f64_swizzle3,
  201. vector4f64_swizzle4,
  202. }