lua_render_world.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. /*
  2. * Copyright (c) 2012-2016 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/taylor001/crown/blob/master/LICENSE
  4. */
  5. #include "quaternion.h"
  6. #include "render_world.h"
  7. #include "lua_stack.h"
  8. #include "lua_environment.h"
  9. namespace crown
  10. {
  11. struct LightInfo
  12. {
  13. const char* name;
  14. LightType::Enum type;
  15. };
  16. static LightInfo s_light[] =
  17. {
  18. { "directional", LightType::DIRECTIONAL },
  19. { "omni", LightType::OMNI },
  20. { "spot", LightType::SPOT }
  21. };
  22. CE_STATIC_ASSERT(CE_COUNTOF(s_light) == LightType::COUNT);
  23. static LightType::Enum name_to_light_type(LuaStack& stack, const char* name)
  24. {
  25. for (uint32_t i = 0; i < CE_COUNTOF(s_light); ++i)
  26. {
  27. if (strcmp(s_light[i].name, name) == 0)
  28. return s_light[i].type;
  29. }
  30. LUA_ASSERT(false, stack, "Unknown light type: %s", name);
  31. return LightType::COUNT;
  32. }
  33. static int render_world_create_mesh(lua_State* L)
  34. {
  35. LuaStack stack(L);
  36. RenderWorld* rw = stack.get_render_world(1);
  37. UnitId unit = stack.get_unit(2);
  38. MeshRendererDesc desc;
  39. desc.mesh_resource = stack.get_resource_id(3);
  40. desc.mesh_name = stack.get_string_id(4);
  41. desc.material_resource = stack.get_resource_id(5);
  42. desc.visible = stack.get_bool(6);
  43. stack.push_mesh_instance(rw->create_mesh(unit, desc, MATRIX4X4_IDENTITY));
  44. return 1;
  45. }
  46. static int render_world_destroy_mesh(lua_State* L)
  47. {
  48. LuaStack stack(L);
  49. stack.get_render_world(1)->destroy_mesh(stack.get_mesh_instance(2));
  50. return 0;
  51. }
  52. static int render_world_mesh_instances(lua_State* L)
  53. {
  54. LuaStack stack(L);
  55. RenderWorld* rw = stack.get_render_world(1);
  56. UnitId unit = stack.get_unit(2);
  57. MeshInstance inst = rw->first_mesh(unit);
  58. stack.push_table();
  59. for (uint32_t i = 0; rw->is_valid(inst); ++i, inst = rw->next_mesh(inst))
  60. {
  61. stack.push_key_begin(i+1);
  62. stack.push_mesh_instance(inst);
  63. stack.push_key_end();
  64. }
  65. return 1;
  66. }
  67. static int render_world_mesh_obb(lua_State* L)
  68. {
  69. LuaStack stack(L);
  70. OBB obb = stack.get_render_world(1)->mesh_obb(stack.get_mesh_instance(2));
  71. stack.push_matrix4x4(obb.tm);
  72. stack.push_vector3(obb.half_extents);
  73. return 2;
  74. }
  75. static int render_world_set_mesh_visible(lua_State* L)
  76. {
  77. LuaStack stack(L);
  78. stack.get_render_world(1)->set_mesh_visible(stack.get_mesh_instance(2), stack.get_bool(3));
  79. return 0;
  80. }
  81. static int render_world_create_sprite(lua_State* L)
  82. {
  83. LuaStack stack(L);
  84. RenderWorld* rw = stack.get_render_world(1);
  85. UnitId unit = stack.get_unit(2);
  86. SpriteRendererDesc desc;
  87. StringId64 sprite_resource = stack.get_resource_id(3);
  88. StringId64 material_resource = stack.get_resource_id(4);
  89. bool visible = stack.get_bool(5);
  90. stack.push_sprite_instance(rw->create_sprite(unit, desc, MATRIX4X4_IDENTITY));
  91. return 1;
  92. }
  93. static int render_world_destroy_sprite(lua_State* L)
  94. {
  95. LuaStack stack(L);
  96. stack.get_render_world(1)->destroy_sprite(stack.get_sprite_instance(2));
  97. return 0;
  98. }
  99. static int render_world_sprite_instances(lua_State* L)
  100. {
  101. LuaStack stack(L);
  102. RenderWorld* rw = stack.get_render_world(1);
  103. UnitId unit = stack.get_unit(2);
  104. SpriteInstance inst = rw->first_sprite(unit);
  105. stack.push_table();
  106. for (uint32_t i = 0; rw->is_valid(inst); ++i, inst = rw->next_sprite(inst))
  107. {
  108. stack.push_key_begin(i+1);
  109. stack.push_sprite_instance(inst);
  110. stack.push_key_end();
  111. }
  112. }
  113. static int render_world_set_sprite_visible(lua_State* L)
  114. {
  115. LuaStack stack(L);
  116. stack.get_render_world(1)->set_sprite_visible(stack.get_sprite_instance(2), stack.get_bool(3));
  117. return 0;
  118. }
  119. static int render_world_set_sprite_frame(lua_State* L)
  120. {
  121. LuaStack stack(L);
  122. stack.get_render_world(1)->set_sprite_frame(stack.get_sprite_instance(2), stack.get_int(3));
  123. return 0;
  124. }
  125. static int render_world_create_light(lua_State* L)
  126. {
  127. LuaStack stack(L);
  128. LightDesc ld;
  129. ld.type = LightType::DIRECTIONAL;
  130. ld.range = 1.0f;
  131. ld.intensity = 1.0f;
  132. ld.spot_angle = 20.0f;
  133. ld.color = vector3(1, 1, 1);
  134. stack.push_light_instance(stack.get_render_world(1)->create_light(stack.get_unit(2), ld, MATRIX4X4_IDENTITY));
  135. return 1;
  136. }
  137. static int render_world_destroy_light(lua_State* L)
  138. {
  139. LuaStack stack(L);
  140. stack.get_render_world(1)->destroy_light(stack.get_light_instance(2));
  141. return 0;
  142. }
  143. static int render_world_light_instances(lua_State* L)
  144. {
  145. LuaStack stack(L);
  146. stack.push_light_instance(stack.get_render_world(1)->light(stack.get_unit(2)));
  147. return 1;
  148. }
  149. static int render_world_light_type(lua_State* L)
  150. {
  151. LuaStack stack(L);
  152. LightType::Enum type = stack.get_render_world(1)->light_type(stack.get_light_instance(2));
  153. stack.push_string(s_light[type].name);
  154. return 1;
  155. }
  156. static int render_world_light_color(lua_State* L)
  157. {
  158. LuaStack stack(L);
  159. stack.push_color4(stack.get_render_world(1)->light_color(stack.get_light_instance(2)));
  160. return 1;
  161. }
  162. static int render_world_light_range(lua_State* L)
  163. {
  164. LuaStack stack(L);
  165. stack.push_float(stack.get_render_world(1)->light_range(stack.get_light_instance(2)));
  166. return 1;
  167. }
  168. static int render_world_light_intensity(lua_State* L)
  169. {
  170. LuaStack stack(L);
  171. stack.push_float(stack.get_render_world(1)->light_intensity(stack.get_light_instance(2)));
  172. return 1;
  173. }
  174. static int render_world_light_spot_angle(lua_State* L)
  175. {
  176. LuaStack stack(L);
  177. stack.push_float(stack.get_render_world(1)->light_spot_angle(stack.get_light_instance(2)));
  178. return 1;
  179. }
  180. static int render_world_set_light_type(lua_State* L)
  181. {
  182. LuaStack stack(L);
  183. stack.get_render_world(1)->set_light_type(stack.get_light_instance(2)
  184. , name_to_light_type(stack, stack.get_string(3))
  185. );
  186. return 0;
  187. }
  188. static int render_world_set_light_color(lua_State* L)
  189. {
  190. LuaStack stack(L);
  191. stack.get_render_world(1)->set_light_color(stack.get_light_instance(2), stack.get_color4(3));
  192. return 0;
  193. }
  194. static int render_world_set_light_range(lua_State* L)
  195. {
  196. LuaStack stack(L);
  197. stack.get_render_world(1)->set_light_range(stack.get_light_instance(2), stack.get_float(3));
  198. return 0;
  199. }
  200. static int render_world_set_light_intensity(lua_State* L)
  201. {
  202. LuaStack stack(L);
  203. stack.get_render_world(1)->set_light_intensity(stack.get_light_instance(2), stack.get_float(3));
  204. return 0;
  205. }
  206. static int render_world_set_light_spot_angle(lua_State* L)
  207. {
  208. LuaStack stack(L);
  209. stack.get_render_world(1)->set_light_spot_angle(stack.get_light_instance(2), stack.get_float(3));
  210. return 0;
  211. }
  212. static int render_world_enable_debug_drawing(lua_State* L)
  213. {
  214. LuaStack stack(L);
  215. stack.get_render_world(1)->enable_debug_drawing(stack.get_bool(2));
  216. return 0;
  217. }
  218. void load_render_world(LuaEnvironment& env)
  219. {
  220. env.load_module_function("RenderWorld", "create_mesh", render_world_create_mesh);
  221. env.load_module_function("RenderWorld", "destroy_mesh", render_world_destroy_mesh);
  222. env.load_module_function("RenderWorld", "mesh_instances", render_world_mesh_instances);
  223. env.load_module_function("RenderWorld", "mesh_obb", render_world_mesh_obb);
  224. env.load_module_function("RenderWorld", "set_mesh_visible", render_world_set_mesh_visible);
  225. env.load_module_function("RenderWorld", "create_sprite", render_world_create_sprite);
  226. env.load_module_function("RenderWorld", "destroy_sprite", render_world_destroy_sprite);
  227. env.load_module_function("RenderWorld", "sprite_instances", render_world_sprite_instances);
  228. env.load_module_function("RenderWorld", "set_sprite_frame", render_world_set_sprite_frame);
  229. env.load_module_function("RenderWorld", "set_sprite_visible", render_world_set_sprite_visible);
  230. env.load_module_function("RenderWorld", "create_light", render_world_create_light);
  231. env.load_module_function("RenderWorld", "destroy_light", render_world_destroy_light);
  232. env.load_module_function("RenderWorld", "light_instances", render_world_light_instances);
  233. env.load_module_function("RenderWorld", "light_type", render_world_light_type);
  234. env.load_module_function("RenderWorld", "light_color", render_world_light_color);
  235. env.load_module_function("RenderWorld", "light_range", render_world_light_range);
  236. env.load_module_function("RenderWorld", "light_intensity", render_world_light_intensity);
  237. env.load_module_function("RenderWorld", "light_spot_angle", render_world_light_spot_angle);
  238. env.load_module_function("RenderWorld", "set_light_type", render_world_set_light_type);
  239. env.load_module_function("RenderWorld", "set_light_color", render_world_set_light_color);
  240. env.load_module_function("RenderWorld", "set_light_range", render_world_set_light_range);
  241. env.load_module_function("RenderWorld", "set_light_intensity", render_world_set_light_intensity);
  242. env.load_module_function("RenderWorld", "set_light_spot_angle", render_world_set_light_spot_angle);
  243. env.load_module_function("RenderWorld", "enable_debug_drawing", render_world_enable_debug_drawing);
  244. }
  245. } // namespace crown