lua_vector3.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. /*
  2. * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/taylor001/crown/blob/master/LICENSE
  4. */
  5. #include "vector3.h"
  6. #include "lua_stack.h"
  7. #include "lua_environment.h"
  8. #include "lua_assert.h"
  9. namespace crown
  10. {
  11. static int vector3_new(lua_State* L)
  12. {
  13. LuaStack stack(L);
  14. stack.push_vector3(Vector3(stack.get_float(1), stack.get_float(2), stack.get_float(3)));
  15. return 1;
  16. }
  17. static int vector3_ctor(lua_State* L)
  18. {
  19. LuaStack stack(L);
  20. stack.remove(1); // Remove table
  21. return vector3_new(L);
  22. }
  23. static int vector3_x(lua_State* L)
  24. {
  25. LuaStack stack(L);
  26. stack.push_float(stack.get_vector3(1).x);
  27. return 1;
  28. }
  29. static int vector3_y(lua_State* L)
  30. {
  31. LuaStack stack(L);
  32. stack.push_float(stack.get_vector3(1).y);
  33. return 1;
  34. }
  35. static int vector3_z(lua_State* L)
  36. {
  37. LuaStack stack(L);
  38. stack.push_float(stack.get_vector3(1).z);
  39. return 1;
  40. }
  41. static int vector3_set_x(lua_State* L)
  42. {
  43. LuaStack stack(L);
  44. stack.get_vector3(1).x = stack.get_float(2);
  45. return 0;
  46. }
  47. static int vector3_set_y(lua_State* L)
  48. {
  49. LuaStack stack(L);
  50. stack.get_vector3(1).y = stack.get_float(2);
  51. return 0;
  52. }
  53. static int vector3_set_z(lua_State* L)
  54. {
  55. LuaStack stack(L);
  56. stack.get_vector3(1).z = stack.get_float(2);
  57. return 0;
  58. }
  59. static int vector3_values(lua_State* L)
  60. {
  61. LuaStack stack(L);
  62. Vector3& a = stack.get_vector3(1);
  63. stack.push_float(a.x);
  64. stack.push_float(a.y);
  65. stack.push_float(a.z);
  66. return 3;
  67. }
  68. static int vector3_add(lua_State* L)
  69. {
  70. LuaStack stack(L);
  71. stack.push_vector3(stack.get_vector3(1) + stack.get_vector3(2));
  72. return 1;
  73. }
  74. static int vector3_subtract(lua_State* L)
  75. {
  76. LuaStack stack(L);
  77. stack.push_vector3(stack.get_vector3(1) - stack.get_vector3(2));
  78. return 1;
  79. }
  80. static int vector3_multiply(lua_State* L)
  81. {
  82. LuaStack stack(L);
  83. stack.push_vector3(stack.get_vector3(1) * stack.get_float(2));
  84. return 1;
  85. }
  86. static int vector3_divide(lua_State* L)
  87. {
  88. LuaStack stack(L);
  89. stack.push_vector3(stack.get_vector3(1) / stack.get_float(2));
  90. return 1;
  91. }
  92. static int vector3_dot(lua_State* L)
  93. {
  94. LuaStack stack(L);
  95. stack.push_float(vector3::dot(stack.get_vector3(1), stack.get_vector3(2)));
  96. return 1;
  97. }
  98. static int vector3_cross(lua_State* L)
  99. {
  100. LuaStack stack(L);
  101. stack.push_vector3(vector3::cross(stack.get_vector3(1), stack.get_vector3(2)));
  102. return 1;
  103. }
  104. static int vector3_equal(lua_State* L)
  105. {
  106. LuaStack stack(L);
  107. stack.push_bool(stack.get_vector3(1) == stack.get_vector3(2));
  108. return 1;
  109. }
  110. static int vector3_length(lua_State* L)
  111. {
  112. LuaStack stack(L);
  113. stack.push_float(vector3::length(stack.get_vector3(1)));
  114. return 1;
  115. }
  116. static int vector3_squared_length(lua_State* L)
  117. {
  118. LuaStack stack(L);
  119. stack.push_float(vector3::squared_length(stack.get_vector3(1)));
  120. return 1;
  121. }
  122. static int vector3_set_length(lua_State* L)
  123. {
  124. LuaStack stack(L);
  125. vector3::set_length(stack.get_vector3(1), stack.get_float(2));
  126. return 0;
  127. }
  128. static int vector3_normalize(lua_State* L)
  129. {
  130. LuaStack stack(L);
  131. stack.push_vector3(vector3::normalize(stack.get_vector3(1)));
  132. return 1;
  133. }
  134. static int vector3_distance(lua_State* L)
  135. {
  136. LuaStack stack(L);
  137. stack.push_float(vector3::distance(stack.get_vector3(1), stack.get_vector3(2)));
  138. return 1;
  139. }
  140. static int vector3_angle(lua_State* L)
  141. {
  142. LuaStack stack(L);
  143. stack.push_float(vector3::angle(stack.get_vector3(1), stack.get_vector3(2)));
  144. return 1;
  145. }
  146. static int vector3_forward(lua_State* L)
  147. {
  148. LuaStack stack(L);
  149. stack.push_vector3(vector3::FORWARD);
  150. return 1;
  151. }
  152. static int vector3_backward(lua_State* L)
  153. {
  154. LuaStack stack(L);
  155. stack.push_vector3(vector3::BACKWARD);
  156. return 1;
  157. }
  158. static int vector3_left(lua_State* L)
  159. {
  160. LuaStack stack(L);
  161. stack.push_vector3(vector3::LEFT);
  162. return 1;
  163. }
  164. static int vector3_right(lua_State* L)
  165. {
  166. LuaStack stack(L);
  167. stack.push_vector3(vector3::RIGHT);
  168. return 1;
  169. }
  170. static int vector3_up(lua_State* L)
  171. {
  172. LuaStack stack(L);
  173. stack.push_vector3(vector3::UP);
  174. return 1;
  175. }
  176. static int vector3_down(lua_State* L)
  177. {
  178. LuaStack stack(L);
  179. stack.push_vector3(vector3::DOWN);
  180. return 1;
  181. }
  182. static int vector2_new(lua_State* L)
  183. {
  184. LuaStack stack(L);
  185. stack.push_vector2(Vector2(stack.get_float(1), stack.get_float(2)));
  186. return 1;
  187. }
  188. static int vector2_ctor(lua_State* L)
  189. {
  190. LuaStack stack(L);
  191. stack.remove(1); // Remove table
  192. return vector2_new(L);
  193. }
  194. static int vector3box_new(lua_State* L)
  195. {
  196. LuaStack stack(L);
  197. if (stack.num_args() == 0)
  198. stack.push_vector3box(Vector3());
  199. else if (stack.num_args() == 1)
  200. stack.push_vector3box(stack.get_vector3(1));
  201. else
  202. stack.push_vector3box(Vector3(stack.get_float(1)
  203. , stack.get_float(2)
  204. , stack.get_float(3)));
  205. return 1;
  206. }
  207. static int vector3box_ctor(lua_State* L)
  208. {
  209. LuaStack stack(L);
  210. stack.remove(1); // Remove table
  211. return vector3box_new(L);
  212. }
  213. static int vector3box_store(lua_State* L)
  214. {
  215. LuaStack stack(L);
  216. Vector3& v = stack.get_vector3box(1);
  217. if (stack.num_args() == 2)
  218. v = stack.get_vector3(2);
  219. else
  220. v = Vector3(stack.get_float(2)
  221. , stack.get_float(3)
  222. , stack.get_float(4));
  223. return 0;
  224. }
  225. static int vector3box_unbox(lua_State* L)
  226. {
  227. LuaStack stack(L);
  228. stack.push_vector3(stack.get_vector3box(1));
  229. return 1;
  230. }
  231. static int vector3box_get_value(lua_State* L)
  232. {
  233. LuaStack stack(L);
  234. Vector3& v = stack.get_vector3box(1);
  235. const char* s = stack.get_string(2);
  236. switch (s[0])
  237. {
  238. case 'x': stack.push_float(v.x); return 1;
  239. case 'y': stack.push_float(v.y); return 1;
  240. case 'z': stack.push_float(v.z); return 1;
  241. default: LUA_ASSERT(false, stack, "Bad index: '%c'", s[0]); break;
  242. }
  243. return 0;
  244. }
  245. static int vector3box_set_value(lua_State* L)
  246. {
  247. LuaStack stack(L);
  248. Vector3& v = stack.get_vector3box(1);
  249. const char* s = stack.get_string(2);
  250. const float value = stack.get_float(3);
  251. switch (s[0])
  252. {
  253. case 'x': v.x = value; break;
  254. case 'y': v.y = value; break;
  255. case 'z': v.z = value; break;
  256. default: LUA_ASSERT(false, stack, "Bad index: '%c'", s[0]); break;
  257. }
  258. return 0;
  259. }
  260. static int vector3box_tostring(lua_State* L)
  261. {
  262. LuaStack stack(L);
  263. Vector3& v = stack.get_vector3box(1);
  264. stack.push_fstring("Vector3Box (%p)", &v);
  265. return 1;
  266. }
  267. void load_vector3(LuaEnvironment& env)
  268. {
  269. env.load_module_function("Vector3", "new", vector3_new);
  270. env.load_module_function("Vector3", "x", vector3_x);
  271. env.load_module_function("Vector3", "y", vector3_y);
  272. env.load_module_function("Vector3", "z", vector3_z);
  273. env.load_module_function("Vector3", "set_x", vector3_set_x);
  274. env.load_module_function("Vector3", "set_y", vector3_set_y);
  275. env.load_module_function("Vector3", "set_z", vector3_set_z);
  276. env.load_module_function("Vector3", "values", vector3_values);
  277. env.load_module_function("Vector3", "add", vector3_add);
  278. env.load_module_function("Vector3", "subtract", vector3_subtract);
  279. env.load_module_function("Vector3", "multiply", vector3_multiply);
  280. env.load_module_function("Vector3", "divide", vector3_divide);
  281. env.load_module_function("Vector3", "dot", vector3_dot);
  282. env.load_module_function("Vector3", "cross", vector3_cross);
  283. env.load_module_function("Vector3", "equal", vector3_equal);
  284. env.load_module_function("Vector3", "length", vector3_length);
  285. env.load_module_function("Vector3", "squared_length", vector3_squared_length);
  286. env.load_module_function("Vector3", "set_length", vector3_set_length);
  287. env.load_module_function("Vector3", "normalize", vector3_normalize);
  288. env.load_module_function("Vector3", "distance", vector3_distance);
  289. env.load_module_function("Vector3", "angle", vector3_angle);
  290. env.load_module_function("Vector3", "forward", vector3_forward);
  291. env.load_module_function("Vector3", "backward", vector3_backward);
  292. env.load_module_function("Vector3", "left", vector3_left);
  293. env.load_module_function("Vector3", "right", vector3_right);
  294. env.load_module_function("Vector3", "up", vector3_up);
  295. env.load_module_function("Vector3", "down", vector3_down);
  296. env.load_module_constructor("Vector3", vector3_ctor);
  297. env.load_module_function("Vector2", "new", vector2_new);
  298. env.load_module_constructor("Vector2", vector2_ctor);
  299. env.load_module_function("Vector3Box", "new", vector3box_new);
  300. env.load_module_function("Vector3Box", "store", vector3box_store);
  301. env.load_module_function("Vector3Box", "unbox", vector3box_unbox);
  302. env.load_module_function("Vector3Box", "__index", vector3box_get_value);
  303. env.load_module_function("Vector3Box", "__newindex", vector3box_set_value);
  304. env.load_module_function("Vector3Box", "__tostring", vector3box_tostring);
  305. env.load_module_constructor("Vector3Box", vector3box_ctor);
  306. }
  307. } // namespace crown