Vec3Binds.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. #include "Vec3.h"
  2. #include "LuaStack.h"
  3. #include "LuaEnvironment.h"
  4. namespace crown
  5. {
  6. /// Lightweight bind for Vec3
  7. extern "C"
  8. {
  9. const int32_t LUA_VEC3_BUFFER_SIZE = 4096;
  10. Vec3 vec3_buffer[LUA_VEC3_BUFFER_SIZE];
  11. uint32_t vec3_used = 0;
  12. Vec3* next_vec3()
  13. {
  14. return &vec3_buffer[vec3_used++];
  15. }
  16. //------------------------------------------------------------
  17. int32_t vec3(lua_State* L)
  18. {
  19. LuaStack stack(L);
  20. float x = stack.get_float(1);
  21. float y = stack.get_float(2);
  22. float z = stack.get_float(3);
  23. vec3_buffer[vec3_used].x = x;
  24. vec3_buffer[vec3_used].y = y;
  25. vec3_buffer[vec3_used].z = z;
  26. stack.push_lightudata(&vec3_buffer[vec3_used]);
  27. vec3_used++;
  28. return 1;
  29. }
  30. //------------------------------------------------------------
  31. int32_t vec3_values(lua_State* L)
  32. {
  33. LuaStack stack(L);
  34. Vec3* a = (Vec3*)stack.get_lightudata(1);
  35. float x = a->x;
  36. float y = a->y;
  37. float z = a->z;
  38. stack.push_float(x);
  39. stack.push_float(y);
  40. stack.push_float(z);
  41. return 3;
  42. }
  43. //------------------------------------------------------------
  44. int32_t vec3_add(lua_State* L)
  45. {
  46. LuaStack stack(L);
  47. Vec3* a = (Vec3*) stack.get_lightudata(1);
  48. Vec3* b = (Vec3*) stack.get_lightudata(2);
  49. *a += *b;
  50. stack.push_lightudata(a);
  51. return 1;
  52. }
  53. //------------------------------------------------------------
  54. int32_t vec3_subtract(lua_State* L)
  55. {
  56. LuaStack stack(L);
  57. Vec3* a = (Vec3*) stack.get_lightudata(1);
  58. Vec3* b = (Vec3*) stack.get_lightudata(2);
  59. *a -= *b;
  60. stack.push_lightudata(a);
  61. return 1;
  62. }
  63. //------------------------------------------------------------
  64. int32_t vec3_multiply(lua_State* L)
  65. {
  66. LuaStack stack(L);
  67. Vec3* a = (Vec3*) stack.get_lightudata(1);
  68. float b = stack.get_float(2);
  69. *a *= b;
  70. stack.push_lightudata(a);
  71. return 1;
  72. }
  73. //------------------------------------------------------------
  74. int32_t vec3_divide(lua_State* L)
  75. {
  76. LuaStack stack(L);
  77. Vec3* a = (Vec3*) stack.get_lightudata(1);
  78. float b = stack.get_float(2);
  79. *a /= b;
  80. stack.push_lightudata(a);
  81. return 1;
  82. }
  83. //------------------------------------------------------------
  84. int32_t vec3_dot(lua_State* L)
  85. {
  86. LuaStack stack(L);
  87. Vec3* a = (Vec3*) stack.get_lightudata(1);
  88. Vec3* b = (Vec3*) stack.get_lightudata(2);
  89. stack.push_float(a->dot(*b));
  90. return 1;
  91. }
  92. //------------------------------------------------------------
  93. int32_t vec3_cross(lua_State* L)
  94. {
  95. LuaStack stack(L);
  96. Vec3* a = (Vec3*) stack.get_lightudata(1);
  97. Vec3* b = (Vec3*) stack.get_lightudata(2);
  98. /// CHECK CHECK CHECK
  99. *a = a->cross(*b);
  100. stack.push_lightudata(a);
  101. return 1;
  102. }
  103. //------------------------------------------------------------
  104. int32_t vec3_equals(lua_State* L)
  105. {
  106. LuaStack stack(L);
  107. Vec3* a = (Vec3*) stack.get_lightudata(1);
  108. Vec3* b = (Vec3*) stack.get_lightudata(2);
  109. stack.push_bool(*a == *b);
  110. return 1;
  111. }
  112. //------------------------------------------------------------
  113. int32_t vec3_lower(lua_State* L)
  114. {
  115. LuaStack stack(L);
  116. Vec3* a = (Vec3*) stack.get_lightudata(1);
  117. Vec3* b = (Vec3*) stack.get_lightudata(2);
  118. stack.push_bool(*a < *b);
  119. return 1;
  120. }
  121. //------------------------------------------------------------
  122. int32_t vec3_greater(lua_State* L)
  123. {
  124. LuaStack stack(L);
  125. Vec3* a = (Vec3*) stack.get_lightudata(1);
  126. Vec3* b = (Vec3*) stack.get_lightudata(2);
  127. stack.push_bool(*a > *b);
  128. return 1;
  129. }
  130. //------------------------------------------------------------
  131. int32_t vec3_length(lua_State* L)
  132. {
  133. LuaStack stack(L);
  134. Vec3* a = (Vec3*) stack.get_lightudata(1);
  135. stack.push_float(a->length());
  136. return 1;
  137. }
  138. //------------------------------------------------------------
  139. int32_t vec3_squared_length(lua_State* L)
  140. {
  141. LuaStack stack(L);
  142. Vec3* a = (Vec3*) stack.get_lightudata(1);
  143. stack.push_float(a->squared_length());
  144. return 1;
  145. }
  146. //------------------------------------------------------------
  147. int32_t vec3_set_length(lua_State* L)
  148. {
  149. LuaStack stack(L);
  150. Vec3* a = (Vec3*) stack.get_lightudata(1);
  151. float len = stack.get_float(2);
  152. a->set_length(len);
  153. return 0;
  154. }
  155. //------------------------------------------------------------
  156. int32_t vec3_normalize(lua_State* L)
  157. {
  158. LuaStack stack(L);
  159. Vec3* a = (Vec3*) stack.get_lightudata(1);
  160. a->normalize();
  161. return 0;
  162. }
  163. //------------------------------------------------------------
  164. int32_t vec3_negate(lua_State* L)
  165. {
  166. LuaStack stack(L);
  167. Vec3* a = (Vec3*) stack.get_lightudata(1);
  168. a->negate();
  169. return 0;
  170. }
  171. //------------------------------------------------------------
  172. int32_t vec3_get_distance_to(lua_State* L)
  173. {
  174. LuaStack stack(L);
  175. Vec3* a = (Vec3*) stack.get_lightudata(1);
  176. Vec3* b = (Vec3*) stack.get_lightudata(2);
  177. stack.push_float(a->get_distance_to(*b));
  178. return 1;
  179. }
  180. //------------------------------------------------------------
  181. int32_t vec3_get_angle_between(lua_State* L)
  182. {
  183. LuaStack stack(L);
  184. Vec3* a = (Vec3*) stack.get_lightudata(1);
  185. Vec3* b = (Vec3*) stack.get_lightudata(2);
  186. stack.push_float(a->get_angle_between(*b));
  187. return 1;
  188. }
  189. //------------------------------------------------------------
  190. int32_t vec3_zero(lua_State* L)
  191. {
  192. LuaStack stack(L);
  193. Vec3* a = (Vec3*) stack.get_lightudata(1);
  194. a->zero();
  195. return 0;
  196. }
  197. } // extern "C"
  198. void load_vec3(LuaEnvironment& env)
  199. {
  200. env.load_module_function("Vec3", "new", vec3);
  201. env.load_module_function("Vec3", "val", vec3_values);
  202. env.load_module_function("Vec3", "add", vec3_add);
  203. env.load_module_function("Vec3", "sub", vec3_subtract);
  204. env.load_module_function("Vec3", "mul", vec3_multiply);
  205. env.load_module_function("Vec3", "div", vec3_divide);
  206. env.load_module_function("Vec3", "dot", vec3_dot);
  207. env.load_module_function("Vec3", "cross", vec3_cross);
  208. env.load_module_function("Vec3", "equals", vec3_equals);
  209. env.load_module_function("Vec3", "lower", vec3_lower);
  210. env.load_module_function("Vec3", "greater", vec3_greater);
  211. env.load_module_function("Vec3", "length", vec3_length);
  212. env.load_module_function("Vec3", "squared_length", vec3_squared_length);
  213. env.load_module_function("Vec3", "set_length", vec3_set_length);
  214. env.load_module_function("Vec3", "normalize", vec3_normalize);
  215. env.load_module_function("Vec3", "negate", vec3_negate);
  216. env.load_module_function("Vec3", "get_distance_to", vec3_get_distance_to);
  217. env.load_module_function("Vec3", "get_angle_between", vec3_get_angle_between);
  218. env.load_module_function("Vec3", "zero", vec3_zero);
  219. }
  220. } // namespace crown