diff --git a/apps/components_tests/lua/test_utilpackage.cpp b/apps/components_tests/lua/test_utilpackage.cpp index a61c0e0306..3eb22a9a46 100644 --- a/apps/components_tests/lua/test_utilpackage.cpp +++ b/apps/components_tests/lua/test_utilpackage.cpp @@ -49,10 +49,6 @@ namespace EXPECT_TRUE(get(lua, "ediv0.x == math.huge and ediv0.y ~= ediv0.y")); EXPECT_TRUE(get(lua, "util.vector2(1, 2):emul(util.vector2(3, 4)) == util.vector2(3, 8)")); EXPECT_TRUE(get(lua, "util.vector2(4, 6):ediv(util.vector2(2, 3)) == util.vector2(2, 2)")); - lua.safe_script("swizzle = util.vector2(1, 2)"); - EXPECT_TRUE(get(lua, "swizzle.xx == util.vector2(1, 1) and swizzle.yy == util.vector2(2, 2)")); - EXPECT_TRUE(get(lua, "swizzle.y0 == util.vector2(2, 0) and swizzle.x1 == util.vector2(1, 1)")); - EXPECT_TRUE(get(lua, "swizzle['01'] == util.vector2(0, 1) and swizzle['0y'] == util.vector2(0, 2)")); } TEST(LuaUtilPackageTest, Vector3) @@ -86,12 +82,6 @@ namespace EXPECT_TRUE(get(lua, "ediv0.z == math.huge")); EXPECT_TRUE(get(lua, "util.vector3(1, 2, 3):emul(util.vector3(3, 4, 5)) == util.vector3(3, 8, 15)")); EXPECT_TRUE(get(lua, "util.vector3(4, 6, 8):ediv(util.vector3(2, 3, 4)) == util.vector3(2, 2, 2)")); - lua.safe_script("swizzle = util.vector3(1, 2, 3)"); - EXPECT_TRUE(get(lua, "swizzle.xxx == util.vector3(1, 1, 1)")); - EXPECT_TRUE(get(lua, "swizzle.xyz == swizzle.zyx.zyx")); - EXPECT_TRUE(get(lua, "swizzle.xy0 == util.vector3(1, 2, 0) and swizzle.x11 == util.vector3(1, 1, 1)")); - EXPECT_TRUE( - get(lua, "swizzle['001'] == util.vector3(0, 0, 1) and swizzle['0yx'] == util.vector3(0, 2, 1)")); } TEST(LuaUtilPackageTest, Vector4) @@ -126,14 +116,6 @@ namespace get(lua, "util.vector4(1, 2, 3, 4):emul(util.vector4(3, 4, 5, 6)) == util.vector4(3, 8, 15, 24)")); EXPECT_TRUE( get(lua, "util.vector4(4, 6, 8, 9):ediv(util.vector4(2, 3, 4, 3)) == util.vector4(2, 2, 2, 3)")); - lua.safe_script("swizzle = util.vector4(1, 2, 3, 4)"); - EXPECT_TRUE(get(lua, "swizzle.wwww == util.vector4(4, 4, 4, 4)")); - EXPECT_TRUE(get(lua, "swizzle.xyzw == util.vector4(1, 2, 3, 4)")); - EXPECT_TRUE(get(lua, "swizzle.xyzw == swizzle.wzyx.wzyx")); - EXPECT_TRUE( - get(lua, "swizzle.xyz0 == util.vector4(1, 2, 3, 0) and swizzle.w110 == util.vector4(4, 1, 1, 0)")); - EXPECT_TRUE(get( - lua, "swizzle['0001'] == util.vector4(0, 0, 0, 1) and swizzle['0yx1'] == util.vector4(0, 2, 1, 1)")); } TEST(LuaUtilPackageTest, Color) diff --git a/components/lua/utilpackage.cpp b/components/lua/utilpackage.cpp index 2f223f4f44..7ab74d1293 100644 --- a/components/lua/utilpackage.cpp +++ b/components/lua/utilpackage.cpp @@ -56,81 +56,6 @@ namespace LuaUtil { namespace { - template - float zero(const T& v) - { - return 0.f; - }; - - template - float one(const T& v) - { - return 1.f; - }; - - template - float get(const T& v) - { - return v[I]; - } - - // Creates bindings for all possible permutations (repetition allowed) of x,y,z,w fields - template - void addSwizzleFields(sol::usertype& type) - { - // Generate mapping of swizzle characters to their getter functions - constexpr auto components = []() { - std::array, T::num_components + 2> arr; - - // 0/1 Components - arr[T::num_components] = { '0', zero }; - arr[T::num_components + 1] = { '1', one }; - - // x,y,z,w components - if constexpr (T::num_components > 1) - { - arr[0] = { 'x', get }; - arr[1] = { 'y', get }; - } - - if constexpr (T::num_components > 2) - arr[2] = { 'z', get }; - - if constexpr (T::num_components > 3) - arr[3] = { 'w', get }; - - return arr; - }(); - - // Iterate over the permutations - for (const auto [comp1, func1] : components) - { - // Single component swizzle - type[std::string{ comp1 }] = sol::readonly_property([=](const T& v) { return func1(v); }); - - for (const auto [comp2, func2] : components) - { - // Two component swizzles - type[std::string{ comp1, comp2 }] - = sol::readonly_property([=](const T& v) { return Vec2(func1(v), func2(v)); }); - - for (const auto [comp3, func3] : components) - { - // Three component swizzles - type[std::string{ comp1, comp2, comp3 }] - = sol::readonly_property([=](const T& v) { return Vec3(func1(v), func2(v), func3(v)); }); - - for (const auto [comp4, func4] : components) - { - // Four component swizzles - type[std::string{ comp1, comp2, comp3, comp4 }] = sol::readonly_property( - [=](const T& v) { return Vec4(func1(v), func2(v), func3(v), func4(v)); }); - } - } - } - } - } - template void addVectorMethods(sol::usertype& vectorType) { @@ -172,8 +97,6 @@ namespace LuaUtil ss << ")"; return ss.str(); }; - - addSwizzleFields(vectorType); } } @@ -185,12 +108,17 @@ namespace LuaUtil // Lua bindings for Vec2 util["vector2"] = [](float x, float y) { return Vec2(x, y); }; sol::usertype vec2Type = lua.new_usertype("Vec2"); + vec2Type["x"] = sol::readonly_property([](const Vec2& v) -> float { return v.x(); }); + vec2Type["y"] = sol::readonly_property([](const Vec2& v) -> float { return v.y(); }); addVectorMethods(vec2Type); vec2Type["rotate"] = &Misc::rotateVec2f; // Lua bindings for Vec3 util["vector3"] = [](float x, float y, float z) { return Vec3(x, y, z); }; sol::usertype vec3Type = lua.new_usertype("Vec3"); + vec3Type["x"] = sol::readonly_property([](const Vec3& v) -> float { return v.x(); }); + vec3Type["y"] = sol::readonly_property([](const Vec3& v) -> float { return v.y(); }); + vec3Type["z"] = sol::readonly_property([](const Vec3& v) -> float { return v.z(); }); addVectorMethods(vec3Type); vec3Type[sol::meta_function::involution] = [](const Vec3& a, const Vec3& b) { return a ^ b; }; vec3Type["cross"] = [](const Vec3& a, const Vec3& b) { return a ^ b; }; @@ -198,6 +126,10 @@ namespace LuaUtil // Lua bindings for Vec4 util["vector4"] = [](float x, float y, float z, float w) { return Vec4(x, y, z, w); }; sol::usertype vec4Type = lua.new_usertype("Vec4"); + vec4Type["x"] = sol::readonly_property([](const Vec4& v) -> float { return v.x(); }); + vec4Type["y"] = sol::readonly_property([](const Vec4& v) -> float { return v.y(); }); + vec4Type["z"] = sol::readonly_property([](const Vec4& v) -> float { return v.z(); }); + vec4Type["w"] = sol::readonly_property([](const Vec4& v) -> float { return v.w(); }); addVectorMethods(vec4Type); // Lua bindings for Box @@ -402,4 +334,5 @@ namespace LuaUtil return util; } + } diff --git a/files/lua_api/openmw/util.lua b/files/lua_api/openmw/util.lua index 9c6fd7985e..98d46096f4 100644 --- a/files/lua_api/openmw/util.lua +++ b/files/lua_api/openmw/util.lua @@ -94,7 +94,6 @@ -- @type Vector2 -- @field #number x -- @field #number y --- @field #string xy01 swizzle support, any combination of fields can be used to construct a new vector including the 0/1 constants -- @usage -- v = util.vector2(3, 4) -- v.x, v.y -- 3.0, 4.0 @@ -109,9 +108,6 @@ -- v1 - v2 -- vector subtraction -- v1 * x -- multiplication by a number -- v1 / x -- division by a number --- v1.xx, v1.xyx -- swizzle with standard fields --- v1.y1y, v1.x00 -- swizzle with 0/1 constant --- v1['0xy'] -- swizzle with 0/1 constant starting with 0 or 1 --- -- Creates a new 2D vector. Vectors are immutable and can not be changed after creation. @@ -199,7 +195,6 @@ -- @field #number x -- @field #number y -- @field #number z --- @field #string xyz01 swizzle support, any combination of fields can be used to construct a new vector including the 0/1 constants -- @usage -- v = util.vector3(3, 4, 5) -- v.x, v.y, v.z -- 3.0, 4.0, 5.0 @@ -215,9 +210,6 @@ -- v1 - v2 -- vector subtraction -- v1 * x -- multiplication by a number -- v1 / x -- division by a number --- v1.zyz, v1.yx -- swizzle with standard fields --- v1.w1y, v1.z0z -- swizzle with 0/1 constant --- v1['0xy'] -- swizzle with 0/1 constant starting with 0 or 1 --- -- Creates a new 3D vector. Vectors are immutable and can not be changed after creation. @@ -312,23 +304,19 @@ -- @field #number y -- @field #number z -- @field #number w --- @field #string xyzw01 swizzle support, any combination of fields can be used to construct a new vector including the 0/1 constants -- @usage -- v = util.vector4(3, 4, 5, 6) -- v.x, v.y, v.z, v.w -- 3.0, 4.0, 5.0, 6.0 --- str(v) -- "(3.0, 4.0, 5.0, 6.0)" --- v:length() -- length --- v:length2() -- square of the length --- v:normalize() -- normalized vector --- v1:dot(v2) -- dot product (returns a number) --- v1 * v2 -- dot product (returns a number) --- v1 + v2 -- vector addition --- v1 - v2 -- vector subtraction --- v1 * x -- multiplication by a number --- v1 / x -- division by a number --- v1.zyz, v1.wwwx -- swizzle with standard fields --- v1.w1, v1.z000 -- swizzle with 0/1 constant --- v1['000w'] -- swizzle with 0/1 constant starting with 0 or 1 +-- str(v) -- "(3.0, 4.0, 5.0, 6.0)" +-- v:length() -- length +-- v:length2() -- square of the length +-- v:normalize() -- normalized vector +-- v1:dot(v2) -- dot product (returns a number) +-- v1 * v2 -- dot product (returns a number) +-- v1 + v2 -- vector addition +-- v1 - v2 -- vector subtraction +-- v1 * x -- multiplication by a number +-- v1 / x -- division by a number --- -- Creates a new 4D vector. Vectors are immutable and can not be changed after creation.