From de028fc056b26e03ee00324888f870f64e28c756 Mon Sep 17 00:00:00 2001 From: bigfoot547 Date: Fri, 5 May 2017 15:07:36 -0500 Subject: [CSM] Add camera API (#5609) * [CSM] Add camera API roper rebase & squash * Address nerzhul's review --- src/script/lua_api/CMakeLists.txt | 1 + src/script/lua_api/l_camera.cpp | 206 +++++++++++++++++++++++++++++++++++ src/script/lua_api/l_camera.h | 46 ++++++++ src/script/lua_api/l_localplayer.cpp | 49 --------- src/script/lua_api/l_localplayer.h | 7 -- src/script/scripting_client.cpp | 7 ++ src/script/scripting_client.h | 2 + 7 files changed, 262 insertions(+), 56 deletions(-) create mode 100644 src/script/lua_api/l_camera.cpp create mode 100644 src/script/lua_api/l_camera.h (limited to 'src/script') diff --git a/src/script/lua_api/CMakeLists.txt b/src/script/lua_api/CMakeLists.txt index b03e94a09..1a78580e6 100644 --- a/src/script/lua_api/CMakeLists.txt +++ b/src/script/lua_api/CMakeLists.txt @@ -29,4 +29,5 @@ set(client_SCRIPT_LUA_API_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/l_storage.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_sound.cpp ${CMAKE_CURRENT_SOURCE_DIR}/l_localplayer.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/l_camera.cpp PARENT_SCOPE) diff --git a/src/script/lua_api/l_camera.cpp b/src/script/lua_api/l_camera.cpp new file mode 100644 index 000000000..e6229ffe8 --- /dev/null +++ b/src/script/lua_api/l_camera.cpp @@ -0,0 +1,206 @@ +#include "script/common/c_converter.h" +#include "l_camera.h" +#include "l_internal.h" +#include "content_cao.h" +#include "camera.h" + +LuaCamera::LuaCamera(Camera *m) +{ + m_camera = m; +} + +void LuaCamera::create(lua_State *L, Camera *m) +{ + LuaCamera *o = new LuaCamera(m); + *(void **) (lua_newuserdata(L, sizeof(void *))) = o; + luaL_getmetatable(L, className); + lua_setmetatable(L, -2); + + int camera_object = lua_gettop(L); + + lua_getglobal(L, "core"); + luaL_checktype(L, -1, LUA_TTABLE); + int coretable = lua_gettop(L); + + lua_pushvalue(L, camera_object); + lua_setfield(L, coretable, "camera"); +} + +int LuaCamera::l_set_camera_mode(lua_State *L) +{ + Camera *camera = getobject(L, 1); + GenericCAO *playercao = getClient(L)->getEnv().getLocalPlayer()->getCAO(); + if (!camera) + return 0; + sanity_check(playercao); + if (!lua_isnumber(L, 2)) + return 0; + + camera->setCameraMode((CameraMode)((int)lua_tonumber(L, 2))); + playercao->setVisible(camera->getCameraMode() > CAMERA_MODE_FIRST); + playercao->setChildrenVisible(camera->getCameraMode() > CAMERA_MODE_FIRST); + return 0; +} + +int LuaCamera::l_get_camera_mode(lua_State *L) +{ + Camera *camera = getobject(L, 1); + if (!camera) + return 0; + + lua_pushnumber(L, (int)camera->getCameraMode()); + + return 1; +} + +int LuaCamera::l_get_fov(lua_State *L) +{ + Camera *camera = getobject(L, 1); + if (!camera) + return 0; + + lua_newtable(L); + lua_pushnumber(L, camera->getFovX() * core::DEGTORAD); + lua_setfield(L, -2, "x"); + lua_pushnumber(L, camera->getFovY() * core::DEGTORAD); + lua_setfield(L, -2, "y"); + lua_pushnumber(L, camera->getCameraNode()->getFOV() * core::RADTODEG); + lua_setfield(L, -2, "actual"); + lua_pushnumber(L, camera->getFovMax() * core::RADTODEG); + lua_setfield(L, -2, "max"); + return 1; +} + +int LuaCamera::l_get_pos(lua_State *L) +{ + Camera *camera = getobject(L, 1); + if (!camera) + return 0; + + push_v3f(L, camera->getPosition()); + return 1; +} + +int LuaCamera::l_get_offset(lua_State *L) +{ + Camera *camera = getobject(L, 1); + if (!camera) + return 0; + + push_v3s16(L, camera->getOffset()); + return 1; +} + +int LuaCamera::l_get_look_dir(lua_State *L) +{ + LocalPlayer *player = getClient(L)->getEnv().getLocalPlayer(); + sanity_check(player); + + float pitch = -1.0 * player->getPitch() * core::DEGTORAD; + float yaw = (player->getYaw() + 90.) * core::DEGTORAD; + v3f v(cos(pitch) * cos(yaw), sin(pitch), cos(pitch) * sin(yaw)); + + push_v3f(L, v); + return 1; +} + +int LuaCamera::l_get_look_horizontal(lua_State *L) +{ + LocalPlayer *player = getClient(L)->getEnv().getLocalPlayer(); + sanity_check(player); + + lua_pushnumber(L, (player->getYaw() + 90.) * core::DEGTORAD); + return 1; +} + +int LuaCamera::l_get_look_vertical(lua_State *L) +{ + LocalPlayer *player = getClient(L)->getEnv().getLocalPlayer(); + sanity_check(player); + + lua_pushnumber(L, -1.0 * player->getPitch() * core::DEGTORAD); + return 1; +} + +int LuaCamera::l_get_aspect_ratio(lua_State *L) +{ + Camera *camera = getobject(L, 1); + if (!camera) + return 0; + + lua_pushnumber(L, camera->getCameraNode()->getAspectRatio()); + return 1; +} + +LuaCamera *LuaCamera::checkobject(lua_State *L, int narg) +{ + luaL_checktype(L, narg, LUA_TUSERDATA); + + void *ud = luaL_checkudata(L, narg, className); + if (!ud) + luaL_typerror(L, narg, className); + + return *(LuaCamera **) ud; +} + +Camera *LuaCamera::getobject(LuaCamera *ref) +{ + return ref->m_camera; +} + +Camera *LuaCamera::getobject(lua_State *L, int narg) +{ + LuaCamera *ref = checkobject(L, narg); + assert(ref); + Camera *camera = getobject(ref); + if (!camera) + return NULL; + return camera; +} + +int LuaCamera::gc_object(lua_State *L) +{ + LuaCamera *o = *(LuaCamera **) (lua_touserdata(L, 1)); + delete o; + return 0; +} + +void LuaCamera::Register(lua_State *L) +{ + lua_newtable(L); + int methodtable = lua_gettop(L); + luaL_newmetatable(L, className); + int metatable = lua_gettop(L); + + lua_pushliteral(L, "__metatable"); + lua_pushvalue(L, methodtable); + lua_settable(L, metatable); + + lua_pushliteral(L, "__index"); + lua_pushvalue(L, methodtable); + lua_settable(L, metatable); + + lua_pushliteral(L, "__gc"); + lua_pushcfunction(L, gc_object); + lua_settable(L, metatable); + + lua_pop(L, 1); + + luaL_openlib(L, 0, methods, 0); + lua_pop(L, 1); +} + +const char LuaCamera::className[] = "Camera"; +const luaL_reg LuaCamera::methods[] = { + luamethod(LuaCamera, set_camera_mode), + luamethod(LuaCamera, get_camera_mode), + luamethod(LuaCamera, get_fov), + luamethod(LuaCamera, get_pos), + luamethod(LuaCamera, get_offset), + luamethod(LuaCamera, get_look_dir), + luamethod(LuaCamera, get_look_vertical), + luamethod(LuaCamera, get_look_horizontal), + luamethod(LuaCamera, get_aspect_ratio), + + {0, 0} +}; diff --git a/src/script/lua_api/l_camera.h b/src/script/lua_api/l_camera.h new file mode 100644 index 000000000..82ab6a47f --- /dev/null +++ b/src/script/lua_api/l_camera.h @@ -0,0 +1,46 @@ +#ifndef L_CAMERA_H +#define L_CAMERA_H + +#include "l_base.h" + +class Camera; + +class LuaCamera : public ModApiBase { +private: + + static const char className[]; + static const luaL_Reg methods[]; + + // garbage collector + static int gc_object(lua_State *L); + + static int l_set_camera_mode(lua_State *L); + static int l_get_camera_mode(lua_State *L); + + static int l_get_fov(lua_State *L); + + static int l_get_pos(lua_State *L); + static int l_get_offset(lua_State *L); + static int l_get_look_dir(lua_State *L); + static int l_get_look_vertical(lua_State *L); + static int l_get_look_horizontal(lua_State *L); + static int l_get_aspect_ratio(lua_State *L); + + Camera *m_camera; + +public: + + LuaCamera(Camera *m); + ~LuaCamera() {} + + static void create(lua_State *L, Camera *m); + + static LuaCamera *checkobject(lua_State *L, int narg); + static Camera *getobject(LuaCamera *ref); + static Camera *getobject(lua_State *L, int narg); + + static void Register(lua_State *L); + +}; + +#endif // L_CAMERA_H diff --git a/src/script/lua_api/l_localplayer.cpp b/src/script/lua_api/l_localplayer.cpp index 177df55f3..7ec4eaa62 100644 --- a/src/script/lua_api/l_localplayer.cpp +++ b/src/script/lua_api/l_localplayer.cpp @@ -203,34 +203,6 @@ int LuaLocalPlayer::l_get_breath(lua_State *L) return 1; } -int LuaLocalPlayer::l_get_look_dir(lua_State *L) -{ - LocalPlayer *player = getobject(L, 1); - - float pitch = -1.0 * player->getPitch() * core::DEGTORAD; - float yaw = (player->getYaw() + 90.) * core::DEGTORAD; - v3f v(cos(pitch) * cos(yaw), sin(pitch), cos(pitch) * sin(yaw)); - - push_v3f(L, v); - return 1; -} - -int LuaLocalPlayer::l_get_look_horizontal(lua_State *L) -{ - LocalPlayer *player = getobject(L, 1); - - lua_pushnumber(L, (player->getYaw() + 90.) * core::DEGTORAD); - return 1; -} - -int LuaLocalPlayer::l_get_look_vertical(lua_State *L) -{ - LocalPlayer *player = getobject(L, 1); - - lua_pushnumber(L, -1.0 * player->getPitch() * core::DEGTORAD); - return 1; -} - int LuaLocalPlayer::l_get_pos(lua_State *L) { LocalPlayer *player = getobject(L, 1); @@ -239,22 +211,6 @@ int LuaLocalPlayer::l_get_pos(lua_State *L) return 1; } -int LuaLocalPlayer::l_get_eye_pos(lua_State *L) -{ - LocalPlayer *player = getobject(L, 1); - - push_v3f(L, player->getEyePosition()); - return 1; -} - -int LuaLocalPlayer::l_get_eye_offset(lua_State *L) -{ - LocalPlayer *player = getobject(L, 1); - - push_v3f(L, player->getEyeOffset()); - return 1; -} - int LuaLocalPlayer::l_get_movement_acceleration(lua_State *L) { LocalPlayer *player = getobject(L, 1); @@ -393,12 +349,7 @@ const luaL_Reg LuaLocalPlayer::methods[] = { luamethod(LuaLocalPlayer, get_last_look_vertical), luamethod(LuaLocalPlayer, get_key_pressed), luamethod(LuaLocalPlayer, get_breath), - luamethod(LuaLocalPlayer, get_look_dir), - luamethod(LuaLocalPlayer, get_look_horizontal), - luamethod(LuaLocalPlayer, get_look_vertical), luamethod(LuaLocalPlayer, get_pos), - luamethod(LuaLocalPlayer, get_eye_pos), - luamethod(LuaLocalPlayer, get_eye_offset), luamethod(LuaLocalPlayer, get_movement_acceleration), luamethod(LuaLocalPlayer, get_movement_speed), luamethod(LuaLocalPlayer, get_movement), diff --git a/src/script/lua_api/l_localplayer.h b/src/script/lua_api/l_localplayer.h index 6ec3f4c09..e56ec808f 100644 --- a/src/script/lua_api/l_localplayer.h +++ b/src/script/lua_api/l_localplayer.h @@ -59,15 +59,8 @@ private: static int l_get_breath(lua_State *L); - static int l_get_look_dir(lua_State *L); - static int l_get_look_horizontal(lua_State *L); - static int l_get_look_vertical(lua_State *L); - static int l_get_pos(lua_State *L); - static int l_get_eye_pos(lua_State *L); - static int l_get_eye_offset(lua_State *L); - static int l_get_movement_acceleration(lua_State *L); static int l_get_movement_speed(lua_State *L); diff --git a/src/script/scripting_client.cpp b/src/script/scripting_client.cpp index 8ff5abcc4..b5a5085be 100644 --- a/src/script/scripting_client.cpp +++ b/src/script/scripting_client.cpp @@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_item.h" #include "lua_api/l_nodemeta.h" #include "lua_api/l_localplayer.h" +#include "lua_api/l_camera.h" ClientScripting::ClientScripting(Client *client): ScriptApiBase() @@ -71,6 +72,7 @@ void ClientScripting::InitializeModApi(lua_State *L, int top) LuaMinimap::Register(L); NodeMetaRef::RegisterClient(L); LuaLocalPlayer::Register(L); + LuaCamera::Register(L); } void ClientScripting::on_client_ready(LocalPlayer *localplayer) @@ -78,3 +80,8 @@ void ClientScripting::on_client_ready(LocalPlayer *localplayer) lua_State *L = getStack(); LuaLocalPlayer::create(L, localplayer); } + +void ClientScripting::on_camera_ready(Camera *camera) +{ + LuaCamera::create(getStack(), camera); +} diff --git a/src/script/scripting_client.h b/src/script/scripting_client.h index b3451e409..c13fde607 100644 --- a/src/script/scripting_client.h +++ b/src/script/scripting_client.h @@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., class Client; class LocalPlayer; +class Camera; class ClientScripting: virtual public ScriptApiBase, public ScriptApiSecurity, @@ -36,6 +37,7 @@ class ClientScripting: public: ClientScripting(Client *client); void on_client_ready(LocalPlayer *localplayer); + void on_camera_ready(Camera *camera); private: virtual void InitializeModApi(lua_State *L, int top); -- cgit v1.2.3