/src/bindings.c

https://gitlab.com/pendingchaos/WIP29 · C · 410 lines · 340 code · 55 blank · 15 comment · 103 complexity · 04caa1bf870c7386b699a0519d50a4fc MD5 · raw file

  1. #include "scripting.h"
  2. #include "scene.h"
  3. #include "bin.h"
  4. #include <lauxlib.h>
  5. #include <string.h>
  6. #if 0
  7. static l_metatable_t* vec3_class;
  8. static l_metatable_t* mat4_class;
  9. static l_metatable_t* plane_class;
  10. static l_metatable_t* frustum_class;
  11. static l_metatable_t* aabb_class;
  12. static l_metatable_t* sphere_class;
  13. static l_metatable_t* quat_class;
  14. static l_metatable_t* bin_class;
  15. static l_metatable_t* bin_texture_map_class;
  16. static l_metatable_t* bin_cubemap_map_class;
  17. static l_metatable_t* bin_shader_map_class;
  18. static l_metatable_t* bin_material_map_class;
  19. static l_metatable_t* bin_mesh_map_class;
  20. static l_metatable_t* bin_scene_map_class;
  21. static l_metatable_t* bin_texture_class;
  22. static l_metatable_t* bin_cubemap_class;
  23. static l_metatable_t* bin_shader_class;
  24. static l_metatable_t* bin_material_class;
  25. static l_metatable_t* bin_mesh_class;
  26. static l_metatable_t* bin_scene_class;
  27. static l_metatable_t* scene_class;
  28. static l_metatable_t* scene_object_class;
  29. static l_metatable_t* scene_mesh_obj_list_class;
  30. static int l_b_read(lua_State* state) {
  31. l_func_start(1, true);
  32. bin_t* bin = b_read(l_to_str(1));
  33. if (bin) {
  34. l_push_obj(bin_class, &bin);
  35. l_ptr_new(bin, bin_class);
  36. } else {
  37. lua_pushnil(state);
  38. }
  39. return 1;
  40. }
  41. static int l_b_write(lua_State* state) {
  42. l_func_start(2, true);
  43. bool res = b_write(l_to_str(2), l_validate_ptr(*(void**)l_to_obj(1, bin_class), NULL));
  44. lua_pushboolean(state, res);
  45. return 1;
  46. }
  47. static int l_b_del(lua_State* state) {
  48. l_func_start(1, false);
  49. bin_t* bin = l_validate_ptr(*(void**)l_to_obj(1, bin_class), NULL);
  50. b_del(bin);
  51. l_ptr_del(bin);
  52. return 0;
  53. }
  54. static int l_b_index(lua_State* state) {
  55. l_func_start(2, true);
  56. bin_t* bin = l_validate_ptr(*(void**)l_to_obj(1, bin_class), NULL);
  57. const char* name = l_to_str(2);
  58. if (!strcmp(name, "textures"))
  59. l_push_obj(bin_texture_map_class, &bin);
  60. else if (!strcmp(name, "cubemaps"))
  61. l_push_obj(bin_cubemap_map_class, &bin);
  62. else if (!strcmp(name, "shaders"))
  63. l_push_obj(bin_shader_map_class, &bin);
  64. else if (!strcmp(name, "materials"))
  65. l_push_obj(bin_material_map_class, &bin);
  66. else if (!strcmp(name, "meshes"))
  67. l_push_obj(bin_mesh_map_class, &bin);
  68. else if (!strcmp(name, "scenes"))
  69. l_push_obj(bin_scene_map_class, &bin);
  70. else if (!strcmp(name, "write"))
  71. lua_pushcfunction(state, &l_b_write);
  72. else if (!strcmp(name, "del"))
  73. lua_pushcfunction(state, &l_b_del);
  74. else
  75. lua_pushnil(state);
  76. return 1;
  77. }
  78. static int l_b_texture_map_index(lua_State* state) {
  79. l_func_start(2, true);
  80. bin_t* bin = l_validate_ptr(l_to_obj(1, bin_class), NULL);
  81. const char* name = l_to_str(2);
  82. b_texture_t* res = b_find_texture(bin, name);
  83. if (res) l_push_obj(bin_texture_class, &res);
  84. else lua_pushnil(state);
  85. return 1;
  86. }
  87. static int l_b_cubemap_map_index(lua_State* state) {
  88. l_func_start(2, true);
  89. bin_t* bin = l_validate_ptr(*(void**)l_to_obj(1, bin_class), NULL);
  90. const char* name = l_to_str(2);
  91. b_cubemap_t* res = b_find_cubemap(bin, name);
  92. if (res) l_push_obj(bin_cubemap_class, &res);
  93. else lua_pushnil(state);
  94. return 1;
  95. }
  96. static int l_b_shader_map_index(lua_State* state) {
  97. l_func_start(2, true);
  98. bin_t* bin = l_validate_ptr(*(void**)l_to_obj(1, bin_class), NULL);
  99. const char* name = l_to_str(2);
  100. b_shader_t* res = b_find_shader(bin, name);
  101. if (res) l_push_obj(bin_shader_class, &res);
  102. else lua_pushnil(state);
  103. return 1;
  104. }
  105. static int l_b_material_map_index(lua_State* state) {
  106. l_func_start(2, true);
  107. bin_t* bin = l_validate_ptr(*(void**)l_to_obj(1, bin_class), NULL);
  108. const char* name = l_to_str(2);
  109. b_material_t* res = b_find_material(bin, name);
  110. if (res) l_push_obj(bin_material_class, &res);
  111. else lua_pushnil(state);
  112. return 1;
  113. }
  114. static int l_b_mesh_map_index(lua_State* state) {
  115. l_func_start(2, true);
  116. bin_t* bin = l_validate_ptr(*(void**)l_to_obj(1, bin_class), NULL);
  117. const char* name = l_to_str(2);
  118. b_mesh_t* res = b_find_mesh(bin, name);
  119. if (res) l_push_obj(bin_mesh_class, &res);
  120. else lua_pushnil(state);
  121. return 1;
  122. }
  123. static int l_b_scene_map_index(lua_State* state) {
  124. l_func_start(2, true);
  125. bin_t* bin = l_validate_ptr(*(void**)l_to_obj(1, bin_class), NULL);
  126. const char* name = l_to_str(2);
  127. b_scene_t* res = b_find_scene(bin, name);
  128. if (res) l_push_obj(bin_scene_class, &res);
  129. else lua_pushnil(state);
  130. return 1;
  131. }
  132. static int l_s_create(lua_State* state) {
  133. l_func_start(2, true);
  134. bin_t* bin = l_validate_ptr(*(void**)l_to_obj(1, bin_class), NULL);
  135. b_scene_t* scene;
  136. if (lua_isnil(state, 2))
  137. scene = bin->scene_count ? &bin->scenes[0] : NULL;
  138. else
  139. scene = l_validate_ptr(*(void**)l_to_obj(2, bin_scene_class), NULL);
  140. if (scene) {
  141. s_scene_t* res = s_create(bin, scene);
  142. for (size_t i = 0; i < res->mesh_obj_count; i++)
  143. l_ptr_new(res->mesh_objs[i], scene_object_class);
  144. if (res->sun) l_ptr_new(res->sun, scene_object_class);
  145. l_push_obj(scene_class, &res);
  146. l_ptr_new(res, scene_class);
  147. } else {
  148. lua_pushnil(state);
  149. }
  150. return 1;
  151. }
  152. static int l_s_del(lua_State* state) {
  153. l_func_start(1, false);
  154. s_scene_t* scene = l_validate_ptr(*(void**)l_to_obj(1, scene_class), NULL);
  155. s_del(scene);
  156. l_ptr_del(scene);
  157. return 0;
  158. }
  159. static int l_s_create_mesh_obj(lua_State* state) {
  160. l_func_start(2, true);
  161. s_scene_t* scene = l_validate_ptr(*(void**)l_to_obj(1, scene_class), NULL);
  162. const char* name = l_to_str(2);
  163. b_mesh_t* mesh = l_validate_ptr(*(void**)l_to_obj(3, bin_mesh_class), NULL);
  164. //TODO
  165. //s_mesh_obj_t* obj = s_create_mesh_obj(scene, name, mesh);
  166. //l_push_obj(scene_object_class, &obj);
  167. //l_ptr_new(obj, scene_object_class);
  168. return 1;
  169. }
  170. static int l_s_create_sun_obj(lua_State* state) {
  171. l_func_start(1, true);
  172. s_scene_t* scene = l_validate_ptr(*(void**)l_to_obj(1, scene_class), NULL);
  173. const char* name = l_to_str(2);
  174. s_sun_obj_t* obj = s_create_sun_obj(scene, name);
  175. l_push_obj(scene_object_class, &obj);
  176. l_ptr_new(obj, scene_object_class);
  177. return 1;
  178. }
  179. static int l_s_del_obj(lua_State* state) {
  180. l_func_start(2, false);
  181. s_scene_t* scene = l_validate_ptr(*(void**)l_to_obj(1, scene_class), NULL);
  182. s_object_t* obj = l_validate_ptr(*(void**)l_to_obj(1, scene_object_class), NULL);
  183. s_del_obj(scene, obj);
  184. l_ptr_del(obj);
  185. return 0;
  186. }
  187. static int l_s_do_frame(lua_State* state) {
  188. l_func_start(1, false);
  189. s_scene_t* scene = l_validate_ptr(*(void**)l_to_obj(1, scene_class), NULL);
  190. m_vec3_t cam_pos = *(m_vec3_t*)l_to_obj(2, vec3_class);
  191. m_vec3_t cam_dir = *(m_vec3_t*)l_to_obj(3, vec3_class);
  192. m_vec3_t cam_up = *(m_vec3_t*)l_to_obj(4, vec3_class);
  193. float frametime = l_to_double(5);
  194. m_vec3_normalize(&cam_dir, &cam_dir);
  195. m_vec3_normalize(&cam_up, &cam_up);
  196. s_frame(scene, cam_pos, cam_dir, cam_up, frametime);
  197. return 0;
  198. }
  199. static int l_s_index(lua_State* state) {
  200. l_func_start(2, true);
  201. s_scene_t* scene = l_validate_ptr(*(void**)l_to_obj(1, scene_class), NULL);
  202. const char* name = l_to_str(2);
  203. if (!strcmp(name, "mesh_objs")) {
  204. l_push_obj(scene_mesh_obj_list_class, &scene);
  205. } else if (!strcmp(name, "sun")) {
  206. if (scene->sun) l_push_obj(scene_object_class, scene->sun);
  207. else lua_pushnil(state);
  208. } else if (!strcmp(name, "create_mesh_obj")) {
  209. lua_pushcfunction(state, &l_s_create_mesh_obj);
  210. } else if (!strcmp(name, "create_sun_obj")) {
  211. lua_pushcfunction(state, &l_s_create_sun_obj);
  212. } else if (!strcmp(name, "del_obj")) {
  213. lua_pushcfunction(state, &l_s_del_obj);
  214. } else if (!strcmp(name, "do_frame")) {
  215. lua_pushcfunction(state, &l_s_do_frame);
  216. } else if (!strcmp(name, "del")) {
  217. lua_pushcfunction(state, &l_s_del);
  218. } else {
  219. lua_pushnil(state);
  220. }
  221. return 1;
  222. }
  223. static int l_s_scene_obj_index(lua_State* state) {
  224. l_func_start(2, true);
  225. s_object_t* obj = l_validate_ptr(*(void**)l_to_obj(1, scene_object_class), NULL);
  226. const char* name = l_to_str(2);
  227. if (!strcmp(name, "name")) {
  228. lua_pushstring(state, obj->name);
  229. } else if (!strcmp(name, "type")) {
  230. switch (obj->type) {
  231. case S_OBJ_MESH: lua_pushstring(state, "mesh"); break;
  232. case S_OBJ_SUN: lua_pushstring(state, "sun"); break;
  233. case S_OBJ_SKY: lua_pushstring(state, "sky"); break;
  234. case S_OBJ_ACTOR: lua_pushstring(state, "actor"); break;
  235. }
  236. } else if (!strcmp(name, "pos")) {
  237. l_push_obj(vec3_class, &obj->pos);
  238. } else if (!strcmp(name, "scale")) {
  239. l_push_obj(vec3_class, &obj->scale);
  240. } else if (!strcmp(name, "orientation")) {
  241. l_push_obj(quat_class, &obj->orientation);
  242. } else if (!strcmp(name, "parent")) {
  243. if (obj->parent) l_push_obj(scene_object_class, &obj->parent);
  244. else lua_pushnil(state);
  245. } else if (!strcmp(name, "children")) {
  246. //TODO
  247. } else if (!strcmp(name, "visible_mesh") && obj->type==S_OBJ_MESH) {
  248. l_push_obj(bin_mesh_class, &((s_mesh_obj_t*)obj)->visible_mesh);
  249. } else if (!strcmp(name, "color") && obj->type==S_OBJ_SUN) {
  250. //TODO
  251. } else if (!strcmp(name, "intensity") && obj->type==S_OBJ_SUN) {
  252. lua_pushnumber(state, ((s_sun_obj_t*)state)->intensity);
  253. } else if (!strcmp(name, "skybox") && obj->type==S_OBJ_SKY) {
  254. //TODO
  255. } else {
  256. lua_pushnil(state);
  257. }
  258. return 1;
  259. }
  260. static int l_s_scene_obj_newindex(lua_State* state) {
  261. l_func_start(3, false);
  262. s_object_t* obj = l_validate_ptr(*(void**)l_to_obj(1, scene_object_class), NULL);
  263. const char* name = l_to_str(2);
  264. if (!strcmp(name, "name")) {
  265. const char* new = l_to_str(3);
  266. free(obj->name);
  267. obj->name = calloc(1, strlen(new)+1);
  268. strcpy(obj->name, new);
  269. } else if (!strcmp(name, "pos")) {
  270. obj->pos = *(m_vec3_t*)l_to_obj(3, vec3_class);
  271. } else if (!strcmp(name, "scale")) {
  272. obj->scale = *(m_vec3_t*)l_to_obj(3, vec3_class);
  273. } else if (!strcmp(name, "orientation")) {
  274. obj->orientation = *(m_quat_t*)l_to_obj(3, quat_class);
  275. } else if (!strcmp(name, "parent")) {
  276. if (lua_isnil(state, 3)) {
  277. s_set_parent(obj, NULL);
  278. } else {
  279. s_object_t* p = l_validate_ptr(*(void**)l_to_obj(3, scene_object_class), NULL);
  280. s_set_parent(obj, p);
  281. }
  282. } else if (!strcmp(name, "visible_mesh") && obj->type==S_OBJ_MESH) {
  283. ((s_mesh_obj_t*)obj)->visible_mesh = l_validate_ptr(*(void**)l_to_obj(3, bin_mesh_class), NULL);
  284. } else if (!strcmp(name, "color") && obj->type==S_OBJ_SUN) {
  285. //TODO
  286. } else if (!strcmp(name, "intensity") && obj->type==S_OBJ_SUN) {
  287. ((s_sun_obj_t*)state)->intensity = l_to_double(3);
  288. } else {
  289. luaL_error(state, "Attempted to set nonexistent field\n");
  290. }
  291. return 0;
  292. }
  293. static int l_s_mesh_obj_list_index(lua_State* state) {
  294. l_func_start(2, true);
  295. s_scene_t* scene = l_validate_ptr(*(void**)l_to_obj(1, scene_mesh_obj_list_class), NULL);
  296. size_t index = l_to_size_t(2);
  297. if (index<1 || index>scene->mesh_obj_count) lua_pushnil(state);
  298. else l_push_obj(scene_object_class, &scene->mesh_objs[index-1]);
  299. return 1;
  300. }
  301. static int l_s_mesh_obj_list_length(lua_State* state) {
  302. l_func_start(2, true);
  303. s_scene_t* scene = l_validate_ptr(*(void**)l_to_obj(1, scene_mesh_obj_list_class), NULL);
  304. lua_pushinteger(state, scene->mesh_obj_count);
  305. return 1;
  306. }
  307. void l_bindings_init() {
  308. vec3_class = l_register_metatable("Vec3", sizeof(m_vec3_t));
  309. //TODO
  310. mat4_class = l_register_metatable("Mat4", sizeof(m_mat4_t));
  311. //TODO
  312. plane_class = l_register_metatable("Plane", sizeof(m_plane_t));
  313. //TODO
  314. frustum_class = l_register_metatable("Frustum", sizeof(m_frustum_t));
  315. //TODO
  316. aabb_class = l_register_metatable("AABB", sizeof(m_aabb_t));
  317. //TODO
  318. sphere_class = l_register_metatable("Sphere", sizeof(m_sphere_t));
  319. //TODO
  320. quat_class = l_register_metatable("Quat", sizeof(m_quat_t));
  321. //TODO
  322. bin_class = l_register_metatable("Bin", sizeof(bin_t*));
  323. l_register_method(bin_class, "new", &l_b_read);
  324. l_register_method(bin_class, "__index", &l_b_index);
  325. bin_texture_map_class = l_register_metatable("BinTextureMap", sizeof(bin_t*));
  326. l_register_method(bin_texture_map_class, "__index", &l_b_texture_map_index);
  327. bin_cubemap_map_class = l_register_metatable("BinCubemapMap", sizeof(bin_t*));
  328. l_register_method(bin_cubemap_map_class, "__index", &l_b_cubemap_map_index);
  329. bin_shader_map_class = l_register_metatable("BinShaderMap", sizeof(bin_t*));
  330. l_register_method(bin_shader_map_class, "__index", &l_b_shader_map_index);
  331. bin_material_map_class = l_register_metatable("BinMaterialMap", sizeof(bin_t*));
  332. l_register_method(bin_material_map_class, "__index", &l_b_material_map_index);
  333. bin_mesh_map_class = l_register_metatable("BinMeshMap", sizeof(bin_t*));
  334. l_register_method(bin_mesh_map_class, "__index", &l_b_mesh_map_index);
  335. bin_scene_map_class = l_register_metatable("BinSceneMap", sizeof(bin_t*));
  336. l_register_method(bin_scene_map_class, "__index", &l_b_scene_map_index);
  337. bin_texture_class = l_register_metatable("BinTexture", sizeof(bin_t*));
  338. bin_cubemap_class = l_register_metatable("BinCubemap", sizeof(bin_t*));
  339. bin_shader_class = l_register_metatable("BinShader", sizeof(bin_t*));
  340. bin_material_class = l_register_metatable("BinMaterial", sizeof(bin_t*));
  341. bin_mesh_class = l_register_metatable("BinMesh", sizeof(bin_t*));
  342. bin_scene_class = l_register_metatable("BinScene", sizeof(bin_t*));
  343. scene_class = l_register_metatable("Scene", sizeof(s_scene_t*));
  344. l_register_method(scene_class, "new", &l_s_create);
  345. l_register_method(scene_class, "__index", &l_s_index);
  346. scene_object_class = l_register_metatable("SceneObject", sizeof(s_object_t*));
  347. l_register_method(scene_object_class, "__index", &l_s_scene_obj_index);
  348. l_register_method(scene_object_class, "__newindex", &l_s_scene_obj_newindex);
  349. scene_mesh_obj_list_class = l_register_metatable("SceneMeshObjectList", sizeof(s_scene_t*));
  350. l_register_method(scene_mesh_obj_list_class, "__index", &l_s_mesh_obj_list_index);
  351. l_register_method(scene_mesh_obj_list_class, "__len", &l_s_mesh_obj_list_length);
  352. }
  353. #else
  354. void l_bindings_init() {}
  355. #endif