From 058daf6117b0c70f9bea7b720c05a522949b5982 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 22 Jul 2024 19:32:05 +0300 Subject: [PATCH] add camera:look_at optional interpolation parameter --- doc/en/scripting/builtins/libcameras.md | 3 +++ doc/ru/scripting/builtins/libcameras.md | 3 +++ res/scripts/classes.lua | 2 +- src/logic/scripting/lua/libcamera.cpp | 9 ++++++++- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/doc/en/scripting/builtins/libcameras.md b/doc/en/scripting/builtins/libcameras.md index 58e68ef0..e1222382 100644 --- a/doc/en/scripting/builtins/libcameras.md +++ b/doc/en/scripting/builtins/libcameras.md @@ -61,6 +61,9 @@ cam:get_up() -> vec3 -- makes camera look to a given point cam:look_at(point:vec3) + +-- makes camera look to a given point with given interpolation factor +cam:look_at(point: vec3, t: number) ``` Use player.set_camera to switch cameras. diff --git a/doc/ru/scripting/builtins/libcameras.md b/doc/ru/scripting/builtins/libcameras.md index 49d83e0b..753c47f3 100644 --- a/doc/ru/scripting/builtins/libcameras.md +++ b/doc/ru/scripting/builtins/libcameras.md @@ -61,6 +61,9 @@ cam:get_up() -> vec3 -- направляет камеру на заданную точку cam:look_at(point: vec3) + +-- направляет камеру на заданную точку с фактором интерполяции +cam:look_at(point: vec3, t: number) ``` Переключение камеры возможно через функцию player.set_camera. diff --git a/res/scripts/classes.lua b/res/scripts/classes.lua index 1b5de10a..1c2b0cba 100644 --- a/res/scripts/classes.lua +++ b/res/scripts/classes.lua @@ -16,7 +16,7 @@ local Camera = {__index={ get_front=function(self) return cameras.get_front(self.cid) end, get_right=function(self) return cameras.get_right(self.cid) end, get_up=function(self) return cameras.get_up(self.cid) end, - look_at=function(self, v) return cameras.look_at(self.cid, v) end, + look_at=function(self, v, f) return cameras.look_at(self.cid, v, f) end, }} local wrappers = {} diff --git a/src/logic/scripting/lua/libcamera.cpp b/src/logic/scripting/lua/libcamera.cpp index c81411ff..24aaeaf4 100644 --- a/src/logic/scripting/lua/libcamera.cpp +++ b/src/logic/scripting/lua/libcamera.cpp @@ -92,7 +92,14 @@ 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))); + auto matrix = glm::inverse(glm::lookAt(glm::vec3(), center-camera.position, glm::vec3(0, 1, 0))); + if (lua::isnumber(L, 3)) { + matrix = glm::mat4_cast(glm::slerp( + glm::quat(camera.rotation), + glm::quat(matrix), + static_cast(lua::tonumber(L, 3)))); + } + camera.rotation = matrix; camera.updateVectors(); return 0; }