specific_euler_angles_f16.odin 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356
  1. package linalg
  2. import "core:math"
  3. euler_angles_from_matrix3_f16 :: proc(m: Matrix3f16, order: Euler_Angle_Order) -> (t1, t2, t3: f16) {
  4. switch order {
  5. case .XYZ: t1, t2, t3 = euler_angles_xyz_from_matrix3(m)
  6. case .XZY: t1, t2, t3 = euler_angles_xzy_from_matrix3(m)
  7. case .YXZ: t1, t2, t3 = euler_angles_yxz_from_matrix3(m)
  8. case .YZX: t1, t2, t3 = euler_angles_yzx_from_matrix3(m)
  9. case .ZXY: t1, t2, t3 = euler_angles_zxy_from_matrix3(m)
  10. case .ZYX: t1, t2, t3 = euler_angles_zyx_from_matrix3(m)
  11. case .XYX: t1, t2, t3 = euler_angles_xyx_from_matrix3(m)
  12. case .XZX: t1, t2, t3 = euler_angles_xzx_from_matrix3(m)
  13. case .YXY: t1, t2, t3 = euler_angles_yxy_from_matrix3(m)
  14. case .YZY: t1, t2, t3 = euler_angles_yzy_from_matrix3(m)
  15. case .ZXZ: t1, t2, t3 = euler_angles_zxz_from_matrix3(m)
  16. case .ZYZ: t1, t2, t3 = euler_angles_zyz_from_matrix3(m)
  17. }
  18. return
  19. }
  20. euler_angles_from_matrix4_f16 :: proc(m: Matrix4f16, order: Euler_Angle_Order) -> (t1, t2, t3: f16) {
  21. switch order {
  22. case .XYZ: t1, t2, t3 = euler_angles_xyz_from_matrix4(m)
  23. case .XZY: t1, t2, t3 = euler_angles_xzy_from_matrix4(m)
  24. case .YXZ: t1, t2, t3 = euler_angles_yxz_from_matrix4(m)
  25. case .YZX: t1, t2, t3 = euler_angles_yzx_from_matrix4(m)
  26. case .ZXY: t1, t2, t3 = euler_angles_zxy_from_matrix4(m)
  27. case .ZYX: t1, t2, t3 = euler_angles_zyx_from_matrix4(m)
  28. case .XYX: t1, t2, t3 = euler_angles_xyx_from_matrix4(m)
  29. case .XZX: t1, t2, t3 = euler_angles_xzx_from_matrix4(m)
  30. case .YXY: t1, t2, t3 = euler_angles_yxy_from_matrix4(m)
  31. case .YZY: t1, t2, t3 = euler_angles_yzy_from_matrix4(m)
  32. case .ZXZ: t1, t2, t3 = euler_angles_zxz_from_matrix4(m)
  33. case .ZYZ: t1, t2, t3 = euler_angles_zyz_from_matrix4(m)
  34. }
  35. return
  36. }
  37. euler_angles_from_quaternion_f16 :: proc(m: Quaternionf16, order: Euler_Angle_Order) -> (t1, t2, t3: f16) {
  38. switch order {
  39. case .XYZ: t1, t2, t3 = euler_angles_xyz_from_quaternion(m)
  40. case .XZY: t1, t2, t3 = euler_angles_xzy_from_quaternion(m)
  41. case .YXZ: t1, t2, t3 = euler_angles_yxz_from_quaternion(m)
  42. case .YZX: t1, t2, t3 = euler_angles_yzx_from_quaternion(m)
  43. case .ZXY: t1, t2, t3 = euler_angles_zxy_from_quaternion(m)
  44. case .ZYX: t1, t2, t3 = euler_angles_zyx_from_quaternion(m)
  45. case .XYX: t1, t2, t3 = euler_angles_xyx_from_quaternion(m)
  46. case .XZX: t1, t2, t3 = euler_angles_xzx_from_quaternion(m)
  47. case .YXY: t1, t2, t3 = euler_angles_yxy_from_quaternion(m)
  48. case .YZY: t1, t2, t3 = euler_angles_yzy_from_quaternion(m)
  49. case .ZXZ: t1, t2, t3 = euler_angles_zxz_from_quaternion(m)
  50. case .ZYZ: t1, t2, t3 = euler_angles_zyz_from_quaternion(m)
  51. }
  52. return
  53. }
  54. matrix3_from_euler_angles_f16 :: proc(t1, t2, t3: f16, order: Euler_Angle_Order) -> (m: Matrix3f16) {
  55. switch order {
  56. case .XYZ: return matrix3_from_euler_angles_xyz(t1, t2, t3) // m1, m2, m3 = X(t1), Y(t2), Z(t3);
  57. case .XZY: return matrix3_from_euler_angles_xzy(t1, t2, t3) // m1, m2, m3 = X(t1), Z(t2), Y(t3);
  58. case .YXZ: return matrix3_from_euler_angles_yxz(t1, t2, t3) // m1, m2, m3 = Y(t1), X(t2), Z(t3);
  59. case .YZX: return matrix3_from_euler_angles_yzx(t1, t2, t3) // m1, m2, m3 = Y(t1), Z(t2), X(t3);
  60. case .ZXY: return matrix3_from_euler_angles_zxy(t1, t2, t3) // m1, m2, m3 = Z(t1), X(t2), Y(t3);
  61. case .ZYX: return matrix3_from_euler_angles_zyx(t1, t2, t3) // m1, m2, m3 = Z(t1), Y(t2), X(t3);
  62. case .XYX: return matrix3_from_euler_angles_xyx(t1, t2, t3) // m1, m2, m3 = X(t1), Y(t2), X(t3);
  63. case .XZX: return matrix3_from_euler_angles_xzx(t1, t2, t3) // m1, m2, m3 = X(t1), Z(t2), X(t3);
  64. case .YXY: return matrix3_from_euler_angles_yxy(t1, t2, t3) // m1, m2, m3 = Y(t1), X(t2), Y(t3);
  65. case .YZY: return matrix3_from_euler_angles_yzy(t1, t2, t3) // m1, m2, m3 = Y(t1), Z(t2), Y(t3);
  66. case .ZXZ: return matrix3_from_euler_angles_zxz(t1, t2, t3) // m1, m2, m3 = Z(t1), X(t2), Z(t3);
  67. case .ZYZ: return matrix3_from_euler_angles_zyz(t1, t2, t3) // m1, m2, m3 = Z(t1), Y(t2), Z(t3);
  68. }
  69. return
  70. }
  71. matrix4_from_euler_angles_f16 :: proc(t1, t2, t3: f16, order: Euler_Angle_Order) -> (m: Matrix4f16) {
  72. switch order {
  73. case .XYZ: return matrix4_from_euler_angles_xyz(t1, t2, t3) // m1, m2, m3 = X(t1), Y(t2), Z(t3);
  74. case .XZY: return matrix4_from_euler_angles_xzy(t1, t2, t3) // m1, m2, m3 = X(t1), Z(t2), Y(t3);
  75. case .YXZ: return matrix4_from_euler_angles_yxz(t1, t2, t3) // m1, m2, m3 = Y(t1), X(t2), Z(t3);
  76. case .YZX: return matrix4_from_euler_angles_yzx(t1, t2, t3) // m1, m2, m3 = Y(t1), Z(t2), X(t3);
  77. case .ZXY: return matrix4_from_euler_angles_zxy(t1, t2, t3) // m1, m2, m3 = Z(t1), X(t2), Y(t3);
  78. case .ZYX: return matrix4_from_euler_angles_zyx(t1, t2, t3) // m1, m2, m3 = Z(t1), Y(t2), X(t3);
  79. case .XYX: return matrix4_from_euler_angles_xyx(t1, t2, t3) // m1, m2, m3 = X(t1), Y(t2), X(t3);
  80. case .XZX: return matrix4_from_euler_angles_xzx(t1, t2, t3) // m1, m2, m3 = X(t1), Z(t2), X(t3);
  81. case .YXY: return matrix4_from_euler_angles_yxy(t1, t2, t3) // m1, m2, m3 = Y(t1), X(t2), Y(t3);
  82. case .YZY: return matrix4_from_euler_angles_yzy(t1, t2, t3) // m1, m2, m3 = Y(t1), Z(t2), Y(t3);
  83. case .ZXZ: return matrix4_from_euler_angles_zxz(t1, t2, t3) // m1, m2, m3 = Z(t1), X(t2), Z(t3);
  84. case .ZYZ: return matrix4_from_euler_angles_zyz(t1, t2, t3) // m1, m2, m3 = Z(t1), Y(t2), Z(t3);
  85. }
  86. return
  87. }
  88. quaternion_from_euler_angles_f16 :: proc(t1, t2, t3: f16, order: Euler_Angle_Order) -> Quaternionf16 {
  89. X :: quaternion_from_euler_angle_x
  90. Y :: quaternion_from_euler_angle_y
  91. Z :: quaternion_from_euler_angle_z
  92. q1, q2, q3: Quaternionf16
  93. switch order {
  94. case .XYZ: q1, q2, q3 = X(t1), Y(t2), Z(t3)
  95. case .XZY: q1, q2, q3 = X(t1), Z(t2), Y(t3)
  96. case .YXZ: q1, q2, q3 = Y(t1), X(t2), Z(t3)
  97. case .YZX: q1, q2, q3 = Y(t1), Z(t2), X(t3)
  98. case .ZXY: q1, q2, q3 = Z(t1), X(t2), Y(t3)
  99. case .ZYX: q1, q2, q3 = Z(t1), Y(t2), X(t3)
  100. case .XYX: q1, q2, q3 = X(t1), Y(t2), X(t3)
  101. case .XZX: q1, q2, q3 = X(t1), Z(t2), X(t3)
  102. case .YXY: q1, q2, q3 = Y(t1), X(t2), Y(t3)
  103. case .YZY: q1, q2, q3 = Y(t1), Z(t2), Y(t3)
  104. case .ZXZ: q1, q2, q3 = Z(t1), X(t2), Z(t3)
  105. case .ZYZ: q1, q2, q3 = Z(t1), Y(t2), Z(t3)
  106. }
  107. return q1 * (q2 * q3)
  108. }
  109. // Quaternionf16s
  110. quaternion_from_euler_angle_x_f16 :: proc(angle_x: f16) -> (q: Quaternionf16) {
  111. return quaternion_angle_axis_f16(angle_x, {1, 0, 0})
  112. }
  113. quaternion_from_euler_angle_y_f16 :: proc(angle_y: f16) -> (q: Quaternionf16) {
  114. return quaternion_angle_axis_f16(angle_y, {0, 1, 0})
  115. }
  116. quaternion_from_euler_angle_z_f16 :: proc(angle_z: f16) -> (q: Quaternionf16) {
  117. return quaternion_angle_axis_f16(angle_z, {0, 0, 1})
  118. }
  119. quaternion_from_pitch_yaw_roll_f16 :: proc(pitch, yaw, roll: f16) -> Quaternionf16 {
  120. a, b, c := pitch, yaw, roll
  121. ca, sa := math.cos(a*0.5), math.sin(a*0.5)
  122. cb, sb := math.cos(b*0.5), math.sin(b*0.5)
  123. cc, sc := math.cos(c*0.5), math.sin(c*0.5)
  124. q: Quaternionf16
  125. q.x = sa*cb*cc - ca*sb*sc
  126. q.y = ca*sb*cc + sa*cb*sc
  127. q.z = ca*cb*sc - sa*sb*cc
  128. q.w = ca*cb*cc + sa*sb*sc
  129. return q
  130. }
  131. roll_from_quaternion_f16 :: proc(q: Quaternionf16) -> f16 {
  132. return math.atan2(2 * q.x*q.y + q.w*q.z, q.w*q.w + q.x*q.x - q.y*q.y - q.z*q.z)
  133. }
  134. pitch_from_quaternion_f16 :: proc(q: Quaternionf16) -> f16 {
  135. y := 2 * (q.y*q.z + q.w*q.w)
  136. x := q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z
  137. if abs(x) <= F16_EPSILON && abs(y) <= F16_EPSILON {
  138. return 2 * math.atan2(q.x, q.w)
  139. }
  140. return math.atan2(y, x)
  141. }
  142. yaw_from_quaternion_f16 :: proc(q: Quaternionf16) -> f16 {
  143. return math.asin(clamp(-2 * (q.x*q.z - q.w*q.y), -1, 1))
  144. }
  145. pitch_yaw_roll_from_quaternion_f16 :: proc(q: Quaternionf16) -> (pitch, yaw, roll: f16) {
  146. pitch = pitch_from_quaternion(q)
  147. yaw = yaw_from_quaternion(q)
  148. roll = roll_from_quaternion(q)
  149. return
  150. }
  151. euler_angles_xyz_from_quaternion_f16 :: proc(q: Quaternionf16) -> (t1, t2, t3: f16) {
  152. return euler_angles_xyz_from_matrix4(matrix4_from_quaternion(q))
  153. }
  154. euler_angles_yxz_from_quaternion_f16 :: proc(q: Quaternionf16) -> (t1, t2, t3: f16) {
  155. return euler_angles_yxz_from_matrix4(matrix4_from_quaternion(q))
  156. }
  157. euler_angles_xzx_from_quaternion_f16 :: proc(q: Quaternionf16) -> (t1, t2, t3: f16) {
  158. return euler_angles_xzx_from_matrix4(matrix4_from_quaternion(q))
  159. }
  160. euler_angles_xyx_from_quaternion_f16 :: proc(q: Quaternionf16) -> (t1, t2, t3: f16) {
  161. return euler_angles_xyx_from_matrix4(matrix4_from_quaternion(q))
  162. }
  163. euler_angles_yxy_from_quaternion_f16 :: proc(q: Quaternionf16) -> (t1, t2, t3: f16) {
  164. return euler_angles_yxy_from_matrix4(matrix4_from_quaternion(q))
  165. }
  166. euler_angles_yzy_from_quaternion_f16 :: proc(q: Quaternionf16) -> (t1, t2, t3: f16) {
  167. return euler_angles_yzy_from_matrix4(matrix4_from_quaternion(q))
  168. }
  169. euler_angles_zyz_from_quaternion_f16 :: proc(q: Quaternionf16) -> (t1, t2, t3: f16) {
  170. return euler_angles_zyz_from_matrix4(matrix4_from_quaternion(q))
  171. }
  172. euler_angles_zxz_from_quaternion_f16 :: proc(q: Quaternionf16) -> (t1, t2, t3: f16) {
  173. return euler_angles_zxz_from_matrix4(matrix4_from_quaternion(q))
  174. }
  175. euler_angles_xzy_from_quaternion_f16 :: proc(q: Quaternionf16) -> (t1, t2, t3: f16) {
  176. return euler_angles_xzy_from_matrix4(matrix4_from_quaternion(q))
  177. }
  178. euler_angles_yzx_from_quaternion_f16 :: proc(q: Quaternionf16) -> (t1, t2, t3: f16) {
  179. return euler_angles_yzx_from_matrix4(matrix4_from_quaternion(q))
  180. }
  181. euler_angles_zyx_from_quaternion_f16 :: proc(q: Quaternionf16) -> (t1, t2, t3: f16) {
  182. return euler_angles_zyx_from_matrix4(matrix4_from_quaternion(q))
  183. }
  184. euler_angles_zxy_from_quaternion_f16 :: proc(q: Quaternionf16) -> (t1, t2, t3: f16) {
  185. return euler_angles_zxy_from_matrix4(matrix4_from_quaternion(q))
  186. }
  187. // Matrix3
  188. matrix3_from_euler_angle_x_f16 :: proc(angle_x: f16) -> (m: Matrix3f16) {
  189. cos_x, sin_x := math.cos(angle_x), math.sin(angle_x)
  190. m[0, 0] = 1
  191. m[1, 1] = +cos_x
  192. m[1, 2] = +sin_x
  193. m[2, 1] = -sin_x
  194. m[2, 2] = +cos_x
  195. return
  196. }
  197. matrix3_from_euler_angle_y_f16 :: proc(angle_y: f16) -> (m: Matrix3f16) {
  198. cos_y, sin_y := math.cos(angle_y), math.sin(angle_y)
  199. m[0, 0] = +cos_y
  200. m[0, 2] = -sin_y
  201. m[1, 1] = 1
  202. m[2, 0] = +sin_y
  203. m[2, 2] = +cos_y
  204. return
  205. }
  206. matrix3_from_euler_angle_z_f16 :: proc(angle_z: f16) -> (m: Matrix3f16) {
  207. cos_z, sin_z := math.cos(angle_z), math.sin(angle_z)
  208. m[0, 0] = +cos_z
  209. m[0, 1] = +sin_z
  210. m[1, 1] = +cos_z
  211. m[1, 0] = -sin_z
  212. m[2, 2] = 1
  213. return
  214. }
  215. matrix3_from_derived_euler_angle_x_f16 :: proc(angle_x: f16, angular_velocity_x: f16) -> (m: Matrix3f16) {
  216. cos_x := math.cos(angle_x) * angular_velocity_x
  217. sin_x := math.sin(angle_x) * angular_velocity_x
  218. m[0, 0] = 1
  219. m[1, 1] = +cos_x
  220. m[1, 2] = +sin_x
  221. m[2, 1] = -sin_x
  222. m[2, 2] = +cos_x
  223. return
  224. }
  225. matrix3_from_derived_euler_angle_y_f16 :: proc(angle_y: f16, angular_velocity_y: f16) -> (m: Matrix3f16) {
  226. cos_y := math.cos(angle_y) * angular_velocity_y
  227. sin_y := math.sin(angle_y) * angular_velocity_y
  228. m[0, 0] = +cos_y
  229. m[0, 2] = -sin_y
  230. m[1, 1] = 1
  231. m[2, 0] = +sin_y
  232. m[2, 2] = +cos_y
  233. return
  234. }
  235. matrix3_from_derived_euler_angle_z_f16 :: proc(angle_z: f16, angular_velocity_z: f16) -> (m: Matrix3f16) {
  236. cos_z := math.cos(angle_z) * angular_velocity_z
  237. sin_z := math.sin(angle_z) * angular_velocity_z
  238. m[0, 0] = +cos_z
  239. m[0, 1] = +sin_z
  240. m[1, 1] = +cos_z
  241. m[1, 0] = -sin_z
  242. m[2, 2] = 1
  243. return
  244. }
  245. matrix3_from_euler_angles_xy_f16 :: proc(angle_x, angle_y: f16) -> (m: Matrix3f16) {
  246. cos_x, sin_x := math.cos(angle_x), math.sin(angle_x)
  247. cos_y, sin_y := math.cos(angle_y), math.sin(angle_y)
  248. m[0, 0] = cos_y
  249. m[0, 1] = -sin_x * - sin_y
  250. m[0, 2] = -cos_x * - sin_y
  251. m[1, 1] = cos_x
  252. m[1, 2] = sin_x
  253. m[2, 0] = sin_y
  254. m[2, 1] = -sin_x * cos_y
  255. m[2, 2] = cos_x * cos_y
  256. return
  257. }
  258. matrix3_from_euler_angles_yx_f16 :: proc(angle_y, angle_x: f16) -> (m: Matrix3f16) {
  259. cos_x, sin_x := math.cos(angle_x), math.sin(angle_x)
  260. cos_y, sin_y := math.cos(angle_y), math.sin(angle_y)
  261. m[0, 0] = cos_y
  262. m[0, 2] = -sin_y
  263. m[1, 0] = sin_y*sin_x
  264. m[1, 1] = cos_x
  265. m[1, 2] = cos_y*sin_x
  266. m[2, 0] = sin_y*cos_x
  267. m[2, 1] = -sin_x
  268. m[2, 2] = cos_y*cos_x
  269. return
  270. }
  271. matrix3_from_euler_angles_xz_f16 :: proc(angle_x, angle_z: f16) -> (m: Matrix3f16) {
  272. return mul(matrix3_from_euler_angle_x(angle_x), matrix3_from_euler_angle_z(angle_z))
  273. }
  274. matrix3_from_euler_angles_zx_f16 :: proc(angle_z, angle_x: f16) -> (m: Matrix3f16) {
  275. return mul(matrix3_from_euler_angle_z(angle_z), matrix3_from_euler_angle_x(angle_x))
  276. }
  277. matrix3_from_euler_angles_yz_f16 :: proc(angle_y, angle_z: f16) -> (m: Matrix3f16) {
  278. return mul(matrix3_from_euler_angle_y(angle_y), matrix3_from_euler_angle_z(angle_z))
  279. }
  280. matrix3_from_euler_angles_zy_f16 :: proc(angle_z, angle_y: f16) -> (m: Matrix3f16) {
  281. return mul(matrix3_from_euler_angle_z(angle_z), matrix3_from_euler_angle_y(angle_y))
  282. }
  283. matrix3_from_euler_angles_xyz_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix3f16) {
  284. c1 := math.cos(-t1)
  285. c2 := math.cos(-t2)
  286. c3 := math.cos(-t3)
  287. s1 := math.sin(-t1)
  288. s2 := math.sin(-t2)
  289. s3 := math.sin(-t3)
  290. m[0, 0] = c2 * c3
  291. m[1, 0] =-c1 * s3 + s1 * s2 * c3
  292. m[2, 0] = s1 * s3 + c1 * s2 * c3
  293. m[0, 1] = c2 * s3
  294. m[1, 1] = c1 * c3 + s1 * s2 * s3
  295. m[2, 1] =-s1 * c3 + c1 * s2 * s3
  296. m[0, 2] =-s2
  297. m[1, 2] = s1 * c2
  298. m[2, 2] = c1 * c2
  299. return
  300. }
  301. matrix3_from_euler_angles_yxz_f16 :: proc(yaw, pitch, roll: f16) -> (m: Matrix3f16) {
  302. ch := math.cos(yaw)
  303. sh := math.sin(yaw)
  304. cp := math.cos(pitch)
  305. sp := math.sin(pitch)
  306. cb := math.cos(roll)
  307. sb := math.sin(roll)
  308. m[0, 0] = ch * cb + sh * sp * sb
  309. m[1, 0] = sb * cp
  310. m[2, 0] = -sh * cb + ch * sp * sb
  311. m[0, 1] = -ch * sb + sh * sp * cb
  312. m[1, 1] = cb * cp
  313. m[2, 1] = sb * sh + ch * sp * cb
  314. m[0, 2] = sh * cp
  315. m[1, 2] = -sp
  316. m[2, 2] = ch * cp
  317. return
  318. }
  319. matrix3_from_euler_angles_xzx_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix3f16) {
  320. c1 := math.cos(t1)
  321. s1 := math.sin(t1)
  322. c2 := math.cos(t2)
  323. s2 := math.sin(t2)
  324. c3 := math.cos(t3)
  325. s3 := math.sin(t3)
  326. m[0, 0] = c2
  327. m[1, 0] = c1 * s2
  328. m[2, 0] = s1 * s2
  329. m[0, 1] =-c3 * s2
  330. m[1, 1] = c1 * c2 * c3 - s1 * s3
  331. m[2, 1] = c1 * s3 + c2 * c3 * s1
  332. m[0, 2] = s2 * s3
  333. m[1, 2] =-c3 * s1 - c1 * c2 * s3
  334. m[2, 2] = c1 * c3 - c2 * s1 * s3
  335. return
  336. }
  337. matrix3_from_euler_angles_xyx_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix3f16) {
  338. c1 := math.cos(t1)
  339. s1 := math.sin(t1)
  340. c2 := math.cos(t2)
  341. s2 := math.sin(t2)
  342. c3 := math.cos(t3)
  343. s3 := math.sin(t3)
  344. m[0, 0] = c2
  345. m[1, 0] = s1 * s2
  346. m[2, 0] =-c1 * s2
  347. m[0, 1] = s2 * s3
  348. m[1, 1] = c1 * c3 - c2 * s1 * s3
  349. m[2, 1] = c3 * s1 + c1 * c2 * s3
  350. m[0, 2] = c3 * s2
  351. m[1, 2] =-c1 * s3 - c2 * c3 * s1
  352. m[2, 2] = c1 * c2 * c3 - s1 * s3
  353. return
  354. }
  355. matrix3_from_euler_angles_yxy_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix3f16) {
  356. c1 := math.cos(t1)
  357. s1 := math.sin(t1)
  358. c2 := math.cos(t2)
  359. s2 := math.sin(t2)
  360. c3 := math.cos(t3)
  361. s3 := math.sin(t3)
  362. m[0, 0] = c1 * c3 - c2 * s1 * s3
  363. m[1, 0] = s2* s3
  364. m[2, 0] =-c3 * s1 - c1 * c2 * s3
  365. m[0, 1] = s1 * s2
  366. m[1, 1] = c2
  367. m[2, 1] = c1 * s2
  368. m[0, 2] = c1 * s3 + c2 * c3 * s1
  369. m[1, 2] =-c3 * s2
  370. m[2, 2] = c1 * c2 * c3 - s1 * s3
  371. return
  372. }
  373. matrix3_from_euler_angles_yzy_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix3f16) {
  374. c1 := math.cos(t1)
  375. s1 := math.sin(t1)
  376. c2 := math.cos(t2)
  377. s2 := math.sin(t2)
  378. c3 := math.cos(t3)
  379. s3 := math.sin(t3)
  380. m[0, 0] = c1 * c2 * c3 - s1 * s3
  381. m[1, 0] = c3 * s2
  382. m[2, 0] =-c1 * s3 - c2 * c3 * s1
  383. m[0, 1] =-c1 * s2
  384. m[1, 1] = c2
  385. m[2, 1] = s1 * s2
  386. m[0, 2] = c3 * s1 + c1 * c2 * s3
  387. m[1, 2] = s2 * s3
  388. m[2, 2] = c1 * c3 - c2 * s1 * s3
  389. return
  390. }
  391. matrix3_from_euler_angles_zyz_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix3f16) {
  392. c1 := math.cos(t1)
  393. s1 := math.sin(t1)
  394. c2 := math.cos(t2)
  395. s2 := math.sin(t2)
  396. c3 := math.cos(t3)
  397. s3 := math.sin(t3)
  398. m[0, 0] = c1 * c2 * c3 - s1 * s3
  399. m[1, 0] = c1 * s3 + c2 * c3 * s1
  400. m[2, 0] =-c3 * s2
  401. m[0, 1] =-c3 * s1 - c1 * c2 * s3
  402. m[1, 1] = c1 * c3 - c2 * s1 * s3
  403. m[2, 1] = s2 * s3
  404. m[0, 2] = c1 * s2
  405. m[1, 2] = s1 * s2
  406. m[2, 2] = c2
  407. return
  408. }
  409. matrix3_from_euler_angles_zxz_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix3f16) {
  410. c1 := math.cos(t1)
  411. s1 := math.sin(t1)
  412. c2 := math.cos(t2)
  413. s2 := math.sin(t2)
  414. c3 := math.cos(t3)
  415. s3 := math.sin(t3)
  416. m[0, 0] = c1 * c3 - c2 * s1 * s3
  417. m[1, 0] = c3 * s1 + c1 * c2 * s3
  418. m[2, 0] = s2 *s3
  419. m[0, 1] =-c1 * s3 - c2 * c3 * s1
  420. m[1, 1] = c1 * c2 * c3 - s1 * s3
  421. m[2, 1] = c3 * s2
  422. m[0, 2] = s1 * s2
  423. m[1, 2] =-c1 * s2
  424. m[2, 2] = c2
  425. return
  426. }
  427. matrix3_from_euler_angles_xzy_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix3f16) {
  428. c1 := math.cos(t1)
  429. s1 := math.sin(t1)
  430. c2 := math.cos(t2)
  431. s2 := math.sin(t2)
  432. c3 := math.cos(t3)
  433. s3 := math.sin(t3)
  434. m[0, 0] = c2 * c3
  435. m[1, 0] = s1 * s3 + c1 * c3 * s2
  436. m[2, 0] = c3 * s1 * s2 - c1 * s3
  437. m[0, 1] =-s2
  438. m[1, 1] = c1 * c2
  439. m[2, 1] = c2 * s1
  440. m[0, 2] = c2 * s3
  441. m[1, 2] = c1 * s2 * s3 - c3 * s1
  442. m[2, 2] = c1 * c3 + s1 * s2 *s3
  443. return
  444. }
  445. matrix3_from_euler_angles_yzx_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix3f16) {
  446. c1 := math.cos(t1)
  447. s1 := math.sin(t1)
  448. c2 := math.cos(t2)
  449. s2 := math.sin(t2)
  450. c3 := math.cos(t3)
  451. s3 := math.sin(t3)
  452. m[0, 0] = c1 * c2
  453. m[1, 0] = s2
  454. m[2, 0] =-c2 * s1
  455. m[0, 1] = s1 * s3 - c1 * c3 * s2
  456. m[1, 1] = c2 * c3
  457. m[2, 1] = c1 * s3 + c3 * s1 * s2
  458. m[0, 2] = c3 * s1 + c1 * s2 * s3
  459. m[1, 2] =-c2 * s3
  460. m[2, 2] = c1 * c3 - s1 * s2 * s3
  461. return
  462. }
  463. matrix3_from_euler_angles_zyx_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix3f16) {
  464. c1 := math.cos(t1)
  465. s1 := math.sin(t1)
  466. c2 := math.cos(t2)
  467. s2 := math.sin(t2)
  468. c3 := math.cos(t3)
  469. s3 := math.sin(t3)
  470. m[0, 0] = c1 * c2
  471. m[1, 0] = c2 * s1
  472. m[2, 0] =-s2
  473. m[0, 1] = c1 * s2 * s3 - c3 * s1
  474. m[1, 1] = c1 * c3 + s1 * s2 * s3
  475. m[2, 1] = c2 * s3
  476. m[0, 2] = s1 * s3 + c1 * c3 * s2
  477. m[1, 2] = c3 * s1 * s2 - c1 * s3
  478. m[2, 2] = c2 * c3
  479. return
  480. }
  481. matrix3_from_euler_angles_zxy_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix3f16) {
  482. c1 := math.cos(t1)
  483. s1 := math.sin(t1)
  484. c2 := math.cos(t2)
  485. s2 := math.sin(t2)
  486. c3 := math.cos(t3)
  487. s3 := math.sin(t3)
  488. m[0, 0] = c1 * c3 - s1 * s2 * s3
  489. m[1, 0] = c3 * s1 + c1 * s2 * s3
  490. m[2, 0] =-c2 * s3
  491. m[0, 1] =-c2 * s1
  492. m[1, 1] = c1 * c2
  493. m[2, 1] = s2
  494. m[0, 2] = c1 * s3 + c3 * s1 * s2
  495. m[1, 2] = s1 * s3 - c1 * c3 * s2
  496. m[2, 2] = c2 * c3
  497. return
  498. }
  499. matrix3_from_yaw_pitch_roll_f16 :: proc(yaw, pitch, roll: f16) -> (m: Matrix3f16) {
  500. ch := math.cos(yaw)
  501. sh := math.sin(yaw)
  502. cp := math.cos(pitch)
  503. sp := math.sin(pitch)
  504. cb := math.cos(roll)
  505. sb := math.sin(roll)
  506. m[0, 0] = ch * cb + sh * sp * sb
  507. m[1, 0] = sb * cp
  508. m[2, 0] = -sh * cb + ch * sp * sb
  509. m[0, 1] = -ch * sb + sh * sp * cb
  510. m[1, 1] = cb * cp
  511. m[2, 1] = sb * sh + ch * sp * cb
  512. m[0, 2] = sh * cp
  513. m[1, 2] = -sp
  514. m[2, 2] = ch * cp
  515. return m
  516. }
  517. euler_angles_xyz_from_matrix3_f16 :: proc(m: Matrix3f16) -> (t1, t2, t3: f16) {
  518. T1 := math.atan2(m[1, 2], m[2, 2])
  519. C2 := math.sqrt(m[0, 0]*m[0, 0] + m[0, 1]*m[0, 1])
  520. T2 := math.atan2(-m[0, 2], C2)
  521. S1 := math.sin(T1)
  522. C1 := math.cos(T1)
  523. T3 := math.atan2(S1*m[2, 0] - C1*m[1, 0], C1*m[1, 1] - S1*m[2, 1])
  524. t1 = -T1
  525. t2 = -T2
  526. t3 = -T3
  527. return
  528. }
  529. euler_angles_yxz_from_matrix3_f16 :: proc(m: Matrix3f16) -> (t1, t2, t3: f16) {
  530. T1 := math.atan2(m[0, 2], m[2, 2])
  531. C2 := math.sqrt(m[1, 0]*m[1, 0] + m[1, 1]*m[1, 1])
  532. T2 := math.atan2(-m[1, 2], C2)
  533. S1 := math.sin(T1)
  534. C1 := math.cos(T1)
  535. T3 := math.atan2(S1*m[2, 1] - C1*m[0, 1], C1*m[0, 0] - S1*m[2, 0])
  536. t1 = T1
  537. t2 = T2
  538. t3 = T3
  539. return
  540. }
  541. euler_angles_xzx_from_matrix3_f16 :: proc(m: Matrix3f16) -> (t1, t2, t3: f16) {
  542. T1 := math.atan2(m[2, 0], m[1, 0])
  543. S2 := math.sqrt(m[0, 1]*m[0, 1] + m[0, 2]*m[0, 2])
  544. T2 := math.atan2(S2, m[0, 0])
  545. S1 := math.sin(T1)
  546. C1 := math.cos(T1)
  547. T3 := math.atan2(C1*m[2, 1] - S1*m[1, 1], C1*m[2, 2] - S1*m[1, 2])
  548. t1 = T1
  549. t2 = T2
  550. t3 = T3
  551. return
  552. }
  553. euler_angles_xyx_from_matrix3_f16 :: proc(m: Matrix3f16) -> (t1, t2, t3: f16) {
  554. T1 := math.atan2(m[1, 0], -m[2, 0])
  555. S2 := math.sqrt(m[0, 1]*m[0, 1] + m[0, 2]*m[0, 2])
  556. T2 := math.atan2(S2, m[0, 0])
  557. S1 := math.sin(T1)
  558. C1 := math.cos(T1)
  559. T3 := math.atan2(-C1*m[1, 2] - S1*m[2, 2], C1*m[1, 1] + S1*m[2, 1])
  560. t1 = T1
  561. t2 = T2
  562. t3 = T3
  563. return
  564. }
  565. euler_angles_yxy_from_matrix3_f16 :: proc(m: Matrix3f16) -> (t1, t2, t3: f16) {
  566. T1 := math.atan2(m[0, 1], m[2, 1])
  567. S2 := math.sqrt(m[1, 0]*m[1, 0] + m[1, 2]*m[1, 2])
  568. T2 := math.atan2(S2, m[1, 1])
  569. S1 := math.sin(T1)
  570. C1 := math.cos(T1)
  571. T3 := math.atan2(C1*m[0, 2] - S1*m[2, 2], C1*m[0, 0] - S1*m[2, 0])
  572. t1 = T1
  573. t2 = T2
  574. t3 = T3
  575. return
  576. }
  577. euler_angles_yzy_from_matrix3_f16 :: proc(m: Matrix3f16) -> (t1, t2, t3: f16) {
  578. T1 := math.atan2(m[2, 1], -m[0, 1])
  579. S2 := math.sqrt(m[1, 0]*m[1, 0] + m[1, 2]*m[1, 2])
  580. T2 := math.atan2(S2, m[1, 1])
  581. S1 := math.sin(T1)
  582. C1 := math.cos(T1)
  583. T3 := math.atan2(-S1*m[0, 0] - C1*m[2, 0], S1*m[0, 2] + C1*m[2, 2])
  584. t1 = T1
  585. t2 = T2
  586. t3 = T3
  587. return
  588. }
  589. euler_angles_zyz_from_matrix3_f16 :: proc(m: Matrix3f16) -> (t1, t2, t3: f16) {
  590. T1 := math.atan2(m[1, 2], m[0, 2])
  591. S2 := math.sqrt(m[2, 0]*m[2, 0] + m[2, 1]*m[2, 1])
  592. T2 := math.atan2(S2, m[2, 2])
  593. S1 := math.sin(T1)
  594. C1 := math.cos(T1)
  595. T3 := math.atan2(C1*m[1, 0] - S1*m[0, 0], C1*m[1, 1] - S1*m[0, 1])
  596. t1 = T1
  597. t2 = T2
  598. t3 = T3
  599. return
  600. }
  601. euler_angles_zxz_from_matrix3_f16 :: proc(m: Matrix3f16) -> (t1, t2, t3: f16) {
  602. T1 := math.atan2(m[0, 2], -m[1, 2])
  603. S2 := math.sqrt(m[2, 0]*m[2, 0] + m[2, 1]*m[2, 1])
  604. T2 := math.atan2(S2, m[2, 2])
  605. S1 := math.sin(T1)
  606. C1 := math.cos(T1)
  607. T3 := math.atan2(-C1*m[0, 1] - S1*m[1, 1], C1*m[0, 0] + S1*m[1, 0])
  608. t1 = T1
  609. t2 = T2
  610. t3 = T3
  611. return
  612. }
  613. euler_angles_xzy_from_matrix3_f16 :: proc(m: Matrix3f16) -> (t1, t2, t3: f16) {
  614. T1 := math.atan2(m[2, 1], m[1, 1])
  615. C2 := math.sqrt(m[0, 0]*m[0, 0] + m[0, 2]*m[0, 2])
  616. T2 := math.atan2(-m[0, 1], C2)
  617. S1 := math.sin(T1)
  618. C1 := math.cos(T1)
  619. T3 := math.atan2(S1*m[1, 0] - C1*m[2, 0], C1*m[2, 2] - S1*m[1, 2])
  620. t1 = T1
  621. t2 = T2
  622. t3 = T3
  623. return
  624. }
  625. euler_angles_yzx_from_matrix3_f16 :: proc(m: Matrix3f16) -> (t1, t2, t3: f16) {
  626. T1 := math.atan2(-m[2, 0], m[0, 0])
  627. C2 := math.sqrt(m[1, 1]*m[1, 1] + m[1, 2]*m[1, 2])
  628. T2 := math.atan2(m[1, 0], C2)
  629. S1 := math.sin(T1)
  630. C1 := math.cos(T1)
  631. T3 := math.atan2(S1*m[0, 1] + C1*m[2, 1], S1*m[0, 2] + C1*m[2, 2])
  632. t1 = T1
  633. t2 = T2
  634. t3 = T3
  635. return
  636. }
  637. euler_angles_zyx_from_matrix3_f16 :: proc(m: Matrix3f16) -> (t1, t2, t3: f16) {
  638. T1 := math.atan2(m[1, 0], m[0, 0])
  639. C2 := math.sqrt(m[2, 1]*m[2, 1] + m[2, 2]*m[2, 2])
  640. T2 := math.atan2(-m[2, 0], C2)
  641. S1 := math.sin(T1)
  642. C1 := math.cos(T1)
  643. T3 := math.atan2(S1*m[0, 2] - C1*m[1, 2], C1*m[1, 1] - S1*m[0, 1])
  644. t1 = T1
  645. t2 = T2
  646. t3 = T3
  647. return
  648. }
  649. euler_angles_zxy_from_matrix3_f16 :: proc(m: Matrix3f16) -> (t1, t2, t3: f16) {
  650. T1 := math.atan2(-m[0, 1], m[1, 1])
  651. C2 := math.sqrt(m[2, 0]*m[2, 0] + m[2, 2]*m[2, 2])
  652. T2 := math.atan2(m[2, 1], C2)
  653. S1 := math.sin(T1)
  654. C1 := math.cos(T1)
  655. T3 := math.atan2(C1*m[0, 2] + S1*m[1, 2], C1*m[0, 0] + S1*m[1, 0])
  656. t1 = T1
  657. t2 = T2
  658. t3 = T3
  659. return
  660. }
  661. // Matrix4
  662. matrix4_from_euler_angle_x_f16 :: proc(angle_x: f16) -> (m: Matrix4f16) {
  663. cos_x, sin_x := math.cos(angle_x), math.sin(angle_x)
  664. m[0, 0] = 1
  665. m[1, 1] = +cos_x
  666. m[1, 2] = +sin_x
  667. m[2, 1] = -sin_x
  668. m[2, 2] = +cos_x
  669. m[3, 3] = 1
  670. return
  671. }
  672. matrix4_from_euler_angle_y_f16 :: proc(angle_y: f16) -> (m: Matrix4f16) {
  673. cos_y, sin_y := math.cos(angle_y), math.sin(angle_y)
  674. m[0, 0] = +cos_y
  675. m[0, 2] = -sin_y
  676. m[1, 1] = 1
  677. m[2, 0] = +sin_y
  678. m[2, 2] = +cos_y
  679. m[3, 3] = 1
  680. return
  681. }
  682. matrix4_from_euler_angle_z_f16 :: proc(angle_z: f16) -> (m: Matrix4f16) {
  683. cos_z, sin_z := math.cos(angle_z), math.sin(angle_z)
  684. m[0, 0] = +cos_z
  685. m[0, 1] = +sin_z
  686. m[1, 1] = +cos_z
  687. m[1, 0] = -sin_z
  688. m[2, 2] = 1
  689. m[3, 3] = 1
  690. return
  691. }
  692. matrix4_from_derived_euler_angle_x_f16 :: proc(angle_x: f16, angular_velocity_x: f16) -> (m: Matrix4f16) {
  693. cos_x := math.cos(angle_x) * angular_velocity_x
  694. sin_x := math.sin(angle_x) * angular_velocity_x
  695. m[0, 0] = 1
  696. m[1, 1] = +cos_x
  697. m[1, 2] = +sin_x
  698. m[2, 1] = -sin_x
  699. m[2, 2] = +cos_x
  700. m[3, 3] = 1
  701. return
  702. }
  703. matrix4_from_derived_euler_angle_y_f16 :: proc(angle_y: f16, angular_velocity_y: f16) -> (m: Matrix4f16) {
  704. cos_y := math.cos(angle_y) * angular_velocity_y
  705. sin_y := math.sin(angle_y) * angular_velocity_y
  706. m[0, 0] = +cos_y
  707. m[0, 2] = -sin_y
  708. m[1, 1] = 1
  709. m[2, 0] = +sin_y
  710. m[2, 2] = +cos_y
  711. m[3, 3] = 1
  712. return
  713. }
  714. matrix4_from_derived_euler_angle_z_f16 :: proc(angle_z: f16, angular_velocity_z: f16) -> (m: Matrix4f16) {
  715. cos_z := math.cos(angle_z) * angular_velocity_z
  716. sin_z := math.sin(angle_z) * angular_velocity_z
  717. m[0, 0] = +cos_z
  718. m[0, 1] = +sin_z
  719. m[1, 1] = +cos_z
  720. m[1, 0] = -sin_z
  721. m[2, 2] = 1
  722. m[3, 3] = 1
  723. return
  724. }
  725. matrix4_from_euler_angles_xy_f16 :: proc(angle_x, angle_y: f16) -> (m: Matrix4f16) {
  726. cos_x, sin_x := math.cos(angle_x), math.sin(angle_x)
  727. cos_y, sin_y := math.cos(angle_y), math.sin(angle_y)
  728. m[0, 0] = cos_y
  729. m[0, 1] = -sin_x * - sin_y
  730. m[0, 2] = -cos_x * - sin_y
  731. m[1, 1] = cos_x
  732. m[1, 2] = sin_x
  733. m[2, 0] = sin_y
  734. m[2, 1] = -sin_x * cos_y
  735. m[2, 2] = cos_x * cos_y
  736. m[3, 3] = 1
  737. return
  738. }
  739. matrix4_from_euler_angles_yx_f16 :: proc(angle_y, angle_x: f16) -> (m: Matrix4f16) {
  740. cos_x, sin_x := math.cos(angle_x), math.sin(angle_x)
  741. cos_y, sin_y := math.cos(angle_y), math.sin(angle_y)
  742. m[0, 0] = cos_y
  743. m[0, 2] = -sin_y
  744. m[1, 0] = sin_y*sin_x
  745. m[1, 1] = cos_x
  746. m[1, 2] = cos_y*sin_x
  747. m[2, 0] = sin_y*cos_x
  748. m[2, 1] = -sin_x
  749. m[2, 2] = cos_y*cos_x
  750. m[3, 3] = 1
  751. return
  752. }
  753. matrix4_from_euler_angles_xz_f16 :: proc(angle_x, angle_z: f16) -> (m: Matrix4f16) {
  754. return mul(matrix4_from_euler_angle_x(angle_x), matrix4_from_euler_angle_z(angle_z))
  755. }
  756. matrix4_from_euler_angles_zx_f16 :: proc(angle_z, angle_x: f16) -> (m: Matrix4f16) {
  757. return mul(matrix4_from_euler_angle_z(angle_z), matrix4_from_euler_angle_x(angle_x))
  758. }
  759. matrix4_from_euler_angles_yz_f16 :: proc(angle_y, angle_z: f16) -> (m: Matrix4f16) {
  760. return mul(matrix4_from_euler_angle_y(angle_y), matrix4_from_euler_angle_z(angle_z))
  761. }
  762. matrix4_from_euler_angles_zy_f16 :: proc(angle_z, angle_y: f16) -> (m: Matrix4f16) {
  763. return mul(matrix4_from_euler_angle_z(angle_z), matrix4_from_euler_angle_y(angle_y))
  764. }
  765. matrix4_from_euler_angles_xyz_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix4f16) {
  766. c1 := math.cos(-t1)
  767. c2 := math.cos(-t2)
  768. c3 := math.cos(-t3)
  769. s1 := math.sin(-t1)
  770. s2 := math.sin(-t2)
  771. s3 := math.sin(-t3)
  772. m[0, 0] = c2 * c3
  773. m[1, 0] =-c1 * s3 + s1 * s2 * c3
  774. m[2, 0] = s1 * s3 + c1 * s2 * c3
  775. m[3, 0] = 0
  776. m[0, 1] = c2 * s3
  777. m[1, 1] = c1 * c3 + s1 * s2 * s3
  778. m[2, 1] =-s1 * c3 + c1 * s2 * s3
  779. m[3, 1] = 0
  780. m[0, 2] =-s2
  781. m[1, 2] = s1 * c2
  782. m[2, 2] = c1 * c2
  783. m[3, 2] = 0
  784. m[0, 3] = 0
  785. m[1, 3] = 0
  786. m[2, 3] = 0
  787. m[3, 3] = 1
  788. return
  789. }
  790. matrix4_from_euler_angles_yxz_f16 :: proc(yaw, pitch, roll: f16) -> (m: Matrix4f16) {
  791. ch := math.cos(yaw)
  792. sh := math.sin(yaw)
  793. cp := math.cos(pitch)
  794. sp := math.sin(pitch)
  795. cb := math.cos(roll)
  796. sb := math.sin(roll)
  797. m[0, 0] = ch * cb + sh * sp * sb
  798. m[1, 0] = sb * cp
  799. m[2, 0] = -sh * cb + ch * sp * sb
  800. m[3, 0] = 0
  801. m[0, 1] = -ch * sb + sh * sp * cb
  802. m[1, 1] = cb * cp
  803. m[2, 1] = sb * sh + ch * sp * cb
  804. m[3, 1] = 0
  805. m[0, 2] = sh * cp
  806. m[1, 2] = -sp
  807. m[2, 2] = ch * cp
  808. m[3, 2] = 0
  809. m[0, 3] = 0
  810. m[1, 3] = 0
  811. m[2, 3] = 0
  812. m[3, 3] = 1
  813. return
  814. }
  815. matrix4_from_euler_angles_xzx_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix4f16) {
  816. c1 := math.cos(t1)
  817. s1 := math.sin(t1)
  818. c2 := math.cos(t2)
  819. s2 := math.sin(t2)
  820. c3 := math.cos(t3)
  821. s3 := math.sin(t3)
  822. m[0, 0] = c2
  823. m[1, 0] = c1 * s2
  824. m[2, 0] = s1 * s2
  825. m[3, 0] = 0
  826. m[0, 1] =-c3 * s2
  827. m[1, 1] = c1 * c2 * c3 - s1 * s3
  828. m[2, 1] = c1 * s3 + c2 * c3 * s1
  829. m[3, 1] = 0
  830. m[0, 2] = s2 * s3
  831. m[1, 2] =-c3 * s1 - c1 * c2 * s3
  832. m[2, 2] = c1 * c3 - c2 * s1 * s3
  833. m[3, 2] = 0
  834. m[0, 3] = 0
  835. m[1, 3] = 0
  836. m[2, 3] = 0
  837. m[3, 3] = 1
  838. return
  839. }
  840. matrix4_from_euler_angles_xyx_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix4f16) {
  841. c1 := math.cos(t1)
  842. s1 := math.sin(t1)
  843. c2 := math.cos(t2)
  844. s2 := math.sin(t2)
  845. c3 := math.cos(t3)
  846. s3 := math.sin(t3)
  847. m[0, 0] = c2
  848. m[1, 0] = s1 * s2
  849. m[2, 0] =-c1 * s2
  850. m[3, 0] = 0
  851. m[0, 1] = s2 * s3
  852. m[1, 1] = c1 * c3 - c2 * s1 * s3
  853. m[2, 1] = c3 * s1 + c1 * c2 * s3
  854. m[3, 1] = 0
  855. m[0, 2] = c3 * s2
  856. m[1, 2] =-c1 * s3 - c2 * c3 * s1
  857. m[2, 2] = c1 * c2 * c3 - s1 * s3
  858. m[3, 2] = 0
  859. m[0, 3] = 0
  860. m[1, 3] = 0
  861. m[2, 3] = 0
  862. m[3, 3] = 1
  863. return
  864. }
  865. matrix4_from_euler_angles_yxy_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix4f16) {
  866. c1 := math.cos(t1)
  867. s1 := math.sin(t1)
  868. c2 := math.cos(t2)
  869. s2 := math.sin(t2)
  870. c3 := math.cos(t3)
  871. s3 := math.sin(t3)
  872. m[0, 0] = c1 * c3 - c2 * s1 * s3
  873. m[1, 0] = s2* s3
  874. m[2, 0] =-c3 * s1 - c1 * c2 * s3
  875. m[3, 0] = 0
  876. m[0, 1] = s1 * s2
  877. m[1, 1] = c2
  878. m[2, 1] = c1 * s2
  879. m[3, 1] = 0
  880. m[0, 2] = c1 * s3 + c2 * c3 * s1
  881. m[1, 2] =-c3 * s2
  882. m[2, 2] = c1 * c2 * c3 - s1 * s3
  883. m[3, 2] = 0
  884. m[0, 3] = 0
  885. m[1, 3] = 0
  886. m[2, 3] = 0
  887. m[3, 3] = 1
  888. return
  889. }
  890. matrix4_from_euler_angles_yzy_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix4f16) {
  891. c1 := math.cos(t1)
  892. s1 := math.sin(t1)
  893. c2 := math.cos(t2)
  894. s2 := math.sin(t2)
  895. c3 := math.cos(t3)
  896. s3 := math.sin(t3)
  897. m[0, 0] = c1 * c2 * c3 - s1 * s3
  898. m[1, 0] = c3 * s2
  899. m[2, 0] =-c1 * s3 - c2 * c3 * s1
  900. m[3, 0] = 0
  901. m[0, 1] =-c1 * s2
  902. m[1, 1] = c2
  903. m[2, 1] = s1 * s2
  904. m[3, 1] = 0
  905. m[0, 2] = c3 * s1 + c1 * c2 * s3
  906. m[1, 2] = s2 * s3
  907. m[2, 2] = c1 * c3 - c2 * s1 * s3
  908. m[3, 2] = 0
  909. m[0, 3] = 0
  910. m[1, 3] = 0
  911. m[2, 3] = 0
  912. m[3, 3] = 1
  913. return
  914. }
  915. matrix4_from_euler_angles_zyz_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix4f16) {
  916. c1 := math.cos(t1)
  917. s1 := math.sin(t1)
  918. c2 := math.cos(t2)
  919. s2 := math.sin(t2)
  920. c3 := math.cos(t3)
  921. s3 := math.sin(t3)
  922. m[0, 0] = c1 * c2 * c3 - s1 * s3
  923. m[1, 0] = c1 * s3 + c2 * c3 * s1
  924. m[2, 0] =-c3 * s2
  925. m[3, 0] = 0
  926. m[0, 1] =-c3 * s1 - c1 * c2 * s3
  927. m[1, 1] = c1 * c3 - c2 * s1 * s3
  928. m[2, 1] = s2 * s3
  929. m[3, 1] = 0
  930. m[0, 2] = c1 * s2
  931. m[1, 2] = s1 * s2
  932. m[2, 2] = c2
  933. m[3, 2] = 0
  934. m[0, 3] = 0
  935. m[1, 3] = 0
  936. m[2, 3] = 0
  937. m[3, 3] = 1
  938. return
  939. }
  940. matrix4_from_euler_angles_zxz_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix4f16) {
  941. c1 := math.cos(t1)
  942. s1 := math.sin(t1)
  943. c2 := math.cos(t2)
  944. s2 := math.sin(t2)
  945. c3 := math.cos(t3)
  946. s3 := math.sin(t3)
  947. m[0, 0] = c1 * c3 - c2 * s1 * s3
  948. m[1, 0] = c3 * s1 + c1 * c2 * s3
  949. m[2, 0] = s2 *s3
  950. m[3, 0] = 0
  951. m[0, 1] =-c1 * s3 - c2 * c3 * s1
  952. m[1, 1] = c1 * c2 * c3 - s1 * s3
  953. m[2, 1] = c3 * s2
  954. m[3, 1] = 0
  955. m[0, 2] = s1 * s2
  956. m[1, 2] =-c1 * s2
  957. m[2, 2] = c2
  958. m[3, 2] = 0
  959. m[0, 3] = 0
  960. m[1, 3] = 0
  961. m[2, 3] = 0
  962. m[3, 3] = 1
  963. return
  964. }
  965. matrix4_from_euler_angles_xzy_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix4f16) {
  966. c1 := math.cos(t1)
  967. s1 := math.sin(t1)
  968. c2 := math.cos(t2)
  969. s2 := math.sin(t2)
  970. c3 := math.cos(t3)
  971. s3 := math.sin(t3)
  972. m[0, 0] = c2 * c3
  973. m[1, 0] = s1 * s3 + c1 * c3 * s2
  974. m[2, 0] = c3 * s1 * s2 - c1 * s3
  975. m[3, 0] = 0
  976. m[0, 1] =-s2
  977. m[1, 1] = c1 * c2
  978. m[2, 1] = c2 * s1
  979. m[3, 1] = 0
  980. m[0, 2] = c2 * s3
  981. m[1, 2] = c1 * s2 * s3 - c3 * s1
  982. m[2, 2] = c1 * c3 + s1 * s2 *s3
  983. m[3, 2] = 0
  984. m[0, 3] = 0
  985. m[1, 3] = 0
  986. m[2, 3] = 0
  987. m[3, 3] = 1
  988. return
  989. }
  990. matrix4_from_euler_angles_yzx_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix4f16) {
  991. c1 := math.cos(t1)
  992. s1 := math.sin(t1)
  993. c2 := math.cos(t2)
  994. s2 := math.sin(t2)
  995. c3 := math.cos(t3)
  996. s3 := math.sin(t3)
  997. m[0, 0] = c1 * c2
  998. m[1, 0] = s2
  999. m[2, 0] =-c2 * s1
  1000. m[3, 0] = 0
  1001. m[0, 1] = s1 * s3 - c1 * c3 * s2
  1002. m[1, 1] = c2 * c3
  1003. m[2, 1] = c1 * s3 + c3 * s1 * s2
  1004. m[3, 1] = 0
  1005. m[0, 2] = c3 * s1 + c1 * s2 * s3
  1006. m[1, 2] =-c2 * s3
  1007. m[2, 2] = c1 * c3 - s1 * s2 * s3
  1008. m[3, 2] = 0
  1009. m[0, 3] = 0
  1010. m[1, 3] = 0
  1011. m[2, 3] = 0
  1012. m[3, 3] = 1
  1013. return
  1014. }
  1015. matrix4_from_euler_angles_zyx_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix4f16) {
  1016. c1 := math.cos(t1)
  1017. s1 := math.sin(t1)
  1018. c2 := math.cos(t2)
  1019. s2 := math.sin(t2)
  1020. c3 := math.cos(t3)
  1021. s3 := math.sin(t3)
  1022. m[0, 0] = c1 * c2
  1023. m[1, 0] = c2 * s1
  1024. m[2, 0] =-s2
  1025. m[3, 0] = 0
  1026. m[0, 1] = c1 * s2 * s3 - c3 * s1
  1027. m[1, 1] = c1 * c3 + s1 * s2 * s3
  1028. m[2, 1] = c2 * s3
  1029. m[3, 1] = 0
  1030. m[0, 2] = s1 * s3 + c1 * c3 * s2
  1031. m[1, 2] = c3 * s1 * s2 - c1 * s3
  1032. m[2, 2] = c2 * c3
  1033. m[3, 2] = 0
  1034. m[0, 3] = 0
  1035. m[1, 3] = 0
  1036. m[2, 3] = 0
  1037. m[3, 3] = 1
  1038. return
  1039. }
  1040. matrix4_from_euler_angles_zxy_f16 :: proc(t1, t2, t3: f16) -> (m: Matrix4f16) {
  1041. c1 := math.cos(t1)
  1042. s1 := math.sin(t1)
  1043. c2 := math.cos(t2)
  1044. s2 := math.sin(t2)
  1045. c3 := math.cos(t3)
  1046. s3 := math.sin(t3)
  1047. m[0, 0] = c1 * c3 - s1 * s2 * s3
  1048. m[1, 0] = c3 * s1 + c1 * s2 * s3
  1049. m[2, 0] =-c2 * s3
  1050. m[3, 0] = 0
  1051. m[0, 1] =-c2 * s1
  1052. m[1, 1] = c1 * c2
  1053. m[2, 1] = s2
  1054. m[3, 1] = 0
  1055. m[0, 2] = c1 * s3 + c3 * s1 * s2
  1056. m[1, 2] = s1 * s3 - c1 * c3 * s2
  1057. m[2, 2] = c2 * c3
  1058. m[3, 2] = 0
  1059. m[0, 3] = 0
  1060. m[1, 3] = 0
  1061. m[2, 3] = 0
  1062. m[3, 3] = 1
  1063. return
  1064. }
  1065. matrix4_from_yaw_pitch_roll_f16 :: proc(yaw, pitch, roll: f16) -> (m: Matrix4f16) {
  1066. ch := math.cos(yaw)
  1067. sh := math.sin(yaw)
  1068. cp := math.cos(pitch)
  1069. sp := math.sin(pitch)
  1070. cb := math.cos(roll)
  1071. sb := math.sin(roll)
  1072. m[0, 0] = ch * cb + sh * sp * sb
  1073. m[1, 0] = sb * cp
  1074. m[2, 0] = -sh * cb + ch * sp * sb
  1075. m[3, 0] = 0
  1076. m[0, 1] = -ch * sb + sh * sp * cb
  1077. m[1, 1] = cb * cp
  1078. m[2, 1] = sb * sh + ch * sp * cb
  1079. m[3, 1] = 0
  1080. m[0, 2] = sh * cp
  1081. m[1, 2] = -sp
  1082. m[2, 2] = ch * cp
  1083. m[3, 2] = 0
  1084. m[0, 3] = 0
  1085. m[1, 3] = 0
  1086. m[2, 3] = 0
  1087. m[3, 3] = 1
  1088. return m
  1089. }
  1090. euler_angles_xyz_from_matrix4_f16 :: proc(m: Matrix4f16) -> (t1, t2, t3: f16) {
  1091. T1 := math.atan2(m[1, 2], m[2, 2])
  1092. C2 := math.sqrt(m[0, 0]*m[0, 0] + m[0, 1]*m[0, 1])
  1093. T2 := math.atan2(-m[0, 2], C2)
  1094. S1 := math.sin(T1)
  1095. C1 := math.cos(T1)
  1096. T3 := math.atan2(S1*m[2, 0] - C1*m[1, 0], C1*m[1, 1] - S1*m[2, 1])
  1097. t1 = -T1
  1098. t2 = -T2
  1099. t3 = -T3
  1100. return
  1101. }
  1102. euler_angles_yxz_from_matrix4_f16 :: proc(m: Matrix4f16) -> (t1, t2, t3: f16) {
  1103. T1 := math.atan2(m[0, 2], m[2, 2])
  1104. C2 := math.sqrt(m[1, 0]*m[1, 0] + m[1, 1]*m[1, 1])
  1105. T2 := math.atan2(-m[1, 2], C2)
  1106. S1 := math.sin(T1)
  1107. C1 := math.cos(T1)
  1108. T3 := math.atan2(S1*m[2, 1] - C1*m[0, 1], C1*m[0, 0] - S1*m[2, 0])
  1109. t1 = T1
  1110. t2 = T2
  1111. t3 = T3
  1112. return
  1113. }
  1114. euler_angles_xzx_from_matrix4_f16 :: proc(m: Matrix4f16) -> (t1, t2, t3: f16) {
  1115. T1 := math.atan2(m[2, 0], m[1, 0])
  1116. S2 := math.sqrt(m[0, 1]*m[0, 1] + m[0, 2]*m[0, 2])
  1117. T2 := math.atan2(S2, m[0, 0])
  1118. S1 := math.sin(T1)
  1119. C1 := math.cos(T1)
  1120. T3 := math.atan2(C1*m[2, 1] - S1*m[1, 1], C1*m[2, 2] - S1*m[1, 2])
  1121. t1 = T1
  1122. t2 = T2
  1123. t3 = T3
  1124. return
  1125. }
  1126. euler_angles_xyx_from_matrix4_f16 :: proc(m: Matrix4f16) -> (t1, t2, t3: f16) {
  1127. T1 := math.atan2(m[1, 0], -m[2, 0])
  1128. S2 := math.sqrt(m[0, 1]*m[0, 1] + m[0, 2]*m[0, 2])
  1129. T2 := math.atan2(S2, m[0, 0])
  1130. S1 := math.sin(T1)
  1131. C1 := math.cos(T1)
  1132. T3 := math.atan2(-C1*m[1, 2] - S1*m[2, 2], C1*m[1, 1] + S1*m[2, 1])
  1133. t1 = T1
  1134. t2 = T2
  1135. t3 = T3
  1136. return
  1137. }
  1138. euler_angles_yxy_from_matrix4_f16 :: proc(m: Matrix4f16) -> (t1, t2, t3: f16) {
  1139. T1 := math.atan2(m[0, 1], m[2, 1])
  1140. S2 := math.sqrt(m[1, 0]*m[1, 0] + m[1, 2]*m[1, 2])
  1141. T2 := math.atan2(S2, m[1, 1])
  1142. S1 := math.sin(T1)
  1143. C1 := math.cos(T1)
  1144. T3 := math.atan2(C1*m[0, 2] - S1*m[2, 2], C1*m[0, 0] - S1*m[2, 0])
  1145. t1 = T1
  1146. t2 = T2
  1147. t3 = T3
  1148. return
  1149. }
  1150. euler_angles_yzy_from_matrix4_f16 :: proc(m: Matrix4f16) -> (t1, t2, t3: f16) {
  1151. T1 := math.atan2(m[2, 1], -m[0, 1])
  1152. S2 := math.sqrt(m[1, 0]*m[1, 0] + m[1, 2]*m[1, 2])
  1153. T2 := math.atan2(S2, m[1, 1])
  1154. S1 := math.sin(T1)
  1155. C1 := math.cos(T1)
  1156. T3 := math.atan2(-S1*m[0, 0] - C1*m[2, 0], S1*m[0, 2] + C1*m[2, 2])
  1157. t1 = T1
  1158. t2 = T2
  1159. t3 = T3
  1160. return
  1161. }
  1162. euler_angles_zyz_from_matrix4_f16 :: proc(m: Matrix4f16) -> (t1, t2, t3: f16) {
  1163. T1 := math.atan2(m[1, 2], m[0, 2])
  1164. S2 := math.sqrt(m[2, 0]*m[2, 0] + m[2, 1]*m[2, 1])
  1165. T2 := math.atan2(S2, m[2, 2])
  1166. S1 := math.sin(T1)
  1167. C1 := math.cos(T1)
  1168. T3 := math.atan2(C1*m[1, 0] - S1*m[0, 0], C1*m[1, 1] - S1*m[0, 1])
  1169. t1 = T1
  1170. t2 = T2
  1171. t3 = T3
  1172. return
  1173. }
  1174. euler_angles_zxz_from_matrix4_f16 :: proc(m: Matrix4f16) -> (t1, t2, t3: f16) {
  1175. T1 := math.atan2(m[0, 2], -m[1, 2])
  1176. S2 := math.sqrt(m[2, 0]*m[2, 0] + m[2, 1]*m[2, 1])
  1177. T2 := math.atan2(S2, m[2, 2])
  1178. S1 := math.sin(T1)
  1179. C1 := math.cos(T1)
  1180. T3 := math.atan2(-C1*m[0, 1] - S1*m[1, 1], C1*m[0, 0] + S1*m[1, 0])
  1181. t1 = T1
  1182. t2 = T2
  1183. t3 = T3
  1184. return
  1185. }
  1186. euler_angles_xzy_from_matrix4_f16 :: proc(m: Matrix4f16) -> (t1, t2, t3: f16) {
  1187. T1 := math.atan2(m[2, 1], m[1, 1])
  1188. C2 := math.sqrt(m[0, 0]*m[0, 0] + m[0, 2]*m[0, 2])
  1189. T2 := math.atan2(-m[0, 1], C2)
  1190. S1 := math.sin(T1)
  1191. C1 := math.cos(T1)
  1192. T3 := math.atan2(S1*m[1, 0] - C1*m[2, 0], C1*m[2, 2] - S1*m[1, 2])
  1193. t1 = T1
  1194. t2 = T2
  1195. t3 = T3
  1196. return
  1197. }
  1198. euler_angles_yzx_from_matrix4_f16 :: proc(m: Matrix4f16) -> (t1, t2, t3: f16) {
  1199. T1 := math.atan2(-m[2, 0], m[0, 0])
  1200. C2 := math.sqrt(m[1, 1]*m[1, 1] + m[1, 2]*m[1, 2])
  1201. T2 := math.atan2(m[1, 0], C2)
  1202. S1 := math.sin(T1)
  1203. C1 := math.cos(T1)
  1204. T3 := math.atan2(S1*m[0, 1] + C1*m[2, 1], S1*m[0, 2] + C1*m[2, 2])
  1205. t1 = T1
  1206. t2 = T2
  1207. t3 = T3
  1208. return
  1209. }
  1210. euler_angles_zyx_from_matrix4_f16 :: proc(m: Matrix4f16) -> (t1, t2, t3: f16) {
  1211. T1 := math.atan2(m[1, 0], m[0, 0])
  1212. C2 := math.sqrt(m[2, 1]*m[2, 1] + m[2, 2]*m[2, 2])
  1213. T2 := math.atan2(-m[2, 0], C2)
  1214. S1 := math.sin(T1)
  1215. C1 := math.cos(T1)
  1216. T3 := math.atan2(S1*m[0, 2] - C1*m[1, 2], C1*m[1, 1] - S1*m[0, 1])
  1217. t1 = T1
  1218. t2 = T2
  1219. t3 = T3
  1220. return
  1221. }
  1222. euler_angles_zxy_from_matrix4_f16 :: proc(m: Matrix4f16) -> (t1, t2, t3: f16) {
  1223. T1 := math.atan2(-m[0, 1], m[1, 1])
  1224. C2 := math.sqrt(m[2, 0]*m[2, 0] + m[2, 2]*m[2, 2])
  1225. T2 := math.atan2(m[2, 1], C2)
  1226. S1 := math.sin(T1)
  1227. C1 := math.cos(T1)
  1228. T3 := math.atan2(C1*m[0, 2] + S1*m[1, 2], C1*m[0, 0] + S1*m[1, 0])
  1229. t1 = T1
  1230. t2 = T2
  1231. t3 = T3
  1232. return
  1233. }