/src/lipsofsuna/script/script-quaternion.c

https://github.com/deldiablo/GodheadLips · C · 253 lines · 193 code · 32 blank · 28 comment · 15 complexity · 65bdd65039c684240933ed3d5da43b38 MD5 · raw file

  1. /* Lips of Suna
  2. * Copyright© 2007-2010 Lips of Suna development team.
  3. *
  4. * Lips of Suna is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU Lesser General Public License as
  6. * published by the Free Software Foundation, either version 3 of the
  7. * License, or (at your option) any later version.
  8. *
  9. * Lips of Suna is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU Lesser General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser General Public License
  15. * along with Lips of Suna. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. /**
  18. * \addtogroup LIScr Script
  19. * @{
  20. * \addtogroup LIScrQuaternion Quaternion
  21. * @{
  22. */
  23. #include "lipsofsuna/script.h"
  24. #include "script-private.h"
  25. static void Quaternion_new (LIScrArgs* args)
  26. {
  27. float angle;
  28. LIMatVector axis;
  29. LIMatVector dir;
  30. LIMatVector up;
  31. LIMatQuaternion quat = { 0.0f, 0.0f, 0.0f, 1.0f };
  32. if (liscr_args_gets_vector (args, "axis", &axis) &&
  33. liscr_args_gets_float (args, "angle", &angle))
  34. {
  35. quat = limat_quaternion_rotation (angle, axis);
  36. }
  37. else if (liscr_args_gets_vector (args, "dir", &dir) &&
  38. liscr_args_gets_vector (args, "up", &up))
  39. {
  40. quat = limat_quaternion_look (dir, up);
  41. quat = limat_quaternion_conjugate (quat);
  42. }
  43. else
  44. {
  45. if (!liscr_args_gets_float (args, "x", &quat.x))
  46. liscr_args_geti_float (args, 0, &quat.x);
  47. if (!liscr_args_gets_float (args, "y", &quat.y))
  48. liscr_args_geti_float (args, 1, &quat.y);
  49. if (!liscr_args_gets_float (args, "z", &quat.z))
  50. liscr_args_geti_float (args, 2, &quat.z);
  51. if (!liscr_args_gets_float (args, "w", &quat.w))
  52. liscr_args_geti_float (args, 3, &quat.w);
  53. }
  54. liscr_args_seti_quaternion (args, &quat);
  55. }
  56. static void Quaternion_new_euler (LIScrArgs* args)
  57. {
  58. float euler[3] = { 0.0f, 0.0f, 0.0f };
  59. LIMatQuaternion quat;
  60. liscr_args_geti_float (args, 0, euler + 0);
  61. liscr_args_geti_float (args, 1, euler + 1);
  62. liscr_args_geti_float (args, 2, euler + 2);
  63. quat = limat_quaternion_euler (euler[0], euler[1], euler[2]);
  64. liscr_args_seti_quaternion (args, &quat);
  65. }
  66. static void Quaternion_add (LIScrArgs* args)
  67. {
  68. LIMatQuaternion tmp;
  69. LIScrData* b;
  70. if (!liscr_args_geti_data (args, 0, LISCR_SCRIPT_QUATERNION, &b))
  71. return;
  72. tmp = limat_quaternion_add (*((LIMatQuaternion*) args->self), *((LIMatQuaternion*) b->data));
  73. liscr_args_seti_quaternion (args, &tmp);
  74. }
  75. static void Quaternion_mul (LIScrArgs* args)
  76. {
  77. float s;
  78. LIMatQuaternion q;
  79. LIMatVector v;
  80. LIScrData* b;
  81. if (liscr_args_geti_float (args, 0, &s))
  82. {
  83. /* Multiply by scalar. */
  84. q = limat_quaternion_init (
  85. ((LIMatQuaternion*) args->self)->x * s,
  86. ((LIMatQuaternion*) args->self)->y * s,
  87. ((LIMatQuaternion*) args->self)->z * s,
  88. ((LIMatQuaternion*) args->self)->w * s);
  89. liscr_args_seti_quaternion (args, &q);
  90. }
  91. else if (liscr_args_geti_data (args, 0, LISCR_SCRIPT_VECTOR, &b))
  92. {
  93. /* Transform vector. */
  94. v = limat_quaternion_transform (*((LIMatQuaternion*) args->self), *((LIMatVector*) b->data));
  95. liscr_args_seti_vector (args, &v);
  96. }
  97. else if (liscr_args_geti_data (args, 0, LISCR_SCRIPT_QUATERNION, &b))
  98. {
  99. /* Concatenate rotations. */
  100. q = limat_quaternion_multiply (*((LIMatQuaternion*) args->self), *((LIMatQuaternion*) b->data));
  101. liscr_args_seti_quaternion (args, &q);
  102. }
  103. }
  104. static void Quaternion_sub (LIScrArgs* args)
  105. {
  106. LIMatQuaternion tmp;
  107. LIScrData* b;
  108. if (!liscr_args_geti_data (args, 0, LISCR_SCRIPT_QUATERNION, &b))
  109. return;
  110. tmp = limat_quaternion_subtract (*((LIMatQuaternion*) args->self), *((LIMatQuaternion*) b->data));
  111. liscr_args_seti_quaternion (args, &tmp);
  112. }
  113. static void Quaternion_tostring (LIScrArgs* args)
  114. {
  115. char buffer[256];
  116. LIMatQuaternion* self;
  117. self = args->self;
  118. snprintf (buffer, 256, "Quaternion(%g,%g,%g,%g)", self->x, self->y, self->z, self->w);
  119. liscr_args_seti_string (args, buffer);
  120. }
  121. static void Quaternion_nlerp (LIScrArgs* args)
  122. {
  123. float val;
  124. LIMatQuaternion q1;
  125. LIMatQuaternion q2;
  126. if (liscr_args_geti_quaternion(args, 0, &q2) &&
  127. liscr_args_geti_float (args, 1, &val))
  128. {
  129. q1 = *((LIMatQuaternion*) args->self);
  130. q2 = limat_quaternion_get_nearest (q2, q1);
  131. q2 = limat_quaternion_nlerp (q1, q2, val);
  132. liscr_args_seti_quaternion (args, &q2);
  133. }
  134. }
  135. static void Quaternion_normalize (LIScrArgs* args)
  136. {
  137. LIMatQuaternion tmp;
  138. tmp = limat_quaternion_normalize (*((LIMatQuaternion*) args->self));
  139. liscr_args_seti_quaternion (args, &tmp);
  140. }
  141. static void Quaternion_get_conjugate (LIScrArgs* args)
  142. {
  143. LIMatQuaternion* data;
  144. LIMatQuaternion tmp;
  145. data = args->self;
  146. tmp = limat_quaternion_conjugate (*data);
  147. liscr_args_seti_quaternion (args, &tmp);
  148. }
  149. static void Quaternion_get_euler (LIScrArgs* args)
  150. {
  151. float e[3];
  152. LIMatQuaternion* data;
  153. data = args->self;
  154. limat_quaternion_get_euler (*data, e + 0, e + 1, e + 2);
  155. liscr_args_set_output (args, LISCR_ARGS_OUTPUT_TABLE);
  156. liscr_args_seti_float (args, e[0]);
  157. liscr_args_seti_float (args, e[1]);
  158. liscr_args_seti_float (args, e[2]);
  159. }
  160. static void Quaternion_get_length (LIScrArgs* args)
  161. {
  162. liscr_args_seti_float (args, limat_quaternion_get_length (*((LIMatQuaternion*) args->self)));
  163. }
  164. static void Quaternion_get_w (LIScrArgs* args)
  165. {
  166. liscr_args_seti_float (args, ((LIMatQuaternion*) args->self)->w);
  167. }
  168. static void Quaternion_set_w (LIScrArgs* args)
  169. {
  170. liscr_args_geti_float (args, 0, &((LIMatQuaternion*) args->self)->w);
  171. }
  172. static void Quaternion_get_x (LIScrArgs* args)
  173. {
  174. liscr_args_seti_float (args, ((LIMatQuaternion*) args->self)->x);
  175. }
  176. static void Quaternion_set_x (LIScrArgs* args)
  177. {
  178. liscr_args_geti_float (args, 0, &((LIMatQuaternion*) args->self)->x);
  179. }
  180. static void Quaternion_get_y (LIScrArgs* args)
  181. {
  182. liscr_args_seti_float (args, ((LIMatQuaternion*) args->self)->y);
  183. }
  184. static void Quaternion_set_y (LIScrArgs* args)
  185. {
  186. liscr_args_geti_float (args, 0, &((LIMatQuaternion*) args->self)->y);
  187. }
  188. static void Quaternion_get_z (LIScrArgs* args)
  189. {
  190. liscr_args_seti_float (args, ((LIMatQuaternion*) args->self)->z);
  191. }
  192. static void Quaternion_set_z (LIScrArgs* args)
  193. {
  194. liscr_args_geti_float (args, 0, &((LIMatQuaternion*) args->self)->z);
  195. }
  196. /*****************************************************************************/
  197. void liscr_script_quaternion (
  198. LIScrScript* self)
  199. {
  200. liscr_script_insert_cfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_new", Quaternion_new);
  201. liscr_script_insert_cfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_new_euler", Quaternion_new_euler);
  202. liscr_script_insert_mfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_add", Quaternion_add);
  203. liscr_script_insert_mfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_mul", Quaternion_mul);
  204. liscr_script_insert_mfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_sub", Quaternion_sub);
  205. liscr_script_insert_mfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_tostring", Quaternion_tostring);
  206. liscr_script_insert_mfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_nlerp", Quaternion_nlerp);
  207. liscr_script_insert_mfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_normalize", Quaternion_normalize);
  208. liscr_script_insert_mfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_get_conjugate", Quaternion_get_conjugate);
  209. liscr_script_insert_mfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_get_euler", Quaternion_get_euler);
  210. liscr_script_insert_mfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_get_length", Quaternion_get_length);
  211. liscr_script_insert_mfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_get_x", Quaternion_get_x);
  212. liscr_script_insert_mfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_set_x", Quaternion_set_x);
  213. liscr_script_insert_mfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_get_y", Quaternion_get_y);
  214. liscr_script_insert_mfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_set_y", Quaternion_set_y);
  215. liscr_script_insert_mfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_get_z", Quaternion_get_z);
  216. liscr_script_insert_mfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_set_z", Quaternion_set_z);
  217. liscr_script_insert_mfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_get_w", Quaternion_get_w);
  218. liscr_script_insert_mfunc (self, LISCR_SCRIPT_QUATERNION, "quaternion_set_w", Quaternion_set_w);
  219. }
  220. /** @} */
  221. /** @} */