diff --git a/src/core/serialize/serialize_imagebuffer.h b/src/core/serialize/serialize_imagebuffer.h index c551708d..4f9069e3 100644 --- a/src/core/serialize/serialize_imagebuffer.h +++ b/src/core/serialize/serialize_imagebuffer.h @@ -25,6 +25,8 @@ #ifndef SPLASH_SERIALIZE_IMAGEBUFFER_H #define SPLASH_SERIALIZE_IMAGEBUFFER_H +#include + #include "./core/serializer.h" #include "./core/imagebuffer.h" diff --git a/src/core/serialize/serialize_mesh.h b/src/core/serialize/serialize_mesh.h new file mode 100644 index 00000000..64b957bc --- /dev/null +++ b/src/core/serialize/serialize_mesh.h @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2021 Emmanuel Durand + * + * This file is part of Splash. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Splash is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Splash. If not, see . + */ + +/* + * @serialize_mesh.h + * Implements serialization of Mesh + */ + +#ifndef SPLASH_SERIALIZE_MESH_H +#define SPLASH_SERIALIZE_MESH_H + +#include + +#include + +#include "./core/serializer.h" +#include "./mesh/mesh.h" + +namespace Splash::Serial::detail +{ + +/*************/ +template +struct getSizeHelper::value>::type> +{ + static uint32_t value(const T& /*obj*/) + { + return 2 * sizeof(float); + } +}; + +template +struct serializeHelper::value>::type> +{ + static void apply(const T& obj, std::vector::iterator& it) + { + const auto data = reinterpret_cast(&obj); + const auto size = 2 * sizeof(float); + std::copy(data, data + size, it); + it += size; + } +}; + +template +struct deserializeHelper::value>::type> +{ + static T apply(std::vector::const_iterator& it) + { + T vector; + auto data = reinterpret_cast(&vector); + const auto size = 2 * sizeof(float); + std::copy(it, it + size, data); + it += size; + return vector; + } +}; + +/*************/ +template +struct getSizeHelper::value>::type> +{ + static uint32_t value(const T& /*obj*/) + { + return 4 * sizeof(float); + } +}; + +template +struct serializeHelper::value>::type> +{ + static void apply(const T& obj, std::vector::iterator& it) + { + const auto data = reinterpret_cast(&obj); + const auto size = 4 * sizeof(float); + std::copy(data, data + size, it); + it += size; + } +}; + +template +struct deserializeHelper::value>::type> +{ + static T apply(std::vector::const_iterator& it) + { + T vector; + auto data = reinterpret_cast(&vector); + const auto size = 4 * sizeof(float); + std::copy(it, it + size, data); + it += size; + return vector; + } +}; + +/*************/ +template +struct getSizeHelper::value>::type> +{ + static uint32_t value(const T& obj) + { + uint32_t acc = getSize(obj.name); + acc += getSize(obj.vertices); + acc += getSize(obj.uvs); + acc += getSize(obj.normals); + acc += getSize(obj.annexe); + return acc; + } +}; + +template +struct serializeHelper::value>::type> +{ + static void apply(const T& obj, std::vector::iterator& it) + { + serializer(obj.name, it); + serializer(obj.vertices, it); + serializer(obj.uvs, it); + serializer(obj.normals, it); + serializer(obj.annexe, it); + } +}; + +template +struct deserializeHelper::value>::type> +{ + static T apply(std::vector::const_iterator& it) + { + Mesh::MeshContainer meshContainer; + meshContainer.name = deserializer(it); + meshContainer.vertices = std::move(deserializer>(it)); + meshContainer.uvs = std::move(deserializer>(it)); + meshContainer.normals = std::move(deserializer>(it)); + meshContainer.annexe = std::move(deserializer>(it)); + return meshContainer; + } +}; +} + +#endif // SPLASH_SERIALIZE_MESH_H diff --git a/src/core/serializer.h b/src/core/serializer.h index a27471cd..20b3d24d 100644 --- a/src/core/serializer.h +++ b/src/core/serializer.h @@ -107,7 +107,7 @@ struct getSizeHelper::value || template struct getSizeHelper::value>::type> { - static uint32_t value(const T& obj) { return sizeof(uint32_t) + obj.size() * sizeof(char); } + static uint32_t value(const T& obj) { return sizeof(uint32_t) + obj.size() * sizeof(typename T::value_type); } }; template @@ -184,6 +184,19 @@ struct serializeHelper::value | } }; +template +struct serializeHelper::value>::type> +{ + static void apply(const T& obj, std::vector::iterator& it) + { + const auto size = static_cast(obj.size()); + serializer(size, it); + const auto data = reinterpret_cast(obj.data()); + std::copy(data, data + size * sizeof(typename T::value_type), it); + it += size * sizeof(typename T::value_type); + } +}; + template struct serializeHelper::value>::type> { @@ -198,7 +211,7 @@ struct serializeHelper -struct serializeHelper::value>::type> +struct serializeHelper::value && !std::is_same::value>::type> { static void apply(const T& obj, std::vector::iterator& it) { @@ -284,10 +297,11 @@ struct deserializeHelper { static T apply(std::vector::const_iterator& it) { - auto size = deserializer(it); + const auto size = deserializer(it); auto obj = T(static_cast(size), ' '); - for (uint32_t i = 0; i < size; ++i) - obj[i] = deserializer(it); + auto data = reinterpret_cast(obj.data()); + std::copy(it, it + size * sizeof(typename T::value_type), data); + it += size * sizeof(typename T::value_type); return obj; } }; diff --git a/src/mesh/mesh.cpp b/src/mesh/mesh.cpp index 225dfbb3..2831f9d1 100644 --- a/src/mesh/mesh.cpp +++ b/src/mesh/mesh.cpp @@ -1,6 +1,8 @@ #include "./mesh/mesh.h" #include "./core/root_object.h" +#include "./core/serializer.h" +#include "./core/serialize/serialize_mesh.h" #include "./mesh/meshloader.h" #include "./utils/log.h" #include "./utils/osutils.h" @@ -10,25 +12,19 @@ namespace Splash { /*************/ -Mesh::Mesh(RootObject* root) +Mesh::Mesh(RootObject* root, MeshContainer meshContainer) : BufferObject(root) + , _mesh(meshContainer) { init(); - _renderingPriority = Priority::MEDIA; -} - -/*************/ -Mesh::~Mesh() -{ -#ifdef DEBUG - Log::get() << Log::DEBUGGING << "Mesh::~Mesh - Destructor" << Log::endl; -#endif } /*************/ void Mesh::init() { _type = "mesh"; + _renderingPriority = Priority::MEDIA; + registerAttributes(); // This is used for getting documentation "offline" @@ -142,36 +138,15 @@ bool Mesh::read(const std::string& filename) /*************/ SerializedObject Mesh::serialize() const { - SerializedObject obj; - if (Timer::get().isDebug()) Timer::get() << "serialize " + _name; - // For this, we will use the getVertex, getUV, etc. methods to create a serialized representation of the mesh - std::vector> data; - data.push_back(getVertCoordsFlat()); - data.push_back(getUVCoordsFlat()); - data.push_back(getNormalsFlat()); - data.push_back(getAnnexeFlat()); - std::shared_lock readLock(_readMutex); - const int nbrVertices = data[0].size() / 4; - int totalSize = sizeof(nbrVertices); // We add to all this the total number of vertices - for (auto& d : data) - totalSize += d.size() * sizeof(d[0]); - obj.resize(totalSize); - - auto currentObjPtr = obj.data(); - const char* ptr = reinterpret_cast(&nbrVertices); - std::copy(ptr, ptr + sizeof(nbrVertices), currentObjPtr); - currentObjPtr += sizeof(nbrVertices); - - for (auto& d : data) - { - ptr = reinterpret_cast(d.data()); - std::copy(ptr, ptr + d.size() * sizeof(float), currentObjPtr); - currentObjPtr += d.size() * sizeof(float); - } + auto mesh = _mesh; + mesh.name = _name; + std::vector data; + Serial::serialize(mesh, data); + SerializedObject obj(ResizableArray(std::move(data))); if (Timer::get().isDebug()) Timer::get() >> ("serialize " + _name); @@ -188,75 +163,15 @@ bool Mesh::deserialize(SerializedObject&& obj) if (Timer::get().isDebug()) Timer::get() << "deserialize " + _name; - // First, we get the number of vertices - int nbrVertices; - char* ptr = reinterpret_cast(&nbrVertices); + // After this, obj does not hold any more data + const auto serializedMesh = obj.grabData(); + auto serializedMeshIt = serializedMesh.cbegin(); + auto mesh = Serial::detail::deserializer(serializedMeshIt); - auto currentObjPtr = obj.data(); - std::copy(currentObjPtr, currentObjPtr + sizeof(nbrVertices), ptr); // This will fail if float have different size between sender and receiver - currentObjPtr += sizeof(nbrVertices); + _bufferMesh = mesh; + _meshUpdated = true; - if (nbrVertices < 0 || nbrVertices > static_cast(obj.size())) - { - Log::get() << Log::WARNING << "Mesh::" << __FUNCTION__ << " - Bad buffer received, discarding" << Log::endl; - return false; - } - - std::vector> data; - data.push_back(std::vector(nbrVertices * 4)); - data.push_back(std::vector(nbrVertices * 2)); - data.push_back(std::vector(nbrVertices * 4)); - - bool hasAnnexe = false; - if (obj.size() > static_cast(nbrVertices) * 4 * 14) // Check whether there is an annexe buffer in all this - { - hasAnnexe = true; - data.push_back(std::vector(nbrVertices * 4)); - } - - // Let's read the values - try - { - for (auto& d : data) - { - ptr = reinterpret_cast(d.data()); - std::copy(currentObjPtr, currentObjPtr + d.size() * sizeof(float), ptr); - currentObjPtr += d.size() * sizeof(float); - } - - // Next step: use these values to reset the vertices of _mesh - MeshContainer mesh; - - mesh.vertices.resize(nbrVertices); - const auto vertPtr = reinterpret_cast(mesh.vertices.data()); - std::copy(data[0].data(), data[0].data() + nbrVertices * 4, vertPtr); - - mesh.uvs.resize(nbrVertices); - const auto uvsPtr = reinterpret_cast(mesh.uvs.data()); - std::copy(data[1].data(), data[1].data() + nbrVertices * 2, uvsPtr); - - mesh.normals.resize(nbrVertices); - const auto normalsPtr = reinterpret_cast(mesh.normals.data()); - std::copy(data[2].data(), data[2].data() + nbrVertices * 4, normalsPtr); - - if (hasAnnexe) - { - mesh.annexe.resize(nbrVertices); - const auto annexePtr = reinterpret_cast(mesh.annexe.data()); - std::copy(data[3].data(), data[3].data() + nbrVertices * 4, annexePtr); - } - - _bufferMesh = mesh; - _meshUpdated = true; - - updateTimestamp(); - } - catch (...) - { - createDefaultMesh(); - Log::get()(Log::ERROR, __FUNCTION__, " - Unable to deserialize the given object"); - return false; - } + updateTimestamp(); if (Timer::get().isDebug()) Timer::get() >> ("deserialize " + _name); diff --git a/src/mesh/mesh.h b/src/mesh/mesh.h index 82a10332..36df68b2 100644 --- a/src/mesh/mesh.h +++ b/src/mesh/mesh.h @@ -42,16 +42,23 @@ namespace Splash class Mesh : public BufferObject { public: + struct MeshContainer + { + std::string name; + std::vector vertices; + std::vector uvs; + std::vector normals; + std::vector annexe; + }; + + public: + /** * Constructor * \param root Root object + * \param meshContainer Mesh container to initialize the Mesh from */ - Mesh(RootObject* root); - - /** - * Destructor - */ - virtual ~Mesh() override; + Mesh(RootObject* root, MeshContainer meshContainer = MeshContainer()); /** * No copy constructor, but a copy operator @@ -141,14 +148,6 @@ class Mesh : public BufferObject virtual void update() override; protected: - struct MeshContainer - { - std::vector vertices; - std::vector uvs; - std::vector normals; - std::vector annexe; - }; - std::string _filepath{}; MeshContainer _mesh; MeshContainer _bufferMesh; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4eea1108..8696f626 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -81,6 +81,7 @@ target_sources(unitTests PRIVATE unit_tests/core/value.cpp unit_tests/core/world.cpp unit_tests/core/serialize/serialize_imagebuffer.cpp + unit_tests/core/serialize/serialize_mesh.cpp unit_tests/image/image.cpp unit_tests/image/image_list.cpp unit_tests/utils/dense_deque.cpp @@ -109,6 +110,7 @@ if (NOT "${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}") add_custom_command(OUTPUT update_assets COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/data COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/data/*.json ${CMAKE_CURRENT_BINARY_DIR}/data/ + COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/data/*.obj ${CMAKE_CURRENT_BINARY_DIR}/data/ COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/../data/share/splash/color_map.png ${CMAKE_CURRENT_BINARY_DIR}/data/ ) diff --git a/tests/data/cubes.obj b/tests/data/cubes.obj new file mode 100644 index 00000000..8a94ea5a --- /dev/null +++ b/tests/data/cubes.obj @@ -0,0 +1,254 @@ +# Blender v2.76 (sub 0) OBJ File: 'plane_1_projector.blend' +# www.blender.org +o Cubes_Plane.001 +v -1.000000 -0.000000 -0.500000 +v -1.000000 0.000000 0.500000 +v -1.000000 1.000000 -0.500000 +v -1.000000 1.000000 0.500000 +v 0.000000 1.000000 -0.500000 +v 0.000000 -1.000000 -0.500000 +v 0.000000 -1.000000 0.500000 +v 0.000000 0.000000 -0.500000 +v 1.000000 -1.000000 -0.500000 +v 1.000000 -1.000000 0.500000 +v 1.000000 0.000000 -0.500000 +v 1.000000 -0.000000 0.500000 +v 1.000000 1.000000 -0.500000 +v 0.000000 0.000000 0.500000 +v 0.000000 -0.000000 1.500000 +v 0.000000 1.000000 0.500000 +v 0.000000 1.000000 1.500000 +v 1.000000 -0.000000 1.500000 +v 1.000000 1.000000 0.500000 +v 1.000000 1.000000 1.500000 +v -1.000000 0.000000 0.000000 +v -1.000000 0.500000 0.500000 +v -1.000000 1.000000 -0.000000 +v -1.000000 0.500000 -0.500000 +v -0.500000 1.000000 0.500000 +v 0.000000 1.000000 -0.000000 +v -0.500000 1.000000 -0.500000 +v 0.000000 0.000000 0.000000 +v 0.000000 0.500000 -0.500000 +v -0.500000 0.000000 0.500000 +v -0.500000 -0.000000 -0.500000 +v 0.000000 -1.000000 0.000000 +v 0.000000 -0.500000 0.500000 +v 0.000000 -0.500000 -0.500000 +v 1.000000 0.000000 0.000000 +v 0.500000 0.000000 -0.500000 +v 1.000000 -0.500000 0.500000 +v 1.000000 -1.000000 0.000000 +v 1.000000 -0.500000 -0.500000 +v 0.500000 -1.000000 0.500000 +v 0.500000 -1.000000 -0.500000 +v 1.000000 1.000000 -0.000000 +v 0.500000 1.000000 -0.500000 +v 1.000000 0.500000 0.500000 +v 1.000000 0.500000 -0.500000 +v 0.000000 0.000000 1.000000 +v 0.000000 0.500000 1.500000 +v 0.000000 1.000000 1.000000 +v 0.000000 0.500000 0.500000 +v 0.500000 1.000000 1.500000 +v 1.000000 1.000000 1.000000 +v 0.500000 1.000000 0.500000 +v 1.000000 0.500000 1.500000 +v 1.000000 0.000000 1.000000 +v 0.500000 -0.000000 1.500000 +v 0.500000 0.000000 0.500000 +v 0.500000 0.500000 1.500000 +v 0.500000 0.000000 1.000000 +v 1.000000 0.500000 1.000000 +v 0.500000 1.000000 1.000000 +v 0.000000 0.500000 1.000000 +v 0.500000 0.500000 -0.500000 +v 1.000000 0.500000 -0.000000 +v 0.500000 1.000000 -0.000000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -1.000000 0.000000 +v 1.000000 -0.500000 0.000000 +v 0.000000 -0.500000 0.000000 +v -0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v -0.500000 0.000000 0.000000 +v -0.500000 1.000000 -0.000000 +v -1.000000 0.500000 -0.000000 +vt 0.100000 0.500000 +vt 0.100000 0.400000 +vt 0.200000 0.400000 +vt 0.200000 0.500000 +vt 0.900000 0.100000 +vt 0.900000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.100000 +vt 0.700000 0.200000 +vt 0.700000 0.300000 +vt 0.600000 0.300000 +vt 0.600000 0.200000 +vt 0.500000 0.900000 +vt 0.500000 1.000000 +vt 0.400000 1.000000 +vt 0.400000 0.900000 +vt 0.700000 0.400000 +vt 0.600000 0.400000 +vt 0.500000 0.300000 +vt 0.500000 0.400000 +vt 0.000000 0.400000 +vt 0.000000 0.300000 +vt 0.100000 0.300000 +vt 0.300000 0.100000 +vt 0.200000 0.100000 +vt 0.200000 0.000000 +vt 0.300000 0.000000 +vt 0.900000 0.300000 +vt 0.900000 0.400000 +vt 0.800000 0.400000 +vt 0.800000 0.300000 +vt 0.300000 0.700000 +vt 0.300000 0.800000 +vt 0.200000 0.800000 +vt 0.200000 0.700000 +vt 0.700000 0.700000 +vt 0.700000 0.600000 +vt 0.800000 0.600000 +vt 0.800000 0.700000 +vt 0.800000 0.500000 +vt 0.700000 0.500000 +vt 0.700000 0.100000 +vt 0.600000 0.100000 +vt 0.000000 0.200000 +vt 0.100000 0.200000 +vt 0.300000 0.500000 +vt 0.300000 0.400000 +vt 0.400000 0.400000 +vt 0.400000 0.500000 +vt 0.900000 0.700000 +vt 0.900000 0.600000 +vt 1.000000 0.600000 +vt 1.000000 0.700000 +vt 0.500000 0.700000 +vt 0.500000 0.800000 +vt 0.400000 0.800000 +vt 0.400000 0.700000 +vt 0.700000 0.000000 +vt 0.600000 0.000000 +vt 0.700000 0.900000 +vt 0.700000 1.000000 +vt 0.600000 1.000000 +vt 0.600000 0.900000 +vt 0.700000 0.800000 +vt 0.600000 0.800000 +vt 0.800000 0.800000 +vt 0.800000 0.900000 +vt 0.800000 1.000000 +vt 0.800000 0.000000 +vt 0.800000 0.100000 +vt 0.500000 0.600000 +vt 0.400000 0.600000 +vt 0.500000 0.100000 +vt 0.500000 0.000000 +vt 0.600000 0.600000 +vt 0.600000 0.700000 +vt 0.500000 0.200000 +vt 0.400000 0.200000 +vt 0.400000 0.100000 +vt 0.900000 0.800000 +vt 1.000000 0.800000 +vt 0.300000 0.600000 +vt 0.200000 0.600000 +vt 0.400000 0.000000 +vt 0.300000 0.300000 +vt 0.300000 0.200000 +vt 0.400000 0.300000 +vt 0.200000 0.300000 +vt 0.200000 0.200000 +vt 0.600000 0.500000 +vt 0.900000 0.200000 +vt 0.800000 0.200000 +vt 1.000000 0.200000 +vt 1.000000 0.300000 +vt 1.000000 0.400000 +vt 0.100000 0.600000 +vt 0.000000 0.600000 +vt 0.000000 0.500000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 1.000000 0.000000 0.000000 +s off +f 74/1/1 23/2/1 3/3/1 24/4/1 +f 73/5/2 26/6/2 5/7/2 27/8/2 +f 31/9/3 71/10/3 29/11/3 8/12/3 +f 72/13/4 21/14/4 1/15/4 31/16/4 +f 71/10/3 27/17/3 5/18/3 29/11/3 +f 70/19/5 25/11/5 4/18/5 22/20/5 +f 44/2/6 12/21/6 35/22/6 63/23/6 +f 68/24/6 38/25/6 9/26/6 39/27/6 +f 67/28/4 32/29/4 6/30/4 41/31/4 +f 66/32/3 36/33/3 11/34/3 39/35/3 +f 64/36/2 42/37/2 13/38/2 43/39/2 +f 37/17/5 12/30/5 56/40/5 65/41/5 +f 62/42/3 43/9/3 13/12/3 45/43/3 +f 63/23/6 35/22/6 11/44/6 45/45/6 +f 61/46/1 48/47/1 16/48/1 49/49/1 +f 60/50/2 51/51/2 19/52/2 52/53/2 +f 58/54/4 46/55/4 14/56/4 56/57/4 +f 36/58/3 62/42/3 45/43/3 11/59/3 +f 57/60/5 50/61/5 17/62/5 47/63/5 +f 55/64/5 57/60/5 47/63/5 15/65/5 +f 18/66/5 53/67/5 57/60/5 55/64/5 +f 53/67/5 20/68/5 50/61/5 57/60/5 +f 8/69/3 29/70/3 62/42/3 36/58/3 +f 54/71/4 58/54/4 56/57/4 12/72/4 +f 51/43/6 59/73/6 44/74/6 19/59/6 +f 18/75/4 55/76/4 58/54/4 54/71/4 +f 55/76/4 15/65/4 46/55/4 58/54/4 +f 20/12/6 53/77/6 59/73/6 51/43/6 +f 53/77/6 18/78/6 54/79/6 59/73/6 +f 48/80/2 60/50/2 52/53/2 16/81/2 +f 17/66/2 50/39/2 60/50/2 48/80/2 +f 50/39/2 20/38/2 51/51/2 60/50/2 +f 46/82/1 61/46/1 49/49/1 14/72/1 +f 15/83/1 47/4/1 61/46/1 46/82/1 +f 47/4/1 17/3/1 48/47/1 61/46/1 +f 59/73/6 54/79/6 12/84/6 44/74/6 +f 69/85/1 28/86/1 8/78/1 34/87/1 +f 65/41/5 56/40/5 14/38/5 33/37/5 +f 33/88/1 14/89/1 28/86/1 69/85/1 +f 16/65/2 52/76/2 64/36/2 26/64/2 +f 52/76/2 19/75/2 42/37/2 64/36/2 +f 42/88/6 63/23/6 45/45/6 13/89/6 +f 14/65/4 30/63/4 72/13/4 28/55/4 +f 25/70/2 16/69/2 26/6/2 73/5/2 +f 40/90/5 65/41/5 33/37/5 7/75/5 +f 10/18/5 37/17/5 65/41/5 40/90/5 +f 41/82/3 66/32/3 39/35/3 9/83/3 +f 6/72/3 34/57/3 66/32/3 41/82/3 +f 34/57/3 8/56/3 36/33/3 66/32/3 +f 38/91/4 67/28/4 41/31/4 9/92/4 +f 10/93/4 40/94/4 67/28/4 38/91/4 +f 40/94/4 7/95/4 32/29/4 67/28/4 +f 35/79/6 68/24/6 39/27/6 11/84/6 +f 12/78/6 37/86/6 68/24/6 35/79/6 +f 37/86/6 10/89/6 38/25/6 68/24/6 +f 26/64/2 64/36/2 43/39/2 5/66/2 +f 29/70/3 5/92/3 43/9/3 62/42/3 +f 19/3/6 44/2/6 63/23/6 42/88/6 +f 32/47/1 69/85/1 34/87/1 6/48/1 +f 7/3/1 33/88/1 69/85/1 32/47/1 +f 30/87/5 70/19/5 22/20/5 2/48/5 +f 1/92/3 24/31/3 71/10/3 31/9/3 +f 24/31/3 3/30/3 27/17/3 71/10/3 +f 30/63/4 2/62/4 21/14/4 72/13/4 +f 28/55/4 72/13/4 31/16/4 8/56/4 +f 14/78/5 49/77/5 70/19/5 30/87/5 +f 49/77/5 16/12/5 25/11/5 70/19/5 +f 23/91/2 73/5/2 27/8/2 3/93/2 +f 4/92/2 25/70/2 73/5/2 23/91/2 +f 21/96/1 74/1/1 24/4/1 1/83/1 +f 2/97/1 22/98/1 74/1/1 21/96/1 +f 22/98/1 4/21/1 23/2/1 74/1/1 diff --git a/tests/unit_tests/core/serialize/serialize_imagebuffer.cpp b/tests/unit_tests/core/serialize/serialize_imagebuffer.cpp index 76c01750..eaeca1e0 100644 --- a/tests/unit_tests/core/serialize/serialize_imagebuffer.cpp +++ b/tests/unit_tests/core/serialize/serialize_imagebuffer.cpp @@ -15,7 +15,6 @@ * along with Splash. If not, see . */ -#include #include #include diff --git a/tests/unit_tests/core/serialize/serialize_mesh.cpp b/tests/unit_tests/core/serialize/serialize_mesh.cpp new file mode 100644 index 00000000..89511d40 --- /dev/null +++ b/tests/unit_tests/core/serialize/serialize_mesh.cpp @@ -0,0 +1,57 @@ +/* + * This file is part of Splash. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Splash is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Splash. If not, see . + */ + +#include + +#include + +#include "./core/serialize/serialize_mesh.h" +#include "./core/serializer.h" +#include "./mesh/mesh.h" +#include "./utils/osutils.h" + +using namespace Splash; + +/*************/ +class MeshMockup : public Mesh +{ + public: + MeshMockup() + : Mesh(nullptr) + { + } + + MeshContainer getContainer() const { return _mesh; } +}; + +/*************/ +TEST_CASE("Testing Mesh serialization") +{ + MeshMockup mesh; + mesh.read(Utils::getCurrentWorkingDirectory() + "/data/cubes.obj"); + auto container = mesh.getContainer(); + CHECK(container.vertices.size() != 0); + + std::vector serializedMesh; + Serial::serialize(container, serializedMesh); + const auto deserializedMesh = Serial::deserialize(serializedMesh); + CHECK_EQ(container.name, deserializedMesh.name); + CHECK_EQ(container.vertices, deserializedMesh.vertices); + CHECK_EQ(container.uvs, deserializedMesh.uvs); + CHECK_EQ(container.normals, deserializedMesh.normals); + CHECK_EQ(container.annexe, deserializedMesh.annexe); +} diff --git a/tests/unit_tests/core/serializer.cpp b/tests/unit_tests/core/serializer.cpp index e604bd95..6b2b1fd9 100644 --- a/tests/unit_tests/core/serializer.cpp +++ b/tests/unit_tests/core/serializer.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -30,6 +31,16 @@ TEST_CASE("Testing serialized size computation") CHECK(Serial::getSize(chrono::system_clock::time_point(chrono::duration(123456))) == sizeof(int64_t)); } +/*************/ +TEST_CASE("Testing serialization of std::string") +{ + const std::string someString = "Once upon a time..."; + CHECK_EQ(Serial::getSize(someString), 23); // 4 (size as uint32_t) + 19 (char count) + std::vector buffer; + Serial::serialize(someString, buffer); + CHECK_EQ(someString, Serial::deserialize(buffer)); +} + /*************/ TEST_CASE("Testing serialized size computation for containers of containers") {