2
0

Vec3Binds.cpp 6.2 KB

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