Mat4Binds.cpp 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. #include "Mat4.h"
  2. #include "Vec3.h"
  3. #include "LuaStack.h"
  4. #include "LuaEnvironment.h"
  5. #include "OS.h"
  6. namespace crown
  7. {
  8. extern "C"
  9. {
  10. int32_t mat4(lua_State* L)
  11. {
  12. LuaStack stack(L);
  13. float m0 = stack.get_float(1);
  14. float m1 = stack.get_float(2);
  15. float m2 = stack.get_float(3);
  16. float m4 = stack.get_float(4);
  17. float m5 = stack.get_float(5);
  18. float m6 = stack.get_float(6);
  19. float m8 = stack.get_float(7);
  20. float m9 = stack.get_float(8);
  21. float m10 = stack.get_float(9);
  22. mat4_buffer[mat4_used].m[0] = m0;
  23. mat4_buffer[mat4_used].m[1] = m1;
  24. mat4_buffer[mat4_used].m[2] = m2;
  25. mat4_buffer[mat4_used].m[4] = m4;
  26. mat4_buffer[mat4_used].m[5] = m5;
  27. mat4_buffer[mat4_used].m[6] = m6;
  28. mat4_buffer[mat4_used].m[8] = m8;
  29. mat4_buffer[mat4_used].m[9] = m9;
  30. mat4_buffer[mat4_used].m[10] = m10;
  31. stack.push_mat4(&mat4_buffer[mat4_used]);
  32. mat4_used++;
  33. return 1;
  34. }
  35. int32_t mat4_add(lua_State* L)
  36. {
  37. LuaStack stack(L);
  38. Mat4* a = stack.get_mat4(1);
  39. Mat4* b = stack.get_mat4(2);
  40. *a += *b;
  41. stack.push_mat4(a);
  42. return 1;
  43. }
  44. int32_t mat4_subtract(lua_State* L)
  45. {
  46. LuaStack stack(L);
  47. Mat4* a = (Mat4*)stack.get_mat4(1);
  48. Mat4* b = (Mat4*)stack.get_mat4(2);
  49. *a -= *b;
  50. stack.push_mat4(a);
  51. return 1;
  52. }
  53. int32_t mat4_multiply(lua_State* L)
  54. {
  55. LuaStack stack(L);
  56. Mat4* a = stack.get_mat4(1);
  57. Mat4* b = stack.get_mat4(2);
  58. *a *= *b;
  59. stack.push_mat4(a);
  60. return 1;
  61. }
  62. int32_t mat4_multiply_by_scalar(lua_State* L)
  63. {
  64. LuaStack stack(L);
  65. Mat4* a = (Mat4*)stack.get_mat4(1);
  66. float k = stack.get_float(2);
  67. *a *= k;
  68. stack.push_mat4(a);
  69. return 1;
  70. }
  71. int32_t mat4_divide_by_scalar(lua_State* L)
  72. {
  73. LuaStack stack(L);
  74. Mat4* a = (Mat4*)stack.get_mat4(1);
  75. float k = stack.get_float(2);
  76. *a /= k;
  77. stack.push_mat4(a);
  78. return 1;
  79. }
  80. int32_t mat4_build_rotation_x(lua_State* L)
  81. {
  82. LuaStack stack(L);
  83. Mat4* a = (Mat4*)stack.get_mat4(1);
  84. float k = stack.get_float(2);
  85. a->build_rotation_x(k);
  86. return 0;
  87. }
  88. int32_t mat4_build_rotation_y(lua_State* L)
  89. {
  90. LuaStack stack(L);
  91. Mat4* a = stack.get_mat4(1);
  92. float k = stack.get_float(2);
  93. a->build_rotation_y(k);
  94. return 0;
  95. }
  96. int32_t mat4_build_rotation_z(lua_State* L)
  97. {
  98. LuaStack stack(L);
  99. Mat4* a = (Mat4*)stack.get_mat4(1);
  100. float k = stack.get_float(2);
  101. a->build_rotation_z(k);
  102. return 0;
  103. }
  104. int32_t mat4_build_rotation(lua_State* L)
  105. {
  106. LuaStack stack(L);
  107. Mat4* a = (Mat4*)stack.get_mat4(1);
  108. Vec3* d = (Vec3*)stack.get_vec3(2);
  109. float k = stack.get_float(3);
  110. a->build_rotation(*d, k);
  111. return 0;
  112. }
  113. int32_t mat4_build_projection_perspective_rh(lua_State* L)
  114. {
  115. LuaStack stack(L);
  116. Mat4* a = stack.get_mat4(1);
  117. float fovy = stack.get_float(2);
  118. float aspect = stack.get_float(3);
  119. float near = stack.get_float(4);
  120. float far = stack.get_float(5);
  121. a->build_projection_perspective_rh(fovy, aspect, near, far);
  122. return 0;
  123. }
  124. int32_t mat4_build_projection_perspective_lh(lua_State* L)
  125. {
  126. LuaStack stack(L);
  127. Mat4* a = stack.get_mat4(1);
  128. float fovy = stack.get_float(2);
  129. float aspect = stack.get_float(3);
  130. float near = stack.get_float(4);
  131. float far = stack.get_float(5);
  132. a->build_projection_perspective_lh(fovy, aspect, near, far);
  133. return 0;
  134. }
  135. int32_t mat4_build_projection_ortho_rh(lua_State* L)
  136. {
  137. LuaStack stack(L);
  138. Mat4* a = stack.get_mat4(1);
  139. float width = stack.get_float(2);
  140. float height = stack.get_float(3);
  141. float near = stack.get_float(4);
  142. float far = stack.get_float(5);
  143. a->build_projection_ortho_rh(width, height, near, far);
  144. return 0;
  145. }
  146. int32_t mat4_build_projection_ortho_lh(lua_State* L)
  147. {
  148. LuaStack stack(L);
  149. Mat4* a = stack.get_mat4(1);
  150. float width = stack.get_float(2);
  151. float height = stack.get_float(3);
  152. float near = stack.get_float(4);
  153. float far = stack.get_float(5);
  154. a->build_projection_ortho_lh(width, height, near, far);
  155. return 0;
  156. }
  157. int32_t mat4_build_projection_ortho_2d_rh(lua_State* L)
  158. {
  159. LuaStack stack(L);
  160. Mat4* a = stack.get_mat4(1);
  161. float width = stack.get_float(2);
  162. float height = stack.get_float(3);
  163. float near = stack.get_float(4);
  164. float far = stack.get_float(5);
  165. a->build_projection_ortho_2d_rh(width, height, near, far);
  166. return 0;
  167. }
  168. int32_t mat4_build_look_at_rh(lua_State* L)
  169. {
  170. LuaStack stack(L);
  171. Mat4* a = stack.get_mat4(1);
  172. Vec3* pos = stack.get_vec3(2);
  173. Vec3* target = stack.get_vec3(3);
  174. Vec3* up = stack.get_vec3(4);
  175. a->build_look_at_rh(*pos, *target, *up);
  176. return 0;
  177. }
  178. int32_t mat4_build_look_at_lh(lua_State* L)
  179. {
  180. LuaStack stack(L);
  181. Mat4* a = stack.get_mat4(1);
  182. Vec3* pos = stack.get_vec3(2);
  183. Vec3* target = stack.get_vec3(3);
  184. Vec3* up = stack.get_vec3(4);
  185. a->build_look_at_lh(*pos, *target, *up);
  186. return 0;
  187. }
  188. int32_t mat4_build_viewpoint_billboard(lua_State* L)
  189. {
  190. LuaStack stack(L);
  191. Mat4* a = stack.get_mat4(1);
  192. Vec3* pos = stack.get_vec3(2);
  193. Vec3* target = stack.get_vec3(3);
  194. Vec3* up = stack.get_vec3(4);
  195. a->build_viewpoint_billboard(*pos, *target, *up);
  196. return 0;
  197. }
  198. int32_t mat4_build_axis_billboard(lua_State* L)
  199. {
  200. LuaStack stack(L);
  201. Mat4* a = stack.get_mat4(1);
  202. Vec3* pos = stack.get_vec3(2);
  203. Vec3* target = stack.get_vec3(3);
  204. Vec3* up = stack.get_vec3(4);
  205. a->build_axis_billboard(*pos, *target, *up);
  206. return 0;
  207. }
  208. int32_t mat4_transpose(lua_State* L)
  209. {
  210. LuaStack stack(L);
  211. Mat4* a = stack.get_mat4(1);
  212. a->transpose();
  213. stack.push_mat4(a);
  214. return 1;
  215. }
  216. int32_t mat4_determinant(lua_State* L)
  217. {
  218. LuaStack stack(L);
  219. Mat4* a = stack.get_mat4(1);
  220. stack.push_float(a->get_determinant());
  221. return 1;
  222. }
  223. int32_t mat4_invert(lua_State* L)
  224. {
  225. LuaStack stack(L);
  226. Mat4* a = stack.get_mat4(1);
  227. a->invert();
  228. stack.push_mat4(a);
  229. return 1;
  230. }
  231. int32_t mat4_load_identity(lua_State* L)
  232. {
  233. LuaStack stack(L);
  234. Mat4* a = stack.get_mat4(1);
  235. a->load_identity();
  236. return 0;
  237. }
  238. int32_t mat4_get_translation(lua_State* L)
  239. {
  240. LuaStack stack(L);
  241. Mat4* a = stack.get_mat4(1);
  242. stack.push_vec3(&a->get_translation());
  243. return 1;
  244. }
  245. int32_t mat4_set_translation(lua_State* L)
  246. {
  247. LuaStack stack(L);
  248. Mat4* a = stack.get_mat4(1);
  249. Vec3* trans = stack.get_vec3(2);
  250. a->set_translation(*trans);
  251. return 0;
  252. }
  253. int32_t mat4_get_scale(lua_State* L)
  254. {
  255. LuaStack stack(L);
  256. Mat4* a = stack.get_mat4(1);
  257. stack.push_vec3(&a->get_scale());
  258. return 1;
  259. }
  260. int32_t mat4_set_scale(lua_State* L)
  261. {
  262. LuaStack stack(L);
  263. Mat4* a = stack.get_mat4(1);
  264. Vec3* scale = stack.get_vec3(2);
  265. a->set_scale(*scale);
  266. return 0;
  267. }
  268. int32_t mat4_print(lua_State* L)
  269. {
  270. LuaStack stack(L);
  271. Mat4* a = stack.get_mat4(1);
  272. os::printf("|%.1f|%.1f|%.1f|%.1f|\n", a->m[0], a->m[4], a->m[8], a->m[12]);
  273. os::printf("|%.1f|%.1f|%.1f|%.1f|\n", a->m[1], a->m[5], a->m[9], a->m[13]);
  274. os::printf("|%.1f|%.1f|%.1f|%.1f|\n", a->m[2], a->m[6], a->m[10], a->m[14]);
  275. os::printf("|%.1f|%.1f|%.1f|%.1f|\n", a->m[3], a->m[7], a->m[11], a->m[15]);
  276. return 0;
  277. }
  278. } //extern "C"
  279. void load_mat4(LuaEnvironment& env)
  280. {
  281. env.load_module_function("Mat4", "new", mat4);
  282. env.load_module_function("Mat4", "add", mat4_add);
  283. env.load_module_function("Mat4", "sub", mat4_subtract);
  284. env.load_module_function("Mat4", "mul", mat4_multiply);
  285. env.load_module_function("Mat4", "muls", mat4_multiply_by_scalar);
  286. env.load_module_function("Mat4", "divs", mat4_divide_by_scalar);
  287. env.load_module_function("Mat4", "build_rotation_x", mat4_build_rotation_x);
  288. env.load_module_function("Mat4", "build_rotation_y", mat4_build_rotation_y);
  289. env.load_module_function("Mat4", "build_rotation_z", mat4_build_rotation_z);
  290. env.load_module_function("Mat4", "build_rotation", mat4_build_rotation);
  291. env.load_module_function("Mat4", "build_projection_perspective_rh", mat4_build_projection_perspective_rh);
  292. env.load_module_function("Mat4", "build_projection_perspective_lh", mat4_build_projection_perspective_lh);
  293. env.load_module_function("Mat4", "build_projection_ortho_rh", mat4_build_projection_ortho_rh);
  294. env.load_module_function("Mat4", "build_projection_ortho_lh", mat4_build_projection_ortho_lh);
  295. env.load_module_function("Mat4", "build_projection_ortho_2d_rh", mat4_build_projection_ortho_2d_rh);
  296. env.load_module_function("Mat4", "build_look_at_rh", mat4_build_look_at_rh);
  297. env.load_module_function("Mat4", "build_look_at_lh", mat4_build_look_at_rh);
  298. env.load_module_function("Mat4", "build_viewpoint_billboard", mat4_build_viewpoint_billboard);
  299. env.load_module_function("Mat4", "build_axis_billboard", mat4_build_axis_billboard);
  300. env.load_module_function("Mat4", "transpose", mat4_transpose);
  301. env.load_module_function("Mat4", "determinant", mat4_determinant);
  302. env.load_module_function("Mat4", "invert", mat4_invert);
  303. env.load_module_function("Mat4", "load_identity", mat4_load_identity);
  304. env.load_module_function("Mat4", "get_translation", mat4_get_translation);
  305. env.load_module_function("Mat4", "set_translation", mat4_set_translation);
  306. env.load_module_function("Mat4", "get_scale", mat4_get_scale);
  307. env.load_module_function("Mat4", "set_scale", mat4_set_scale);
  308. env.load_module_function("Mat4", "print", mat4_print);
  309. }
  310. } //namespace crown