/src/lipsofsuna/extension/render/ext-light.c

https://gitlab.com/xenodora/lipsofsuna · C · 239 lines · 171 code · 39 blank · 29 comment · 19 complexity · 1c5bcc91a49afc5051c4062a93ad18eb MD5 · raw file

  1. /* Lips of Suna
  2. * Copyright© 2007-2012 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 LIExt Extension
  19. * @{
  20. * \addtogroup LIExtRender Render
  21. * @{
  22. */
  23. #include "ext-module.h"
  24. static void private_light_free (
  25. LIExtLight* self)
  26. {
  27. liren_render_light_free (self->module->render, self->id);
  28. lisys_free (self);
  29. }
  30. /*****************************************************************************/
  31. static void Light_new (LIScrArgs* args)
  32. {
  33. LIExtModule* module;
  34. LIExtLight* self;
  35. LIScrData* data;
  36. const float black[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
  37. const float white[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
  38. const float equation[3] = { 1.0f, 1.0f, 1.0f };
  39. /* Allocate self. */
  40. module = liscr_script_get_userdata (args->script, LIEXT_SCRIPT_LIGHT);
  41. self = lisys_calloc (1, sizeof (LIExtLight));
  42. if (self == NULL)
  43. return;
  44. self->module = module;
  45. /* Allocate the light data. */
  46. self->id = liren_render_light_new (module->render, black, white, white, equation, M_PI, 0.0f, 0);
  47. if (!self->id)
  48. {
  49. lisys_free (self);
  50. return;
  51. }
  52. /* Allocate userdata. */
  53. data = liscr_data_new (args->script, args->lua, self, LIEXT_SCRIPT_LIGHT, private_light_free);
  54. if (data == NULL)
  55. {
  56. liren_render_light_free (module->render, self->id);
  57. lisys_free (self);
  58. return;
  59. }
  60. liscr_args_seti_stack (args);
  61. }
  62. static void Light_set_ambient (LIScrArgs* args)
  63. {
  64. int i;
  65. float value[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
  66. LIExtLight* light = args->self;
  67. for (i = 0 ; i < 4 ; i++)
  68. liscr_args_geti_float (args, i, value + i);
  69. liren_render_light_set_ambient (light->module->render, light->id, value);
  70. }
  71. static void Light_set_diffuse (LIScrArgs* args)
  72. {
  73. int i;
  74. float value[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
  75. LIExtLight* light = args->self;
  76. for (i = 0 ; i < 4 ; i++)
  77. liscr_args_geti_float (args, i, value + i);
  78. liren_render_light_set_diffuse (light->module->render, light->id, value);
  79. }
  80. static void Light_set_directional (LIScrArgs* args)
  81. {
  82. int value;
  83. LIExtLight* light = args->self;
  84. if (liscr_args_geti_bool (args, 0, &value))
  85. liren_render_light_set_directional (light->module->render, light->id, value);
  86. }
  87. static void Light_set_enabled (LIScrArgs* args)
  88. {
  89. int value;
  90. LIExtLight* light = args->self;
  91. if (liscr_args_geti_bool (args, 0, &value))
  92. liren_render_light_set_enabled (light->module->render, light->id, value);
  93. }
  94. static void Light_set_equation (LIScrArgs* args)
  95. {
  96. int i;
  97. float value[3] = { 1.0f, 0.0f, 0.0f };
  98. LIExtLight* light = args->self;
  99. for (i = 0 ; i < 3 ; i++)
  100. liscr_args_geti_float (args, i, value + i);
  101. liren_render_light_set_equation (light->module->render, light->id, value);
  102. }
  103. static void Light_set_position (LIScrArgs* args)
  104. {
  105. LIMatTransform transform;
  106. LIMatVector vector;
  107. LIExtLight* light = args->self;
  108. if (liscr_args_geti_vector (args, 0, &vector))
  109. {
  110. liren_render_light_get_transform (light->module->render, light->id, &transform);
  111. transform.position = vector;
  112. liren_render_light_set_transform (light->module->render, light->id, &transform);
  113. }
  114. }
  115. static void Light_set_priority (LIScrArgs* args)
  116. {
  117. float value;
  118. LIExtLight* light = args->self;
  119. if (liscr_args_geti_float (args, 0, &value))
  120. liren_render_light_set_priority (light->module->render, light->id, value);
  121. }
  122. static void Light_set_rotation (LIScrArgs* args)
  123. {
  124. LIMatTransform transform;
  125. LIMatQuaternion value;
  126. LIExtLight* light = args->self;
  127. if (liscr_args_geti_quaternion (args, 0, &value))
  128. {
  129. liren_render_light_get_transform (light->module->render, light->id, &transform);
  130. transform.rotation = value;
  131. limat_quaternion_normalize (transform.rotation);
  132. liren_render_light_set_transform (light->module->render, light->id, &transform);
  133. }
  134. }
  135. static void Light_set_shadow_casting (LIScrArgs* args)
  136. {
  137. int value;
  138. LIExtLight* light = args->self;
  139. if (liscr_args_geti_bool (args, 0, &value))
  140. liren_render_light_set_shadow (light->module->render, light->id, value);
  141. }
  142. static void Light_set_shadow_far (LIScrArgs* args)
  143. {
  144. float value;
  145. LIExtLight* light = args->self;
  146. if (liscr_args_geti_float (args, 0, &value))
  147. liren_render_light_set_shadow_far (light->module->render, light->id, LIMAT_MAX (value, LIMAT_EPSILON));
  148. }
  149. static void Light_set_shadow_near (LIScrArgs* args)
  150. {
  151. float value;
  152. LIExtLight* light = args->self;
  153. if (liscr_args_geti_float (args, 0, &value))
  154. liren_render_light_set_shadow_near (light->module->render, light->id, LIMAT_MAX (value, LIMAT_EPSILON));
  155. }
  156. static void Light_set_specular (LIScrArgs* args)
  157. {
  158. int i;
  159. float value[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
  160. LIExtLight* light = args->self;
  161. for (i = 0 ; i < 4 ; i++)
  162. liscr_args_geti_float (args, i, value + i);
  163. liren_render_light_set_specular (light->module->render, light->id, value);
  164. }
  165. static void Light_set_spot_cutoff (LIScrArgs* args)
  166. {
  167. float value;
  168. LIExtLight* light = args->self;
  169. if (liscr_args_geti_float (args, 0, &value))
  170. liren_render_light_set_spot_cutoff (light->module->render, light->id, LIMAT_CLAMP (value, 0.0f, M_PI));
  171. }
  172. static void Light_set_spot_exponent (LIScrArgs* args)
  173. {
  174. float value;
  175. LIExtLight* light = args->self;
  176. if (liscr_args_geti_float (args, 0, &value))
  177. liren_render_light_set_spot_exponent (light->module->render, light->id, LIMAT_CLAMP (value, 0.0f, 127.0f));
  178. }
  179. /*****************************************************************************/
  180. void liext_script_light (
  181. LIScrScript* self)
  182. {
  183. liscr_script_insert_cfunc (self, LIEXT_SCRIPT_LIGHT, "light_new", Light_new);
  184. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_ambient", Light_set_ambient);
  185. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_diffuse", Light_set_diffuse);
  186. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_directional", Light_set_directional);
  187. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_enabled", Light_set_enabled);
  188. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_equation", Light_set_equation);
  189. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_position", Light_set_position);
  190. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_priority", Light_set_priority);
  191. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_rotation", Light_set_rotation);
  192. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_shadow_casting", Light_set_shadow_casting);
  193. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_shadow_far", Light_set_shadow_far);
  194. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_shadow_near", Light_set_shadow_near);
  195. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_specular", Light_set_specular);
  196. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_spot_cutoff", Light_set_spot_cutoff);
  197. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_spot_exponent", Light_set_spot_exponent);
  198. }
  199. /** @} */
  200. /** @} */