Vec3Binds.cpp 5.7 KB

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