swizzle.odin 5.3 KB

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