From d9672f7d468338cb2e96e775b8494dc85131a546 Mon Sep 17 00:00:00 2001 From: Josquin Frei Date: Mon, 10 Jan 2022 12:42:03 +0000 Subject: [PATCH] Add serialization for TransformM and TransformQ --- AUTHORS.md | 1 + .../lua/test_serialization.cpp | 30 ++++++++++++++ components/lua/serialization.cpp | 40 +++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 67be756f33..2ddaa03cf6 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -115,6 +115,7 @@ Programmers John Blomberg (fstp) Jordan Ayers Jordan Milne + Josquin Frei Josua Grawitter Jules Blok (Armada651) julianko diff --git a/apps/openmw_test_suite/lua/test_serialization.cpp b/apps/openmw_test_suite/lua/test_serialization.cpp index 9300e4571b..57a1070c83 100644 --- a/apps/openmw_test_suite/lua/test_serialization.cpp +++ b/apps/openmw_test_suite/lua/test_serialization.cpp @@ -1,10 +1,13 @@ #include "gmock/gmock.h" #include +#include +#include #include #include #include +#include #include @@ -104,6 +107,33 @@ namespace } } + TEST(LuaSerializationTest, Transform) { + sol::state lua; + osg::Matrixf matrix(1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16); + LuaUtil::TransformM transM = LuaUtil::asTransform(matrix); + osg::Quat quat(1, 2, 3, 4); + LuaUtil::TransformQ transQ = LuaUtil::asTransform(quat); + + { + std::string serialized = LuaUtil::serialize(sol::make_object(lua, transM)); + EXPECT_EQ(serialized.size(), 130); // version, type, 16x double + sol::object value = LuaUtil::deserialize(lua, serialized); + ASSERT_TRUE(value.is()); + EXPECT_EQ(value.as().mM, transM.mM); + } + { + std::string serialized = LuaUtil::serialize(sol::make_object(lua, transQ)); + EXPECT_EQ(serialized.size(), 34); // version, type, 4x double + sol::object value = LuaUtil::deserialize(lua, serialized); + ASSERT_TRUE(value.is()); + EXPECT_EQ(value.as().mQ, transQ.mQ); + } + + } + TEST(LuaSerializationTest, Table) { sol::state lua; diff --git a/components/lua/serialization.cpp b/components/lua/serialization.cpp index f9b8951e4e..8b18294449 100644 --- a/components/lua/serialization.cpp +++ b/components/lua/serialization.cpp @@ -1,11 +1,15 @@ #include "serialization.hpp" +#include +#include #include #include +#include #include #include "luastate.hpp" +#include "utilpackage.hpp" namespace LuaUtil { @@ -22,6 +26,8 @@ namespace LuaUtil VEC2 = 0x10, VEC3 = 0x11, + TRANSFORM_M = 0x12, + TRANSFORM_Q = 0x13, // All values should be lesser than 0x20 (SHORT_STRING_FLAG). }; @@ -106,6 +112,23 @@ namespace LuaUtil appendValue(out, v.z()); return; } + if (data.is()) + { + appendType(out, SerializedType::TRANSFORM_M); + osg::Matrixf matrix = data.as().mM; + for (size_t i = 0; i < 4; i++) + for (size_t j = 0; j < 4; j++) + appendValue(out, matrix(i,j)); + return; + } + if (data.is()) + { + appendType(out, SerializedType::TRANSFORM_Q); + osg::Quat quat = data.as().mQ; + for(size_t i = 0; i < 4; i++) + appendValue(out, quat[i]); + return; + } if (customSerializer && customSerializer->serialize(out, data)) return; else @@ -231,6 +254,23 @@ namespace LuaUtil sol::stack::push(lua, osg::Vec3f(x, y, z)); return; } + case SerializedType::TRANSFORM_M: + { + osg::Matrixf mat; + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + mat(i, j) = getValue(binaryData); + sol::stack::push(lua, asTransform(mat)); + return; + } + case SerializedType::TRANSFORM_Q: + { + osg::Quat q; + for (int i = 0; i < 4; i++) + q[i] = getValue(binaryData); + sol::stack::push(lua, asTransform(q)); + return; + } } throw std::runtime_error("Unknown type in serialized data: " + std::to_string(type)); }