121 lines
4.1 KiB
C++
121 lines
4.1 KiB
C++
#include "api_lua.hpp"
|
|
|
|
#include "../../../content/Content.hpp"
|
|
#include "../../../world/Level.hpp"
|
|
#include "../../../window/Camera.hpp"
|
|
|
|
#include <glm/ext.hpp>
|
|
|
|
using namespace scripting;
|
|
|
|
template<int(*getterfunc)(lua::State*, const Camera&)>
|
|
static int l_camera_getter(lua::State* L) {
|
|
size_t index = static_cast<size_t>(lua::tointeger(L, 1));
|
|
return getterfunc(L, *level->cameras.at(index));
|
|
}
|
|
|
|
template<void(*setterfunc)(lua::State*, Camera&, int)>
|
|
static int l_camera_setter(lua::State* L) {
|
|
size_t index = static_cast<size_t>(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<size_t>(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<size_t>(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<l_index>},
|
|
{"name", lua::wrap<l_name>},
|
|
{"get_pos", lua::wrap<l_camera_getter<getter_pos>>},
|
|
{"set_pos", lua::wrap<l_camera_setter<setter_pos>>},
|
|
{"get_rot", lua::wrap<l_camera_getter<getter_rot>>},
|
|
{"set_rot", lua::wrap<l_camera_setter<setter_rot>>},
|
|
{"get_zoom", lua::wrap<l_camera_getter<getter_zoom>>},
|
|
{"set_zoom", lua::wrap<l_camera_setter<setter_zoom>>},
|
|
{"get_fov", lua::wrap<l_camera_getter<getter_fov>>},
|
|
{"set_fov", lua::wrap<l_camera_setter<setter_fov>>},
|
|
{"is_perspective", lua::wrap<l_camera_getter<getter_perspective>>},
|
|
{"set_perspective", lua::wrap<l_camera_setter<setter_perspective>>},
|
|
{"is_flipped", lua::wrap<l_camera_getter<getter_flipped>>},
|
|
{"set_flipped", lua::wrap<l_camera_setter<setter_flipped>>},
|
|
{"get_front", lua::wrap<l_camera_getter<getter_front>>},
|
|
{"get_right", lua::wrap<l_camera_getter<getter_right>>},
|
|
{"get_up", lua::wrap<l_camera_getter<getter_up>>},
|
|
{"look_at", lua::wrap<l_look_at>},
|
|
{NULL, NULL}
|
|
};
|