lua_quaternion.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. /*
  2. * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/taylor001/crown/blob/master/LICENSE
  4. */
  5. #include "quaternion.h"
  6. #include "vector3.h"
  7. #include "lua_stack.h"
  8. #include "lua_environment.h"
  9. namespace crown
  10. {
  11. static int quaternion_new(lua_State* L)
  12. {
  13. LuaStack stack(L);
  14. stack.push_quaternion(Quaternion(stack.get_vector3(1), stack.get_float(2)));
  15. return 1;
  16. }
  17. static int quaternion_ctor(lua_State* L)
  18. {
  19. LuaStack stack(L);
  20. stack.remove(1); // Remove table
  21. return quaternion_new(L);
  22. }
  23. static int quaternion_negate(lua_State* L)
  24. {
  25. LuaStack stack(L);
  26. stack.push_quaternion(-stack.get_quaternion(1));
  27. return 1;
  28. }
  29. static int quaternion_identity(lua_State* L)
  30. {
  31. LuaStack stack(L);
  32. stack.push_quaternion(quaternion::IDENTITY);
  33. return 1;
  34. }
  35. static int quaternion_length(lua_State* L)
  36. {
  37. LuaStack stack(L);
  38. stack.push_float(quaternion::length(stack.get_quaternion(1)));
  39. return 1;
  40. }
  41. static int quaternion_normalize(lua_State* L)
  42. {
  43. LuaStack stack(L);
  44. stack.push_quaternion(quaternion::normalize(stack.get_quaternion(1)));
  45. return 1;
  46. }
  47. static int quaternion_conjugate(lua_State* L)
  48. {
  49. LuaStack stack(L);
  50. stack.push_quaternion(quaternion::conjugate(stack.get_quaternion(1)));
  51. return 1;
  52. }
  53. static int quaternion_inverse(lua_State* L)
  54. {
  55. LuaStack stack(L);
  56. stack.push_quaternion(quaternion::inverse(stack.get_quaternion(1)));
  57. return 1;
  58. }
  59. static int quaternion_multiply(lua_State* L)
  60. {
  61. LuaStack stack(L);
  62. stack.push_quaternion(stack.get_quaternion(1) * stack.get_quaternion(2));
  63. return 1;
  64. }
  65. static int quaternion_multiply_by_scalar(lua_State* L)
  66. {
  67. LuaStack stack(L);
  68. stack.push_quaternion(stack.get_quaternion(1) * stack.get_float(2));
  69. return 1;
  70. }
  71. static int quaternion_power(lua_State* L)
  72. {
  73. LuaStack stack(L);
  74. stack.push_quaternion(quaternion::power(stack.get_quaternion(1), stack.get_float(2)));
  75. return 1;
  76. }
  77. static int quaternion_elements(lua_State* L)
  78. {
  79. LuaStack stack(L);
  80. const Quaternion& q = stack.get_quaternion(1);
  81. stack.push_float(q.x);
  82. stack.push_float(q.y);
  83. stack.push_float(q.z);
  84. stack.push_float(q.w);
  85. return 4;
  86. }
  87. static int quaternionbox_new(lua_State* L)
  88. {
  89. LuaStack stack(L);
  90. if (stack.num_args() == 0)
  91. stack.push_quaternionbox(Quaternion());
  92. else if (stack.num_args() == 1)
  93. stack.push_quaternionbox(stack.get_quaternion(1));
  94. else
  95. stack.push_quaternionbox(Quaternion(stack.get_float(1)
  96. , stack.get_float(2)
  97. , stack.get_float(3)
  98. , stack.get_float(4)));
  99. return 1;
  100. }
  101. static int quaternionbox_ctor(lua_State* L)
  102. {
  103. LuaStack stack(L);
  104. stack.remove(1); // Remove table
  105. return quaternionbox_new(L);
  106. }
  107. static int quaternionbox_store(lua_State* L)
  108. {
  109. LuaStack stack(L);
  110. Quaternion& q = stack.get_quaternionbox(1);
  111. if (stack.num_args() == 2)
  112. q = stack.get_quaternion(2);
  113. else
  114. q = Quaternion(stack.get_float(2)
  115. , stack.get_float(3)
  116. , stack.get_float(4)
  117. , stack.get_float(5));
  118. return 0;
  119. }
  120. static int quaternionbox_unbox(lua_State* L)
  121. {
  122. LuaStack stack(L);
  123. Quaternion& q = stack.get_quaternionbox(1);
  124. stack.push_quaternion(q);
  125. return 1;
  126. }
  127. static int quaternionbox_tostring(lua_State* L)
  128. {
  129. LuaStack stack(L);
  130. Quaternion& q = stack.get_quaternionbox(1);
  131. stack.push_fstring("QuaternionBox (%p)", &q);
  132. return 1;
  133. }
  134. void load_quaternion(LuaEnvironment& env)
  135. {
  136. env.load_module_function("Quaternion", "new", quaternion_new);
  137. env.load_module_function("Quaternion", "negate", quaternion_negate);
  138. env.load_module_function("Quaternion", "identity", quaternion_identity);
  139. env.load_module_function("Quaternion", "multiply", quaternion_multiply);
  140. env.load_module_function("Quaternion", "multiply_by_scalar", quaternion_multiply_by_scalar);
  141. env.load_module_function("Quaternion", "length", quaternion_length);
  142. env.load_module_function("Quaternion", "normalize", quaternion_normalize);
  143. env.load_module_function("Quaternion", "conjugate", quaternion_conjugate);
  144. env.load_module_function("Quaternion", "inverse", quaternion_inverse);
  145. env.load_module_function("Quaternion", "power", quaternion_power);
  146. env.load_module_function("Quaternion", "elements", quaternion_elements);
  147. env.load_module_constructor("Quaternion", quaternion_ctor);
  148. env.load_module_function("QuaternionBox", "new", quaternionbox_new);
  149. env.load_module_function("QuaternionBox", "store", quaternionbox_store);
  150. env.load_module_function("QuaternionBox", "unbox", quaternionbox_unbox);
  151. env.load_module_function("QuaternionBox", "__tostring", quaternionbox_tostring);
  152. env.load_module_constructor("QuaternionBox", quaternionbox_ctor);
  153. }
  154. } //namespace crown