From 11a92a54b211ce11c16215f60f728a1075ef75de Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 6 Sep 2025 11:37:06 +0300 Subject: [PATCH] add vecn.mix --- res/modules/internal/maths_inline.lua | 28 ++++++++++++++++++++++++ src/logic/scripting/lua/libs/libvecn.cpp | 17 ++++++++++++++ src/logic/scripting/lua/lua_util.hpp | 14 ++++++------ 3 files changed, 52 insertions(+), 7 deletions(-) diff --git a/res/modules/internal/maths_inline.lua b/res/modules/internal/maths_inline.lua index e3e37fcd..36c0aecf 100644 --- a/res/modules/internal/maths_inline.lua +++ b/res/modules/internal/maths_inline.lua @@ -110,6 +110,21 @@ function vec3.dot(a, b) return a[1] * b[1] + a[2] * b[2] + a[3] * b[3] end +function vec3.mix(a, b, t, dest) + if dest then + dest[1] = a[1] * (1.0 - t) + b[1] * t + dest[2] = a[2] * (1.0 - t) + b[2] * t + dest[3] = a[3] * (1.0 - t) + b[3] * t + return dest + else + return { + a[1] * (1.0 - t) + b[1] * t, + a[2] * (1.0 - t) + b[2] * t, + a[3] * (1.0 - t) + b[3] * t, + } + end +end + -- =================================================== -- -- ====================== vec2 ======================= -- -- =================================================== -- @@ -210,3 +225,16 @@ end function vec2.dot(a, b) return a[1] * b[1] + a[2] * b[2] end + +function vec2.mix(a, b, t, dest) + if dest then + dest[1] = a[1] * (1.0 - t) + b[1] * t + dest[2] = a[2] * (1.0 - t) + b[2] * t + return dest + else + return { + a[1] * (1.0 - t) + b[1] * t, + a[2] * (1.0 - t) + b[2] * t, + } + end +end diff --git a/src/logic/scripting/lua/libs/libvecn.cpp b/src/logic/scripting/lua/libs/libvecn.cpp index 000a4367..0533525b 100644 --- a/src/logic/scripting/lua/libs/libvecn.cpp +++ b/src/logic/scripting/lua/libs/libvecn.cpp @@ -15,6 +15,20 @@ inline T angle(glm::vec<2, T> vec) { return val; } +template +static int l_mix(lua::State* L) { + uint argc = lua::check_argc(L, 3, 4); + auto a = lua::tovec(L, 1); + auto b = lua::tovec(L, 2); + auto t = lua::tonumber(L, 3); + + if (argc == 3) { + return lua::pushvec(L, a * (1.0 - t) + b * t); + } else { + return lua::setvec(L, 4, a * (1.0 - t) + b * t); + } +} + template class Op> static int l_binop(lua::State* L) { uint argc = lua::check_argc(L, 2, 3); @@ -200,6 +214,7 @@ const luaL_Reg vec2lib[] = { {"pow", lua::wrap>}, {"dot", lua::wrap>}, {"angle", lua::wrap}, + {"mix", lua::wrap>}, {NULL, NULL}}; const luaL_Reg vec3lib[] = { @@ -217,6 +232,7 @@ const luaL_Reg vec3lib[] = { {"pow", lua::wrap>}, {"dot", lua::wrap>}, {"spherical_rand", lua::wrap}, + {"mix", lua::wrap>}, {NULL, NULL}}; const luaL_Reg vec4lib[] = { @@ -233,4 +249,5 @@ const luaL_Reg vec4lib[] = { {"inverse", lua::wrap>}, {"pow", lua::wrap>}, {"dot", lua::wrap>}, + {"mix", lua::wrap>}, {NULL, NULL}}; diff --git a/src/logic/scripting/lua/lua_util.hpp b/src/logic/scripting/lua/lua_util.hpp index 7d545d49..54b6f678 100644 --- a/src/logic/scripting/lua/lua_util.hpp +++ b/src/logic/scripting/lua/lua_util.hpp @@ -48,8 +48,8 @@ namespace lua { return true; } - template - inline int pushvec(lua::State* L, const glm::vec& vec) { + template + inline int pushvec(lua::State* L, const glm::vec& vec) { createtable(L, n, 0); for (int i = 0; i < n; i++) { pushnumber(L, vec[i]); @@ -161,8 +161,8 @@ namespace lua { } return 1; } - template - inline int setvec(lua::State* L, int idx, glm::vec vec) { + template + inline int setvec(lua::State* L, int idx, glm::vec vec) { pushvalue(L, idx); for (int i = 0; i < n; i++) { pushnumber(L, vec[i]); @@ -305,15 +305,15 @@ namespace lua { setglobal(L, name); } - template - inline glm::vec tovec(lua::State* L, int idx) { + template + inline glm::vec tovec(lua::State* L, int idx) { pushvalue(L, idx); if (!istable(L, idx) || objlen(L, idx) < n) { throw std::runtime_error( "value must be an array of " + std::to_string(n) + " numbers" ); } - glm::vec vec; + glm::vec vec; for (int i = 0; i < n; i++) { rawgeti(L, i + 1); vec[i] = tonumber(L, -1);