swizzle.odin 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  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. @(require_results)
  34. scalar_f32_swizzle1 :: proc "contextless" (f: f32, c0: Scalar_Components) -> f32 {
  35. return f
  36. }
  37. @(require_results)
  38. scalar_f32_swizzle2 :: proc "contextless" (f: f32, c0, c1: Scalar_Components) -> Vector2f32 {
  39. return {f, f}
  40. }
  41. @(require_results)
  42. scalar_f32_swizzle3 :: proc "contextless" (f: f32, c0, c1, c2: Scalar_Components) -> Vector3f32 {
  43. return {f, f, f}
  44. }
  45. @(require_results)
  46. scalar_f32_swizzle4 :: proc "contextless" (f: f32, c0, c1, c2, c3: Scalar_Components) -> Vector4f32 {
  47. return {f, f, f, f}
  48. }
  49. @(require_results)
  50. vector2f32_swizzle1 :: proc "contextless" (v: Vector2f32, c0: Vector2_Components) -> f32 {
  51. return v[c0]
  52. }
  53. @(require_results)
  54. vector2f32_swizzle2 :: proc "contextless" (v: Vector2f32, c0, c1: Vector2_Components) -> Vector2f32 {
  55. return {v[c0], v[c1]}
  56. }
  57. @(require_results)
  58. vector2f32_swizzle3 :: proc "contextless" (v: Vector2f32, c0, c1, c2: Vector2_Components) -> Vector3f32 {
  59. return {v[c0], v[c1], v[c2]}
  60. }
  61. @(require_results)
  62. vector2f32_swizzle4 :: proc "contextless" (v: Vector2f32, c0, c1, c2, c3: Vector2_Components) -> Vector4f32 {
  63. return {v[c0], v[c1], v[c2], v[c3]}
  64. }
  65. @(require_results)
  66. vector3f32_swizzle1 :: proc "contextless" (v: Vector3f32, c0: Vector3_Components) -> f32 {
  67. return v[c0]
  68. }
  69. @(require_results)
  70. vector3f32_swizzle2 :: proc "contextless" (v: Vector3f32, c0, c1: Vector3_Components) -> Vector2f32 {
  71. return {v[c0], v[c1]}
  72. }
  73. @(require_results)
  74. vector3f32_swizzle3 :: proc "contextless" (v: Vector3f32, c0, c1, c2: Vector3_Components) -> Vector3f32 {
  75. return {v[c0], v[c1], v[c2]}
  76. }
  77. @(require_results)
  78. vector3f32_swizzle4 :: proc "contextless" (v: Vector3f32, c0, c1, c2, c3: Vector3_Components) -> Vector4f32 {
  79. return {v[c0], v[c1], v[c2], v[c3]}
  80. }
  81. @(require_results)
  82. vector4f32_swizzle1 :: proc "contextless" (v: Vector4f32, c0: Vector4_Components) -> f32 {
  83. return v[c0]
  84. }
  85. @(require_results)
  86. vector4f32_swizzle2 :: proc "contextless" (v: Vector4f32, c0, c1: Vector4_Components) -> Vector2f32 {
  87. return {v[c0], v[c1]}
  88. }
  89. @(require_results)
  90. vector4f32_swizzle3 :: proc "contextless" (v: Vector4f32, c0, c1, c2: Vector4_Components) -> Vector3f32 {
  91. return {v[c0], v[c1], v[c2]}
  92. }
  93. @(require_results)
  94. vector4f32_swizzle4 :: proc "contextless" (v: Vector4f32, c0, c1, c2, c3: Vector4_Components) -> Vector4f32 {
  95. return {v[c0], v[c1], v[c2], v[c3]}
  96. }
  97. @(require_results)
  98. scalar_f64_swizzle1 :: proc "contextless" (f: f64, c0: Scalar_Components) -> f64 {
  99. return f
  100. }
  101. @(require_results)
  102. scalar_f64_swizzle2 :: proc "contextless" (f: f64, c0, c1: Scalar_Components) -> Vector2f64 {
  103. return {f, f}
  104. }
  105. @(require_results)
  106. scalar_f64_swizzle3 :: proc "contextless" (f: f64, c0, c1, c2: Scalar_Components) -> Vector3f64 {
  107. return {f, f, f}
  108. }
  109. @(require_results)
  110. scalar_f64_swizzle4 :: proc "contextless" (f: f64, c0, c1, c2, c3: Scalar_Components) -> Vector4f64 {
  111. return {f, f, f, f}
  112. }
  113. @(require_results)
  114. vector2f64_swizzle1 :: proc "contextless" (v: Vector2f64, c0: Vector2_Components) -> f64 {
  115. return v[c0]
  116. }
  117. @(require_results)
  118. vector2f64_swizzle2 :: proc "contextless" (v: Vector2f64, c0, c1: Vector2_Components) -> Vector2f64 {
  119. return {v[c0], v[c1]}
  120. }
  121. @(require_results)
  122. vector2f64_swizzle3 :: proc "contextless" (v: Vector2f64, c0, c1, c2: Vector2_Components) -> Vector3f64 {
  123. return {v[c0], v[c1], v[c2]}
  124. }
  125. @(require_results)
  126. vector2f64_swizzle4 :: proc "contextless" (v: Vector2f64, c0, c1, c2, c3: Vector2_Components) -> Vector4f64 {
  127. return {v[c0], v[c1], v[c2], v[c3]}
  128. }
  129. @(require_results)
  130. vector3f64_swizzle1 :: proc "contextless" (v: Vector3f64, c0: Vector3_Components) -> f64 {
  131. return v[c0]
  132. }
  133. @(require_results)
  134. vector3f64_swizzle2 :: proc "contextless" (v: Vector3f64, c0, c1: Vector3_Components) -> Vector2f64 {
  135. return {v[c0], v[c1]}
  136. }
  137. @(require_results)
  138. vector3f64_swizzle3 :: proc "contextless" (v: Vector3f64, c0, c1, c2: Vector3_Components) -> Vector3f64 {
  139. return {v[c0], v[c1], v[c2]}
  140. }
  141. @(require_results)
  142. vector3f64_swizzle4 :: proc "contextless" (v: Vector3f64, c0, c1, c2, c3: Vector3_Components) -> Vector4f64 {
  143. return {v[c0], v[c1], v[c2], v[c3]}
  144. }
  145. @(require_results)
  146. vector4f64_swizzle1 :: proc "contextless" (v: Vector4f64, c0: Vector4_Components) -> f64 {
  147. return v[c0]
  148. }
  149. @(require_results)
  150. vector4f64_swizzle2 :: proc "contextless" (v: Vector4f64, c0, c1: Vector4_Components) -> Vector2f64 {
  151. return {v[c0], v[c1]}
  152. }
  153. @(require_results)
  154. vector4f64_swizzle3 :: proc "contextless" (v: Vector4f64, c0, c1, c2: Vector4_Components) -> Vector3f64 {
  155. return {v[c0], v[c1], v[c2]}
  156. }
  157. @(require_results)
  158. vector4f64_swizzle4 :: proc "contextless" (v: Vector4f64, c0, c1, c2, c3: Vector4_Components) -> Vector4f64 {
  159. return {v[c0], v[c1], v[c2], v[c3]}
  160. }
  161. scalar_swizzle :: proc{
  162. scalar_f32_swizzle1,
  163. scalar_f32_swizzle2,
  164. scalar_f32_swizzle3,
  165. scalar_f32_swizzle4,
  166. scalar_f64_swizzle1,
  167. scalar_f64_swizzle2,
  168. scalar_f64_swizzle3,
  169. scalar_f64_swizzle4,
  170. }
  171. vector2_swizzle :: proc{
  172. vector2f32_swizzle1,
  173. vector2f32_swizzle2,
  174. vector2f32_swizzle3,
  175. vector2f32_swizzle4,
  176. vector2f64_swizzle1,
  177. vector2f64_swizzle2,
  178. vector2f64_swizzle3,
  179. vector2f64_swizzle4,
  180. }
  181. vector3_swizzle :: proc{
  182. vector3f32_swizzle1,
  183. vector3f32_swizzle2,
  184. vector3f32_swizzle3,
  185. vector3f32_swizzle4,
  186. vector3f64_swizzle1,
  187. vector3f64_swizzle2,
  188. vector3f64_swizzle3,
  189. vector3f64_swizzle4,
  190. }
  191. vector4_swizzle :: proc{
  192. vector4f32_swizzle1,
  193. vector4f32_swizzle2,
  194. vector4f32_swizzle3,
  195. vector4f32_swizzle4,
  196. vector4f64_swizzle1,
  197. vector4f64_swizzle2,
  198. vector4f64_swizzle3,
  199. vector4f64_swizzle4,
  200. }
  201. swizzle :: proc{
  202. scalar_f32_swizzle1,
  203. scalar_f32_swizzle2,
  204. scalar_f32_swizzle3,
  205. scalar_f32_swizzle4,
  206. scalar_f64_swizzle1,
  207. scalar_f64_swizzle2,
  208. scalar_f64_swizzle3,
  209. scalar_f64_swizzle4,
  210. vector2f32_swizzle1,
  211. vector2f32_swizzle2,
  212. vector2f32_swizzle3,
  213. vector2f32_swizzle4,
  214. vector2f64_swizzle1,
  215. vector2f64_swizzle2,
  216. vector2f64_swizzle3,
  217. vector2f64_swizzle4,
  218. vector3f32_swizzle1,
  219. vector3f32_swizzle2,
  220. vector3f32_swizzle3,
  221. vector3f32_swizzle4,
  222. vector3f64_swizzle1,
  223. vector3f64_swizzle2,
  224. vector3f64_swizzle3,
  225. vector3f64_swizzle4,
  226. vector4f32_swizzle1,
  227. vector4f32_swizzle2,
  228. vector4f32_swizzle3,
  229. vector4f32_swizzle4,
  230. vector4f64_swizzle1,
  231. vector4f64_swizzle2,
  232. vector4f64_swizzle3,
  233. vector4f64_swizzle4,
  234. }