#include "api_lua.hpp" #include "../../../content/Content.hpp" #include "../../../world/Level.hpp" #include "../../../window/Camera.hpp" #include using namespace scripting; template static int l_camera_getter(lua::State* L) { size_t index = static_cast(lua::tointeger(L, 1)); return getterfunc(L, *level->cameras.at(index)); } template static int l_camera_setter(lua::State* L) { size_t index = static_cast(lua::tointeger(L, 1)); setterfunc(L, *level->cameras.at(index), 2); return 0; } static int l_index(lua::State* L) { auto name = lua::require_string(L, 1); auto& indices = content->getIndices(ResourceType::CAMERA); return lua::pushinteger(L, indices.indexOf(name)); } static int l_name(lua::State* L) { size_t index = static_cast(lua::tointeger(L, 1)); auto& indices = content->getIndices(ResourceType::CAMERA); return lua::pushstring(L, indices.getName(index)); } static int getter_pos(lua::State* L, const Camera& camera) { return lua::pushvec3(L, camera.position); } static void setter_pos(lua::State* L, Camera& camera, int idx) { camera.position = lua::tovec<3>(L, idx); } static int getter_rot(lua::State* L, const Camera& camera) { return lua::pushmat4(L, camera.rotation); } static void setter_rot(lua::State* L, Camera& camera, int idx) { camera.rotation = lua::tomat4(L, idx); camera.updateVectors(); } static int getter_zoom(lua::State* L, const Camera& camera) { return lua::pushnumber(L, camera.zoom); } static void setter_zoom(lua::State* L, Camera& camera, int idx) { camera.zoom = lua::tonumber(L, idx); } static int getter_fov(lua::State* L, const Camera& camera) { return lua::pushnumber(L, camera.getFov()); } static void setter_fov(lua::State* L, Camera& camera, int idx) { camera.setFov(lua::tonumber(L, idx)); } static int getter_perspective(lua::State* L, const Camera& camera) { return lua::pushboolean(L, camera.perspective); } static void setter_perspective(lua::State* L, Camera& camera, int idx) { camera.perspective = lua::toboolean(L, idx); } static int getter_flipped(lua::State* L, const Camera& camera) { return lua::pushboolean(L, camera.flipped); } static void setter_flipped(lua::State* L, Camera& camera, int idx) { camera.flipped = lua::toboolean(L, idx); } static int getter_front(lua::State* L, const Camera& camera) { return lua::pushvec3(L, camera.front); } static int getter_right(lua::State* L, const Camera& camera) { return lua::pushvec3(L, camera.right); } static int getter_up(lua::State* L, const Camera& camera) { return lua::pushvec3(L, camera.up); } static int l_look_at(lua::State* L) { size_t index = static_cast(lua::tointeger(L, 1)); auto& camera = *level->cameras.at(index); auto center = lua::tovec<3>(L, 2); camera.rotation = glm::inverse(glm::lookAt(glm::vec3(), center-camera.position, glm::vec3(0, 1, 0))); camera.updateVectors(); return 0; } const luaL_Reg cameralib [] = { {"index", lua::wrap}, {"name", lua::wrap}, {"get_pos", lua::wrap>}, {"set_pos", lua::wrap>}, {"get_rot", lua::wrap>}, {"set_rot", lua::wrap>}, {"get_zoom", lua::wrap>}, {"set_zoom", lua::wrap>}, {"get_fov", lua::wrap>}, {"set_fov", lua::wrap>}, {"is_perspective", lua::wrap>}, {"set_perspective", lua::wrap>}, {"is_flipped", lua::wrap>}, {"set_flipped", lua::wrap>}, {"get_front", lua::wrap>}, {"get_right", lua::wrap>}, {"get_up", lua::wrap>}, {"look_at", lua::wrap}, {NULL, NULL} };