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

https://github.com/deldiablo/GodheadLips · C · 331 lines · 260 code · 44 blank · 27 comment · 20 complexity · 9e171eb3b90209f315ed1a00c127127a 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 LIExt Extension
  19. * @{
  20. * \addtogroup LIExtRender Render
  21. * @{
  22. */
  23. #include "ext-module.h"
  24. static void Light_new (LIScrArgs* args)
  25. {
  26. LIExtModule* module;
  27. LIRenLight* self;
  28. LIScrData* data;
  29. const float black[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
  30. const float white[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
  31. const float equation[3] = { 1.0f, 1.0f, 1.0f };
  32. /* Allocate self. */
  33. module = liscr_script_get_userdata (args->script, LIEXT_SCRIPT_LIGHT);
  34. self = liren_light_new (module->client->scene, black, white, white, equation, M_PI, 0.0f, 0);
  35. if (self == NULL)
  36. return;
  37. /* Allocate userdata. */
  38. data = liscr_data_new (args->script, args->lua, self, LIEXT_SCRIPT_LIGHT, liren_light_free);
  39. if (data == NULL)
  40. {
  41. liren_light_free (self);
  42. return;
  43. }
  44. liscr_args_seti_stack (args);
  45. }
  46. static void Light_get_ambient (LIScrArgs* args)
  47. {
  48. float value[4];
  49. LIRenLight* light;
  50. light = args->self;
  51. liren_light_get_ambient (light, value);
  52. liscr_args_set_output (args, LISCR_ARGS_OUTPUT_TABLE);
  53. liscr_args_seti_float (args, value[0]);
  54. liscr_args_seti_float (args, value[1]);
  55. liscr_args_seti_float (args, value[2]);
  56. liscr_args_seti_float (args, value[3]);
  57. }
  58. static void Light_set_ambient (LIScrArgs* args)
  59. {
  60. int i;
  61. float value[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
  62. LIRenLight* light;
  63. light = args->self;
  64. for (i = 0 ; i < 4 ; i++)
  65. liscr_args_geti_float (args, i, value + i);
  66. liren_light_set_ambient (light, value);
  67. }
  68. static void Light_get_diffuse (LIScrArgs* args)
  69. {
  70. float value[4];
  71. LIRenLight* light;
  72. light = args->self;
  73. liren_light_get_diffuse (light, value);
  74. liscr_args_set_output (args, LISCR_ARGS_OUTPUT_TABLE);
  75. liscr_args_seti_float (args, value[0]);
  76. liscr_args_seti_float (args, value[1]);
  77. liscr_args_seti_float (args, value[2]);
  78. liscr_args_seti_float (args, value[3]);
  79. }
  80. static void Light_set_diffuse (LIScrArgs* args)
  81. {
  82. int i;
  83. float value[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
  84. LIRenLight* light;
  85. light = args->self;
  86. for (i = 0 ; i < 4 ; i++)
  87. liscr_args_geti_float (args, i, value + i);
  88. liren_light_set_diffuse (light, value);
  89. }
  90. static void Light_get_enabled (LIScrArgs* args)
  91. {
  92. liscr_args_seti_bool (args, liren_light_get_enabled (args->self));
  93. }
  94. static void Light_set_enabled (LIScrArgs* args)
  95. {
  96. int value;
  97. LIRenLight* light;
  98. LIRenScene* scene;
  99. light = args->self;
  100. scene = liren_light_get_scene (light);
  101. if (liscr_args_geti_bool (args, 0, &value) && value != liren_light_get_enabled (light))
  102. {
  103. if (value)
  104. liren_scene_insert_light (scene, light);
  105. else
  106. liren_scene_remove_light (scene, light);
  107. }
  108. }
  109. static void Light_get_equation (LIScrArgs* args)
  110. {
  111. float value[3];
  112. LIRenLight* light;
  113. light = args->self;
  114. liren_light_get_equation (light, value);
  115. liscr_args_set_output (args, LISCR_ARGS_OUTPUT_TABLE);
  116. liscr_args_seti_float (args, value[0]);
  117. liscr_args_seti_float (args, value[1]);
  118. liscr_args_seti_float (args, value[2]);
  119. }
  120. static void Light_set_equation (LIScrArgs* args)
  121. {
  122. int i;
  123. float value[3] = { 1.0f, 0.0f, 0.0f };
  124. LIRenLight* light;
  125. light = args->self;
  126. for (i = 0 ; i < 3 ; i++)
  127. liscr_args_geti_float (args, i, value + i);
  128. liren_light_set_equation (light, value);
  129. }
  130. static void Light_get_position (LIScrArgs* args)
  131. {
  132. LIMatTransform transform;
  133. liren_light_get_transform (args->self, &transform);
  134. liscr_args_seti_vector (args, &transform.position);
  135. }
  136. static void Light_set_position (LIScrArgs* args)
  137. {
  138. LIMatTransform transform;
  139. LIMatVector vector;
  140. if (liscr_args_geti_vector (args, 0, &vector))
  141. {
  142. liren_light_get_transform (args->self, &transform);
  143. transform.position = vector;
  144. liren_light_set_transform (args->self, &transform);
  145. }
  146. }
  147. static void Light_get_priority (LIScrArgs* args)
  148. {
  149. liscr_args_seti_float (args, liren_light_get_priority (args->self));
  150. }
  151. static void Light_set_priority (LIScrArgs* args)
  152. {
  153. float value;
  154. if (liscr_args_geti_float (args, 0, &value))
  155. liren_light_set_priority (args->self, value);
  156. }
  157. static void Light_get_rotation (LIScrArgs* args)
  158. {
  159. LIMatTransform transform;
  160. liren_light_get_transform (args->self, &transform);
  161. liscr_args_seti_quaternion (args, &transform.rotation);
  162. }
  163. static void Light_set_rotation (LIScrArgs* args)
  164. {
  165. LIMatTransform transform;
  166. LIMatQuaternion value;
  167. if (liscr_args_geti_quaternion (args, 0, &value))
  168. {
  169. liren_light_get_transform (args->self, &transform);
  170. transform.rotation = value;
  171. liren_light_set_transform (args->self, &transform);
  172. }
  173. }
  174. static void Light_get_shadow_casting (LIScrArgs* args)
  175. {
  176. liscr_args_seti_bool (args, liren_light_get_shadow (args->self));
  177. }
  178. static void Light_set_shadow_casting (LIScrArgs* args)
  179. {
  180. int value;
  181. if (liscr_args_geti_bool (args, 0, &value))
  182. liren_light_set_shadow (args->self, value);
  183. }
  184. static void Light_get_shadow_far (LIScrArgs* args)
  185. {
  186. LIRenLight* self = args->self;
  187. liscr_args_seti_float (args, liren_light_get_shadow_far (self));
  188. }
  189. static void Light_set_shadow_far (LIScrArgs* args)
  190. {
  191. float value;
  192. LIRenLight* self = args->self;
  193. if (liscr_args_geti_float (args, 0, &value))
  194. liren_light_set_shadow_far (self, LIMAT_MAX (value, LIMAT_EPSILON));
  195. }
  196. static void Light_get_shadow_near (LIScrArgs* args)
  197. {
  198. LIRenLight* self = args->self;
  199. liscr_args_seti_float (args, liren_light_get_shadow_near (self));
  200. }
  201. static void Light_set_shadow_near (LIScrArgs* args)
  202. {
  203. float value;
  204. LIRenLight* self = args->self;
  205. if (liscr_args_geti_float (args, 0, &value))
  206. liren_light_set_shadow_near (self, LIMAT_MAX (value, LIMAT_EPSILON));
  207. }
  208. static void Light_get_specular (LIScrArgs* args)
  209. {
  210. float value[4];
  211. LIRenLight* light;
  212. light = args->self;
  213. liren_light_get_specular (light, value);
  214. liscr_args_set_output (args, LISCR_ARGS_OUTPUT_TABLE);
  215. liscr_args_seti_float (args, value[0]);
  216. liscr_args_seti_float (args, value[1]);
  217. liscr_args_seti_float (args, value[2]);
  218. liscr_args_seti_float (args, value[3]);
  219. }
  220. static void Light_set_specular (LIScrArgs* args)
  221. {
  222. int i;
  223. float value[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
  224. LIRenLight* light;
  225. light = args->self;
  226. for (i = 0 ; i < 4 ; i++)
  227. liscr_args_geti_float (args, i, value + i);
  228. liren_light_set_specular (light, value);
  229. }
  230. static void Light_get_spot_cutoff (LIScrArgs* args)
  231. {
  232. LIRenLight* self = args->self;
  233. liscr_args_seti_float (args, liren_light_get_spot_cutoff (self));
  234. }
  235. static void Light_set_spot_cutoff (LIScrArgs* args)
  236. {
  237. float value;
  238. LIRenLight* self = args->self;
  239. if (liscr_args_geti_float (args, 0, &value))
  240. liren_light_set_spot_cutoff (self, LIMAT_CLAMP (value, 0.0f, M_PI));
  241. }
  242. static void Light_get_spot_exponent (LIScrArgs* args)
  243. {
  244. LIRenLight* self = args->self;
  245. liscr_args_seti_float (args, liren_light_get_spot_exponent (self));
  246. }
  247. static void Light_set_spot_exponent (LIScrArgs* args)
  248. {
  249. float value;
  250. LIRenLight* self = args->self;
  251. if (liscr_args_geti_float (args, 0, &value))
  252. liren_light_set_spot_exponent (self, LIMAT_CLAMP (value, 0.0f, 127.0f));
  253. }
  254. /*****************************************************************************/
  255. void liext_script_light (
  256. LIScrScript* self)
  257. {
  258. liscr_script_insert_cfunc (self, LIEXT_SCRIPT_LIGHT, "light_new", Light_new);
  259. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_get_ambient", Light_get_ambient);
  260. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_get_diffuse", Light_get_diffuse);
  261. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_get_enabled", Light_get_enabled);
  262. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_get_equation", Light_get_equation);
  263. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_get_position", Light_get_position);
  264. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_get_priority", Light_get_priority);
  265. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_get_rotation", Light_get_rotation);
  266. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_get_shadow_casting", Light_get_shadow_casting);
  267. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_get_shadow_far", Light_get_shadow_far);
  268. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_get_shadow_near", Light_get_shadow_near);
  269. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_get_specular", Light_get_specular);
  270. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_get_spot_cutoff", Light_get_spot_cutoff);
  271. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_get_spot_exponent", Light_get_spot_exponent);
  272. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_ambient", Light_set_ambient);
  273. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_diffuse", Light_set_diffuse);
  274. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_enabled", Light_set_enabled);
  275. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_equation", Light_set_equation);
  276. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_position", Light_set_position);
  277. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_priority", Light_set_priority);
  278. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_rotation", Light_set_rotation);
  279. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_shadow_casting", Light_set_shadow_casting);
  280. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_shadow_far", Light_set_shadow_far);
  281. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_shadow_near", Light_set_shadow_near);
  282. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_specular", Light_set_specular);
  283. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_spot_cutoff", Light_set_spot_cutoff);
  284. liscr_script_insert_mfunc (self, LIEXT_SCRIPT_LIGHT, "light_set_spot_exponent", Light_set_spot_exponent);
  285. }
  286. /** @} */
  287. /** @} */