/src/lipsofsuna/script/script-object.c

https://github.com/deldiablo/GodheadLips · C · 206 lines · 143 code · 32 blank · 31 comment · 18 complexity · d9ab326f0828e02b859b92e38cdb5d1a 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 LIScrObject Object
  21. * @{
  22. */
  23. #include "lipsofsuna/engine.h"
  24. #include "lipsofsuna/main.h"
  25. #include "lipsofsuna/script.h"
  26. #include "script-private.h"
  27. static void Object_find (LIScrArgs* args)
  28. {
  29. int id;
  30. float radius = 32.0f;
  31. LIAlgU32dicIter iter1;
  32. LIEngObject* object;
  33. LIEngSector* sector;
  34. LIMatVector center;
  35. LIMatVector diff;
  36. LIMaiProgram* program;
  37. /* Find class data. */
  38. program = liscr_script_get_userdata (args->script, LISCR_SCRIPT_PROGRAM);
  39. /* Radial find mode. */
  40. if (liscr_args_gets_vector (args, "point", &center))
  41. {
  42. liscr_args_gets_float (args, "radius", &radius);
  43. liscr_args_set_output (args, LISCR_ARGS_OUTPUT_TABLE_FORCE);
  44. LIALG_U32DIC_FOREACH (iter1, program->engine->objects)
  45. {
  46. object = iter1.value;
  47. diff = limat_vector_subtract (center, object->transform.position);
  48. if (limat_vector_get_length (diff) < radius)
  49. liscr_args_seti_data (args, object->script);
  50. }
  51. }
  52. /* Sector find mode. */
  53. else if (liscr_args_gets_int (args, "sector", &id))
  54. {
  55. sector = lialg_sectors_data_index (program->sectors, LIALG_SECTORS_CONTENT_ENGINE, id, 0);
  56. liscr_args_set_output (args, LISCR_ARGS_OUTPUT_TABLE_FORCE);
  57. if (sector != NULL)
  58. {
  59. LIALG_U32DIC_FOREACH (iter1, sector->objects)
  60. {
  61. object = iter1.value;
  62. liscr_args_seti_data (args, object->script);
  63. }
  64. }
  65. }
  66. }
  67. static void Object_new (LIScrArgs* args)
  68. {
  69. LIEngObject* self;
  70. LIMaiProgram* program;
  71. /* Find class data. */
  72. program = liscr_script_get_userdata (args->script, LISCR_SCRIPT_PROGRAM);
  73. /* Allocate object. */
  74. self = lieng_object_new (program->engine);
  75. if (self == NULL)
  76. return;
  77. /* Allocate userdata. */
  78. self->script = liscr_data_new (args->script, args->lua, self, LISCR_SCRIPT_OBJECT, lieng_object_free);
  79. if (self->script == NULL)
  80. {
  81. lieng_object_free (self);
  82. return;
  83. }
  84. liscr_args_seti_stack (args);
  85. }
  86. static void Object_refresh (LIScrArgs* args)
  87. {
  88. float radius = 32.0f;
  89. liscr_args_gets_float (args, "radius", &radius);
  90. lieng_object_refresh (args->self, radius);
  91. }
  92. static void Object_get_model (LIScrArgs* args)
  93. {
  94. LIEngObject* self = args->self;
  95. if (self->model != NULL)
  96. liscr_args_seti_data (args, self->model->script);
  97. }
  98. static void Object_set_model (LIScrArgs* args)
  99. {
  100. LIScrData* value;
  101. if (liscr_args_geti_data (args, 0, LISCR_SCRIPT_MODEL, &value))
  102. lieng_object_set_model (args->self, value->data);
  103. else
  104. lieng_object_set_model (args->self, NULL);
  105. }
  106. static void Object_get_position (LIScrArgs* args)
  107. {
  108. LIMatTransform tmp;
  109. lieng_object_get_transform (args->self, &tmp);
  110. liscr_args_seti_vector (args, &tmp.position);
  111. }
  112. static void Object_set_position (LIScrArgs* args)
  113. {
  114. LIMatTransform transform;
  115. LIMatVector vector;
  116. if (liscr_args_geti_vector (args, 0, &vector))
  117. {
  118. lieng_object_get_transform (args->self, &transform);
  119. transform.position = vector;
  120. lieng_object_set_transform (args->self, &transform);
  121. }
  122. }
  123. static void Object_get_realized (LIScrArgs* args)
  124. {
  125. liscr_args_seti_bool (args, lieng_object_get_realized (args->self));
  126. }
  127. static void Object_set_realized (LIScrArgs* args)
  128. {
  129. int value;
  130. if (liscr_args_geti_bool (args, 0, &value))
  131. lieng_object_set_realized (args->self, value);
  132. }
  133. static void Object_get_rotation (LIScrArgs* args)
  134. {
  135. LIMatTransform tmp;
  136. lieng_object_get_transform (args->self, &tmp);
  137. liscr_args_seti_quaternion (args, &tmp.rotation);
  138. }
  139. static void Object_set_rotation (LIScrArgs* args)
  140. {
  141. LIMatTransform transform;
  142. LIScrData* quat;
  143. if (liscr_args_geti_data (args, 0, LISCR_SCRIPT_QUATERNION, &quat))
  144. {
  145. lieng_object_get_transform (args->self, &transform);
  146. transform.rotation = *((LIMatQuaternion*) quat->data);
  147. lieng_object_set_transform (args->self, &transform);
  148. }
  149. }
  150. static void Object_get_sector (LIScrArgs* args)
  151. {
  152. LIEngObject* self = args->self;
  153. if (self->sector != NULL)
  154. liscr_args_seti_int (args, self->sector->sector->index);
  155. }
  156. /*****************************************************************************/
  157. void liscr_script_object (
  158. LIScrScript* self)
  159. {
  160. liscr_script_insert_cfunc (self, LISCR_SCRIPT_OBJECT, "object_find", Object_find);
  161. liscr_script_insert_cfunc (self, LISCR_SCRIPT_OBJECT, "object_new", Object_new);
  162. liscr_script_insert_mfunc (self, LISCR_SCRIPT_OBJECT, "object_refresh", Object_refresh);
  163. liscr_script_insert_mfunc (self, LISCR_SCRIPT_OBJECT, "object_get_model", Object_get_model);
  164. liscr_script_insert_mfunc (self, LISCR_SCRIPT_OBJECT, "object_set_model", Object_set_model);
  165. liscr_script_insert_mfunc (self, LISCR_SCRIPT_OBJECT, "object_get_position", Object_get_position);
  166. liscr_script_insert_mfunc (self, LISCR_SCRIPT_OBJECT, "object_set_position", Object_set_position);
  167. liscr_script_insert_mfunc (self, LISCR_SCRIPT_OBJECT, "object_get_realized", Object_get_realized);
  168. liscr_script_insert_mfunc (self, LISCR_SCRIPT_OBJECT, "object_set_realized", Object_set_realized);
  169. liscr_script_insert_mfunc (self, LISCR_SCRIPT_OBJECT, "object_get_rotation", Object_get_rotation);
  170. liscr_script_insert_mfunc (self, LISCR_SCRIPT_OBJECT, "object_set_rotation", Object_set_rotation);
  171. liscr_script_insert_mfunc (self, LISCR_SCRIPT_OBJECT, "object_get_sector", Object_get_sector);
  172. }
  173. /** @} */
  174. /** @} */