Mat4Binds.cpp 9.6 KB

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