From e4d3eb1ad37f6e58524453587978d5c62b7656f9 Mon Sep 17 00:00:00 2001 From: ccolin Date: Mon, 20 Sep 2021 20:36:29 +0200 Subject: [PATCH] archivage initial --- .gitignore | 1 + data/cube.obj | 30 + .../include/OpenMesh/Core/Geometry/Config.hh | 75 + .../OpenMesh/Core/Geometry/LoopSchemeMaskT.hh | 196 ++ .../OpenMesh/Core/Geometry/MathDefs.hh | 172 ++ .../OpenMesh/Core/Geometry/NormalConeT.hh | 132 ++ .../include/OpenMesh/Core/Geometry/Plane3d.hh | 124 ++ .../OpenMesh/Core/Geometry/QuadricT.hh | 291 +++ .../OpenMesh/Core/Geometry/Vector11T.hh | 886 +++++++++ .../include/OpenMesh/Core/Geometry/VectorT.hh | 440 +++++ .../OpenMesh/Core/Geometry/VectorT_inc.hh | 668 +++++++ .../include/OpenMesh/Core/IO/BinaryHelper.hh | 164 ++ .../include/OpenMesh/Core/IO/IOInstances.hh | 115 ++ .../include/OpenMesh/Core/IO/IOManager.hh | 272 +++ .../include/OpenMesh/Core/IO/MeshIO.hh | 296 +++ .../include/OpenMesh/Core/IO/OFFFormat.hh | 99 + .../include/OpenMesh/Core/IO/OMFormat.hh | 751 ++++++++ .../include/OpenMesh/Core/IO/Options.hh | 250 +++ .../include/OpenMesh/Core/IO/SR_binary.hh | 136 ++ .../OpenMesh/Core/IO/SR_binary_spec.hh | 329 ++++ .../Core/IO/SR_binary_vector_of_bool.inl | 98 + .../IO/SR_binary_vector_of_fundamentals.inl | 53 + .../Core/IO/SR_binary_vector_of_string.inl | 39 + .../include/OpenMesh/Core/IO/SR_rbo.hh | 256 +++ .../include/OpenMesh/Core/IO/SR_store.hh | 72 + .../include/OpenMesh/Core/IO/SR_types.hh | 112 ++ .../include/OpenMesh/Core/IO/StoreRestore.hh | 117 ++ .../OpenMesh/Core/IO/exporter/BaseExporter.hh | 165 ++ .../OpenMesh/Core/IO/exporter/ExporterT.hh | 338 ++++ .../OpenMesh/Core/IO/importer/BaseImporter.hh | 205 +++ .../OpenMesh/Core/IO/importer/ImporterT.hh | 408 ++++ .../OpenMesh/Core/IO/reader/BaseReader.hh | 213 +++ .../OpenMesh/Core/IO/reader/OBJReader.hh | 201 ++ .../OpenMesh/Core/IO/reader/OFFReader.hh | 171 ++ .../OpenMesh/Core/IO/reader/OMReader.hh | 178 ++ .../OpenMesh/Core/IO/reader/PLYReader.hh | 244 +++ .../OpenMesh/Core/IO/reader/STLReader.hh | 151 ++ .../OpenMesh/Core/IO/writer/BaseWriter.hh | 155 ++ .../OpenMesh/Core/IO/writer/OBJWriter.hh | 136 ++ .../OpenMesh/Core/IO/writer/OFFWriter.hh | 138 ++ .../OpenMesh/Core/IO/writer/OMWriter.hh | 147 ++ .../OpenMesh/Core/IO/writer/PLYWriter.hh | 177 ++ .../OpenMesh/Core/IO/writer/STLWriter.hh | 126 ++ .../OpenMesh/Core/IO/writer/VTKWriter.hh | 52 + .../include/OpenMesh/Core/Mesh/ArrayItems.hh | 130 ++ .../include/OpenMesh/Core/Mesh/ArrayKernel.hh | 915 +++++++++ .../OpenMesh/Core/Mesh/AttribKernelT.hh | 782 ++++++++ .../include/OpenMesh/Core/Mesh/Attributes.hh | 103 ++ .../include/OpenMesh/Core/Mesh/BaseKernel.hh | 826 +++++++++ .../include/OpenMesh/Core/Mesh/BaseMesh.hh | 97 + .../include/OpenMesh/Core/Mesh/Casts.hh | 77 + .../OpenMesh/Core/Mesh/CirculatorsT.hh | 598 ++++++ .../OpenMesh/Core/Mesh/FinalMeshItemsT.hh | 227 +++ .../include/OpenMesh/Core/Mesh/Handles.hh | 238 +++ .../include/OpenMesh/Core/Mesh/IteratorsT.hh | 259 +++ .../OpenMesh/Core/Mesh/PolyConnectivity.hh | 1635 +++++++++++++++++ .../include/OpenMesh/Core/Mesh/PolyMeshT.hh | 638 +++++++ .../Core/Mesh/PolyMesh_ArrayKernelT.hh | 118 ++ .../include/OpenMesh/Core/Mesh/Status.hh | 183 ++ .../include/OpenMesh/Core/Mesh/Traits.hh | 245 +++ .../OpenMesh/Core/Mesh/TriConnectivity.hh | 211 +++ .../include/OpenMesh/Core/Mesh/TriMeshT.hh | 438 +++++ .../Core/Mesh/TriMesh_ArrayKernelT.hh | 117 ++ .../Core/Mesh/gen/circulators_header.hh | 98 + .../Core/Mesh/gen/circulators_template.hh | 190 ++ .../include/OpenMesh/Core/Mesh/gen/footer.hh | 6 + .../OpenMesh/Core/Mesh/gen/generate.sh | 175 ++ .../Core/Mesh/gen/iterators_header.hh | 87 + .../Core/Mesh/gen/iterators_template.hh | 162 ++ .../OpenMesh/Core/System/OpenMeshDLLMacros.hh | 72 + .../include/OpenMesh/Core/System/compiler.hh | 178 ++ .../include/OpenMesh/Core/System/config.h | 107 ++ .../include/OpenMesh/Core/System/config.hh | 49 + .../include/OpenMesh/Core/System/mostream.hh | 330 ++++ .../include/OpenMesh/Core/System/omstream.hh | 83 + .../OpenMesh/Core/Templates/newClass.hh | 108 ++ .../OpenMesh/Core/Templates/newClass.sh | 9 + .../OpenMesh/Core/Templates/newClassT.hh | 115 ++ .../OpenMesh/Core/Templates/newClassT.sh | 9 + .../Core/Utils/AutoPropertyHandleT.hh | 138 ++ .../OpenMesh/Core/Utils/BaseProperty.hh | 188 ++ .../include/OpenMesh/Core/Utils/Endian.hh | 103 ++ .../include/OpenMesh/Core/Utils/GenProg.hh | 165 ++ .../OpenMesh/Core/Utils/Noncopyable.hh | 94 + .../include/OpenMesh/Core/Utils/Property.hh | 555 ++++++ .../OpenMesh/Core/Utils/PropertyContainer.hh | 375 ++++ .../OpenMesh/Core/Utils/PropertyManager.hh | 577 ++++++ .../Core/Utils/RandomNumberGenerator.hh | 117 ++ .../include/OpenMesh/Core/Utils/SingletonT.hh | 154 ++ .../include/OpenMesh/Core/Utils/color_cast.hh | 385 ++++ .../OpenMesh/Core/Utils/vector_cast.hh | 163 ++ .../OpenMesh/Core/Utils/vector_traits.hh | 115 ++ libs/OpenMesh/liblinux/libOpenMeshCore.a | Bin 0 -> 1163982 bytes libs/OpenMesh/libwin/OpenMeshCore.lib | Bin 0 -> 4700968 bytes src/main.cpp | 16 + src/main_window.cpp | 56 + src/main_window.h | 32 + src/mesh_viewer.cpp | 261 +++ src/mesh_viewer.h | 64 + src/my_mesh.h | 19 + tp.pro | 25 + 101 files changed, 22596 insertions(+) create mode 100644 .gitignore create mode 100644 data/cube.obj create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Geometry/Config.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Geometry/LoopSchemeMaskT.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Geometry/MathDefs.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Geometry/NormalConeT.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Geometry/Plane3d.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Geometry/QuadricT.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Geometry/Vector11T.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Geometry/VectorT.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Geometry/VectorT_inc.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/BinaryHelper.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/IOInstances.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/IOManager.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/MeshIO.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/OFFFormat.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/OMFormat.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/Options.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary_spec.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary_vector_of_bool.inl create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary_vector_of_fundamentals.inl create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary_vector_of_string.inl create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/SR_rbo.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/SR_store.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/SR_types.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/StoreRestore.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/exporter/BaseExporter.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/exporter/ExporterT.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/importer/BaseImporter.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/importer/ImporterT.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/reader/BaseReader.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/reader/OBJReader.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/reader/OFFReader.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/reader/OMReader.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/reader/PLYReader.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/reader/STLReader.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/writer/BaseWriter.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/writer/OBJWriter.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/writer/OFFWriter.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/writer/OMWriter.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/writer/PLYWriter.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/writer/STLWriter.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/IO/writer/VTKWriter.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/ArrayItems.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/ArrayKernel.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/AttribKernelT.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/Attributes.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/BaseKernel.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/BaseMesh.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/Casts.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/CirculatorsT.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/FinalMeshItemsT.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/Handles.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/IteratorsT.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/PolyConnectivity.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/PolyMeshT.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/Status.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/Traits.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/TriConnectivity.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/TriMeshT.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/circulators_header.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/circulators_template.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/footer.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/generate.sh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/iterators_header.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/iterators_template.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/System/OpenMeshDLLMacros.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/System/compiler.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/System/config.h create mode 100644 libs/OpenMesh/include/OpenMesh/Core/System/config.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/System/mostream.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/System/omstream.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Templates/newClass.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Templates/newClass.sh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Templates/newClassT.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Templates/newClassT.sh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Utils/AutoPropertyHandleT.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Utils/BaseProperty.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Utils/Endian.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Utils/GenProg.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Utils/Noncopyable.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Utils/Property.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Utils/PropertyContainer.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Utils/PropertyManager.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Utils/RandomNumberGenerator.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Utils/SingletonT.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Utils/color_cast.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Utils/vector_cast.hh create mode 100644 libs/OpenMesh/include/OpenMesh/Core/Utils/vector_traits.hh create mode 100644 libs/OpenMesh/liblinux/libOpenMeshCore.a create mode 100644 libs/OpenMesh/libwin/OpenMeshCore.lib create mode 100644 src/main.cpp create mode 100644 src/main_window.cpp create mode 100644 src/main_window.h create mode 100644 src/mesh_viewer.cpp create mode 100644 src/mesh_viewer.h create mode 100644 src/my_mesh.h create mode 100644 tp.pro diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/data/cube.obj b/data/cube.obj new file mode 100644 index 0000000..de4003f --- /dev/null +++ b/data/cube.obj @@ -0,0 +1,30 @@ +# Blender v2.90.1 OBJ File: '' +# www.blender.org +o Cube +v -1.000000 -1.000000 1.000000 +v -1.000000 1.000000 1.000000 +v -1.000000 -1.000000 -1.000000 +v -1.000000 1.000000 -1.000000 +v 1.000000 -1.000000 1.000000 +v 1.000000 1.000000 1.000000 +v 1.000000 -1.000000 -1.000000 +v 1.000000 1.000000 -1.000000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +s off +f 2//1 3//1 1//1 +f 4//2 7//2 3//2 +f 8//3 5//3 7//3 +f 6//4 1//4 5//4 +f 7//5 1//5 3//5 +f 4//6 6//6 8//6 +f 2//1 4//1 3//1 +f 4//2 8//2 7//2 +f 8//3 6//3 5//3 +f 6//4 2//4 1//4 +f 7//5 5//5 1//5 +f 4//6 2//6 6//6 diff --git a/libs/OpenMesh/include/OpenMesh/Core/Geometry/Config.hh b/libs/OpenMesh/include/OpenMesh/Core/Geometry/Config.hh new file mode 100644 index 0000000..b1f1b08 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Geometry/Config.hh @@ -0,0 +1,75 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Defines +// +//============================================================================= + +#ifndef OPENMESH_GEOMETRY_CONFIG_HH +#define OPENMESH_GEOMETRY_CONFIG_HH + + +//== INCLUDES ================================================================= + +// OpenMesh Namespace Defines +#include + + +//== NAMESPACES =============================================================== + +#define BEGIN_NS_GEOMETRY namespace geometry { +#define END_NS_GEOMETRY } + + +//============================================================================= +#endif // OPENMESH_GEOMETRY_CONFIG_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Geometry/LoopSchemeMaskT.hh b/libs/OpenMesh/include/OpenMesh/Core/Geometry/LoopSchemeMaskT.hh new file mode 100644 index 0000000..feca771 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Geometry/LoopSchemeMaskT.hh @@ -0,0 +1,196 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef LOOPSCHEMEMASKT_HH +#define LOOPSCHEMEMASKT_HH + +#include +#include + +#include +#include + +namespace OpenMesh +{ + +/** implements cache for the weights of the original Loop scheme + supported: + - vertex projection rule on the next level + - vertex projection rule on the limit surface + - vertex projection rule on the k-th (level) step (Barthe, Kobbelt'2003) + - vertex tangents on the limit surface +*/ + +template +class LoopSchemeMaskT +{ +public: + enum { cache_size = cache_size_ }; + typedef T_ Scalar; + +protected: + + Scalar proj_weights_[cache_size]; + Scalar limit_weights_[cache_size]; + Scalar step_weights_[cache_size]; + std::vector tang0_weights_[cache_size]; + std::vector tang1_weights_[cache_size]; + +protected: + + inline static Scalar compute_proj_weight(uint _valence) + { + //return pow(3.0 / 2.0 + cos(2.0 * M_PI / _valence), 2) / 2.0 - 1.0; + double denom = (3.0 + 2.0*cos(2.0*M_PI/(double)_valence)); + double weight = (64.0*_valence)/(40.0 - denom*denom) - _valence; + return (Scalar) weight; + } + + inline static Scalar compute_limit_weight(uint _valence) + { + double proj_weight = compute_proj_weight(_valence); + proj_weight = proj_weight/(proj_weight + _valence);//normalize the proj_weight + double weight = (3.0/8.0)/(1.0 - proj_weight + (3.0/8.0)); + return (Scalar)weight; + } + + inline static Scalar compute_step_weight(uint _valence) + { + double proj_weight = compute_proj_weight(_valence); + proj_weight = proj_weight/(proj_weight + _valence);//normalize the proj_weight + double weight = proj_weight - (3.0/8.0); + return (Scalar)weight; + } + + inline static Scalar compute_tang0_weight(uint _valence, uint _ver_id) + { + return (Scalar)cos(2.0*M_PI*(double)_ver_id/(double)_valence); + } + + inline static Scalar compute_tang1_weight(uint _valence, uint _ver_id) + { + return (Scalar)sin(2.0*M_PI*(double)_ver_id/(double)_valence); + } + + void cache_weights() + { + proj_weights_[0] = 1; + for (uint k = 1; k < cache_size; ++k) + { + proj_weights_[k] = compute_proj_weight(k); + limit_weights_[k] = compute_limit_weight(k); + step_weights_[k] = compute_step_weight(k); + tang0_weights_[k].resize(k); + tang1_weights_[k].resize(k); + for (uint i = 0; i < k; ++i) + { + tang0_weights_[k][i] = compute_tang0_weight(k,i); + tang1_weights_[k][i] = compute_tang1_weight(k,i); + } + } + } + +public: + + LoopSchemeMaskT() + { + cache_weights(); + } + + inline Scalar proj_weight(uint _valence) const + { + assert(_valence < cache_size ); + return proj_weights_[_valence]; + } + + inline Scalar limit_weight(uint _valence) const + { + assert(_valence < cache_size ); + return limit_weights_[_valence]; + } + + inline Scalar step_weight(uint _valence, uint _step) const + { + assert(_valence < cache_size); + return pow(step_weights_[_valence], (int)_step);//can be precomputed + } + + inline Scalar tang0_weight(uint _valence, uint _ver_id) const + { + assert(_valence < cache_size ); + assert(_ver_id < _valence); + return tang0_weights_[_valence][_ver_id]; + } + + inline Scalar tang1_weight(uint _valence, uint _ver_id) const + { + assert(_valence < cache_size ); + assert(_ver_id < _valence); + return tang1_weights_[_valence][_ver_id]; + } + + void dump(uint _max_valency = cache_size - 1) const + { + assert(_max_valency <= cache_size - 1); + //CConsole::printf("(k : pw_k, lw_k): "); + for (uint i = 0; i <= _max_valency; ++i) + { + //CConsole::stream() << "(" << i << " : " << proj_weight(i) << ", " << limit_weight(i) << ", " << step_weight(i,1) << "), "; + } + //CConsole::printf("\n"); + } +}; + +typedef LoopSchemeMaskT LoopSchemeMaskDouble; +typedef SingletonT LoopSchemeMaskDoubleSingleton; + +}//namespace OpenMesh + +#endif//LOOPSCHEMEMASKT_HH + diff --git a/libs/OpenMesh/include/OpenMesh/Core/Geometry/MathDefs.hh b/libs/OpenMesh/include/OpenMesh/Core/Geometry/MathDefs.hh new file mode 100644 index 0000000..c61bb7d --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Geometry/MathDefs.hh @@ -0,0 +1,172 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef MATHDEFS_HH +#define MATHDEFS_HH + +#include +#include + +#ifndef M_PI + #define M_PI 3.14159265359 +#endif + +namespace OpenMesh +{ + +/** comparison operators with user-selected precision control +*/ +template +inline bool is_zero(const T& _a, Real _eps) +{ return fabs(_a) < _eps; } + +template +inline bool is_eq(const T1& a, const T2& b, Real _eps) +{ return is_zero(a-b, _eps); } + +template +inline bool is_gt(const T1& a, const T2& b, Real _eps) +{ return (a > b) && !is_eq(a,b,_eps); } + +template +inline bool is_ge(const T1& a, const T2& b, Real _eps) +{ return (a > b) || is_eq(a,b,_eps); } + +template +inline bool is_lt(const T1& a, const T2& b, Real _eps) +{ return (a < b) && !is_eq(a,b,_eps); } + +template +inline bool is_le(const T1& a, const T2& b, Real _eps) +{ return (a < b) || is_eq(a,b,_eps); } + +/*const float flt_eps__ = 10*FLT_EPSILON; +const double dbl_eps__ = 10*DBL_EPSILON;*/ +const float flt_eps__ = (float)1e-05; +const double dbl_eps__ = 1e-09; + +inline float eps__(float) +{ return flt_eps__; } + +inline double eps__(double) +{ return dbl_eps__; } + +template +inline bool is_zero(const T& a) +{ return is_zero(a, eps__(a)); } + +template +inline bool is_eq(const T1& a, const T2& b) +{ return is_zero(a-b); } + +template +inline bool is_gt(const T1& a, const T2& b) +{ return (a > b) && !is_eq(a,b); } + +template +inline bool is_ge(const T1& a, const T2& b) +{ return (a > b) || is_eq(a,b); } + +template +inline bool is_lt(const T1& a, const T2& b) +{ return (a < b) && !is_eq(a,b); } + +template +inline bool is_le(const T1& a, const T2& b) +{ return (a < b) || is_eq(a,b); } + +/// Trigonometry/angles - related + +template +inline T sane_aarg(T _aarg) +{ + if (_aarg < -1) + { + _aarg = -1; + } + else if (_aarg > 1) + { + _aarg = 1; + } + return _aarg; +} + +/** returns the angle determined by its cos and the sign of its sin + result is positive if the angle is in [0:pi] + and negative if it is in [pi:2pi] +*/ +template +T angle(T _cos_angle, T _sin_angle) +{//sanity checks - otherwise acos will return nan + _cos_angle = sane_aarg(_cos_angle); + return (T) _sin_angle >= 0 ? acos(_cos_angle) : -acos(_cos_angle); +} + +template +inline T positive_angle(T _angle) +{ return _angle < 0 ? (2*M_PI + _angle) : _angle; } + +template +inline T positive_angle(T _cos_angle, T _sin_angle) +{ return positive_angle(angle(_cos_angle, _sin_angle)); } + +template +inline T deg_to_rad(const T& _angle) +{ return M_PI*(_angle/180); } + +template +inline T rad_to_deg(const T& _angle) +{ return 180*(_angle/M_PI); } + +inline double log_(double _value) +{ return log(_value); } + +}//namespace OpenMesh + +#endif//MATHDEFS_HH diff --git a/libs/OpenMesh/include/OpenMesh/Core/Geometry/NormalConeT.hh b/libs/OpenMesh/include/OpenMesh/Core/Geometry/NormalConeT.hh new file mode 100644 index 0000000..796bbdd --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Geometry/NormalConeT.hh @@ -0,0 +1,132 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + + + +//============================================================================= +// +// CLASS NormalCone +// +//============================================================================= + + +#ifndef OPENMESH_NORMALCONE_HH +#define OPENMESH_NORMALCONE_HH + + +//== INCLUDES ================================================================= + + +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + + +//== CLASS DEFINITION ========================================================= + + +/** /class NormalCone NormalCone.hh + + NormalCone that can be merged with other normal cones. Provides + the center normal and the opening angle. +**/ + +template +class NormalConeT +{ +public: + + // typedefs + typedef VectorT Vec3; + + + //! default constructor (not initialized) + NormalConeT() {} + + //! Initialize cone with center (unit vector) and angle (radius in radians) + NormalConeT(const Vec3& _center_normal, Scalar _angle=0.0); + + //! return max. distance (radians) unit vector to cone (distant side) + Scalar max_angle(const Vec3&) const; + + //! return max. distance (radians) cone to cone (distant sides) + Scalar max_angle(const NormalConeT&) const; + + //! merge _cone; this instance will then enclose both former cones + void merge(const NormalConeT&); + + //! returns center normal + const Vec3& center_normal() const { return center_normal_; } + + //! returns size of cone (radius in radians) + inline Scalar angle() const { return angle_; } + +private: + + Vec3 center_normal_; + Scalar angle_; +}; + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_NORMALCONE_C) +#define OPENMESH_NORMALCONE_TEMPLATES +#include "NormalConeT.cc" +#endif +//============================================================================= +#endif // OPENMESH_NORMALCONE_HH defined +//============================================================================= + diff --git a/libs/OpenMesh/include/OpenMesh/Core/Geometry/Plane3d.hh b/libs/OpenMesh/include/OpenMesh/Core/Geometry/Plane3d.hh new file mode 100644 index 0000000..50e9ced --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Geometry/Plane3d.hh @@ -0,0 +1,124 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + + + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +//============================================================================= +// +// CLASS Plane3D +// +//============================================================================= + + +#ifndef OPENMESH_PLANE3D_HH +#define OPENMESH_PLANE3D_HH + + +//== INCLUDES ================================================================= + +#include + + +//== FORWARDDECLARATIONS ====================================================== + +//== NAMESPACES =============================================================== + +namespace OpenMesh { +namespace VDPM { + +//== CLASS DEFINITION ========================================================= + + +/** \class Plane3d Plane3d.hh + + ax + by + cz + d = 0 +*/ + + +class OPENMESHDLLEXPORT Plane3d +{ +public: + + typedef OpenMesh::Vec3f vector_type; + typedef vector_type::value_type value_type; + +public: + + Plane3d() + : d_(0) + { } + + Plane3d(const vector_type &_dir, const vector_type &_pnt) + : n_(_dir), d_(0) + { + n_.normalize(); + d_ = -dot(n_,_pnt); + } + + value_type signed_distance(const OpenMesh::Vec3f &_p) + { + return dot(n_ , _p) + d_; + } + + // back compatibility + value_type singed_distance(const OpenMesh::Vec3f &point) + { return signed_distance( point ); } + +public: + + vector_type n_; + value_type d_; + +}; + +//============================================================================= +} // namespace VDPM +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_PLANE3D_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Geometry/QuadricT.hh b/libs/OpenMesh/include/OpenMesh/Core/Geometry/QuadricT.hh new file mode 100644 index 0000000..8d2943a --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Geometry/QuadricT.hh @@ -0,0 +1,291 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + + + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +/** \file Core/Geometry/QuadricT.hh + + */ + +//============================================================================= +// +// CLASS QuadricT +// +//============================================================================= + +#ifndef OPENMESH_GEOMETRY_QUADRIC_HH +#define OPENMESH_GEOMETRY_QUADRIC_HH + + +//== INCLUDES ================================================================= + +#include "Config.hh" +#include +#include + +//== NAMESPACE ================================================================ + +namespace OpenMesh { //BEGIN_NS_OPENMESH +namespace Geometry { //BEGIN_NS_GEOMETRY + + +//== CLASS DEFINITION ========================================================= + + +/** /class QuadricT Geometry/QuadricT.hh + + Stores a quadric as a 4x4 symmetrix matrix. Used by the + error quadric based mesh decimation algorithms. +**/ + +template +class QuadricT +{ +public: + typedef Scalar value_type; + typedef QuadricT type; + typedef QuadricT Self; + // typedef VectorInterface > Vec3; + // typedef VectorInterface > Vec4; + //typedef Vector3Elem Vec3; + //typedef Vector4Elem Vec4; + + /// construct with upper triangle of symmetrix 4x4 matrix + QuadricT(Scalar _a, Scalar _b, Scalar _c, Scalar _d, + Scalar _e, Scalar _f, Scalar _g, + Scalar _h, Scalar _i, + Scalar _j) + : a_(_a), b_(_b), c_(_c), d_(_d), + e_(_e), f_(_f), g_(_g), + h_(_h), i_(_i), + j_(_j) + { + } + + + /// constructor from given plane equation: ax+by+cz+d_=0 + QuadricT( Scalar _a=0.0, Scalar _b=0.0, Scalar _c=0.0, Scalar _d=0.0 ) + : a_(_a*_a), b_(_a*_b), c_(_a*_c), d_(_a*_d), + e_(_b*_b), f_(_b*_c), g_(_b*_d), + h_(_c*_c), i_(_c*_d), + j_(_d*_d) + {} + + template + QuadricT(const _Point& _pt) + { + set_distance_to_point(_pt); + } + + template + QuadricT(const _Normal& _n, const _Point& _p) + { + set_distance_to_plane(_n,_p); + } + + //set operator + void set(Scalar _a, Scalar _b, Scalar _c, Scalar _d, + Scalar _e, Scalar _f, Scalar _g, + Scalar _h, Scalar _i, + Scalar _j) + { + a_ = _a; b_ = _b; c_ = _c; d_ = _d; + e_ = _e; f_ = _f; g_ = _g; + h_ = _h; i_ = _i; + j_ = _j; + } + + //sets the quadric representing the squared distance to _pt + template + void set_distance_to_point(const _Point& _pt) + { + set(1, 0, 0, -_pt[0], + 1, 0, -_pt[1], + 1, -_pt[2], + dot(_pt,_pt)); + } + + //sets the quadric representing the squared distance to the plane [_a,_b,_c,_d] + void set_distance_to_plane(Scalar _a, Scalar _b, Scalar _c, Scalar _d) + { + a_ = _a*_a; b_ = _a*_b; c_ = _a*_c; d_ = _a*_d; + e_ = _b*_b; f_ = _b*_c; g_ = _b*_d; + h_ = _c*_c; i_ = _c*_d; + j_ = _d*_d; + } + + //sets the quadric representing the squared distance to the plane + //determined by the normal _n and the point _p + template + void set_distance_to_plane(const _Normal& _n, const _Point& _p) + { + set_distance_to_plane(_n[0], _n[1], _n[2], -dot(_n,_p)); + } + + /// set all entries to zero + void clear() { a_ = b_ = c_ = d_ = e_ = f_ = g_ = h_ = i_ = j_ = 0.0; } + + /// add quadrics + QuadricT& operator+=( const QuadricT& _q ) + { + a_ += _q.a_; b_ += _q.b_; c_ += _q.c_; d_ += _q.d_; + e_ += _q.e_; f_ += _q.f_; g_ += _q.g_; + h_ += _q.h_; i_ += _q.i_; + j_ += _q.j_; + return *this; + } + + QuadricT operator+(const QuadricT& _other ) const + { + QuadricT result = *this; + return result += _other; + } + + + /// multiply by scalar + QuadricT& operator*=( Scalar _s) + { + a_ *= _s; b_ *= _s; c_ *= _s; d_ *= _s; + e_ *= _s; f_ *= _s; g_ *= _s; + h_ *= _s; i_ *= _s; + j_ *= _s; + return *this; + } + + QuadricT operator*(Scalar _s) const + { + QuadricT result = *this; + return result *= _s; + } + + /// multiply 4D vector from right: Q*v + template + _Vec4 operator*(const _Vec4& _v) const + { + Scalar x(_v[0]), y(_v[1]), z(_v[2]), w(_v[3]); + return _Vec4(x*a_ + y*b_ + z*c_ + w*d_, + x*b_ + y*e_ + z*f_ + w*g_, + x*c_ + y*f_ + z*h_ + w*i_, + x*d_ + y*g_ + z*i_ + w*j_); + } + + /// evaluate quadric Q at (3D or 4D) vector v: v*Q*v + template + Scalar operator()(const _Vec& _v) const + { + return evaluate(_v, GenProg::Int2Type::size_>()); + } + + Scalar a() const { return a_; } + Scalar b() const { return b_; } + Scalar c() const { return c_; } + Scalar d() const { return d_; } + Scalar e() const { return e_; } + Scalar f() const { return f_; } + Scalar g() const { return g_; } + Scalar h() const { return h_; } + Scalar i() const { return i_; } + Scalar j() const { return j_; } + + Scalar xx() const { return a_; } + Scalar xy() const { return b_; } + Scalar xz() const { return c_; } + Scalar xw() const { return d_; } + Scalar yy() const { return e_; } + Scalar yz() const { return f_; } + Scalar yw() const { return g_; } + Scalar zz() const { return h_; } + Scalar zw() const { return i_; } + Scalar ww() const { return j_; } + +protected: + + /// evaluate quadric Q at 3D vector v: v*Q*v + template + Scalar evaluate(const _Vec3& _v, GenProg::Int2Type<3>/*_dimension*/) const + { + Scalar x(_v[0]), y(_v[1]), z(_v[2]); + return a_*x*x + 2.0*b_*x*y + 2.0*c_*x*z + 2.0*d_*x + + e_*y*y + 2.0*f_*y*z + 2.0*g_*y + + h_*z*z + 2.0*i_*z + + j_; + } + + /// evaluate quadric Q at 4D vector v: v*Q*v + template + Scalar evaluate(const _Vec4& _v, GenProg::Int2Type<4>/*_dimension*/) const + { + Scalar x(_v[0]), y(_v[1]), z(_v[2]), w(_v[3]); + return a_*x*x + 2.0*b_*x*y + 2.0*c_*x*z + 2.0*d_*x*w + + e_*y*y + 2.0*f_*y*z + 2.0*g_*y*w + + h_*z*z + 2.0*i_*z*w + + j_*w*w; + } + +private: + + Scalar a_, b_, c_, d_, + e_, f_, g_, + h_, i_, + j_; +}; + + +/// Quadric using floats +typedef QuadricT Quadricf; + +/// Quadric using double +typedef QuadricT Quadricd; + + +//============================================================================= +} // END_NS_GEOMETRY +} // END_NS_OPENMESH +//============================================================================ +#endif // OPENMESH_GEOMETRY_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Geometry/Vector11T.hh b/libs/OpenMesh/include/OpenMesh/Core/Geometry/Vector11T.hh new file mode 100644 index 0000000..b9113a6 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Geometry/Vector11T.hh @@ -0,0 +1,886 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +#ifndef OPENMESH_SRC_OPENMESH_CORE_GEOMETRY_VECTOR11T_HH_ +#define OPENMESH_SRC_OPENMESH_CORE_GEOMETRY_VECTOR11T_HH_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// This header is not needed by this file but expected by others including +// this file. +#include + + +/* + * Helpers for VectorT + */ +namespace { + +template +struct are_convertible_to; + +template +struct are_convertible_to { + static constexpr bool value = std::is_convertible::value + && are_convertible_to::value; +}; + +template +struct are_convertible_to : public std::is_convertible { +}; +} + +namespace OpenMesh { + +template +class VectorT { + + static_assert(DIM >= 1, "VectorT requires positive dimensionality."); + + private: + using container = std::array; + container values_; + + public: + + //---------------------------------------------------------------- class info + + /// the type of the scalar used in this template + typedef Scalar value_type; + + /// type of this vector + typedef VectorT vector_type; + + /// returns dimension of the vector (deprecated) + static constexpr int dim() { + return DIM; + } + + /// returns dimension of the vector + static constexpr size_t size() { + return DIM; + } + + static constexpr const size_t size_ = DIM; + + //-------------------------------------------------------------- constructors + + // Converting constructor: Constructs the vector from DIM values (of + // potentially heterogenous types) which are all convertible to Scalar. + template::type, + typename = typename std::enable_if< + are_convertible_to::value>::type> + constexpr VectorT(T v, Ts... vs) : values_ { {static_cast(v), static_cast(vs)...} } { + static_assert(sizeof...(Ts)+1 == DIM, + "Invalid number of components specified in constructor."); + static_assert(are_convertible_to::value, + "Not all components are convertible to Scalar."); + } + + /// default constructor creates uninitialized values. + constexpr VectorT() {} + + /** + * Creates a vector with all components set to v. + */ + explicit VectorT(const Scalar &v) { + vectorize(v); + } + + VectorT(const VectorT &rhs) = default; + VectorT(VectorT &&rhs) = default; + VectorT &operator=(const VectorT &rhs) = default; + VectorT &operator=(VectorT &&rhs) = default; + + /** + * Only for 4-component vectors with division operator on their + * Scalar: Dehomogenization. + */ + template + auto homogenized() const -> + typename std::enable_if()/std::declval()), DIM>>::type { + static_assert(D == DIM, "D and DIM need to be identical. (Never " + "override the default template arguments.)"); + static_assert(std::is_same::value, "S and Scalar need " + "to be the same type. (Never override the default template " + "arguments.)"); + return VectorT( + values_[0]/values_[3], + values_[1]/values_[3], + values_[2]/values_[3], + 1); + } + + /// construct from a value array or any other iterator + template(), void(), + ++std::declval(), void())> + explicit VectorT(Iterator it) { + std::copy_n(it, DIM, values_.begin()); + } + + /// copy & cast constructor (explicit) + template::value>> + explicit VectorT(const VectorT& _rhs) { + operator=(_rhs); + } + + //--------------------------------------------------------------------- casts + + /// cast from vector with a different scalar type + template::value>> + vector_type& operator=(const VectorT& _rhs) { + std::transform(_rhs.cbegin(), _rhs.cend(), + this->begin(), [](OtherScalar rhs) { + return static_cast(std::move(rhs)); + }); + return *this; + } + + /// access to Scalar array + Scalar* data() { return values_.data(); } + + /// access to const Scalar array + const Scalar* data() const { return values_.data(); } + + //----------------------------------------------------------- element access + + /// get i'th element read-write + Scalar& operator[](size_t _i) { + assert(_i < DIM); + return values_[_i]; + } + + /// get i'th element read-only + const Scalar& operator[](size_t _i) const { + assert(_i < DIM); + return values_[_i]; + } + + //---------------------------------------------------------------- comparsion + + /// component-wise comparison + bool operator==(const vector_type& _rhs) const { + return std::equal(_rhs.values_.cbegin(), _rhs.values_.cend(), values_.cbegin()); + } + + /// component-wise comparison + bool operator!=(const vector_type& _rhs) const { + return !std::equal(_rhs.values_.cbegin(), _rhs.values_.cend(), values_.cbegin()); + } + + //---------------------------------------------------------- scalar operators + + /// component-wise self-multiplication with scalar + template + auto operator*=(const OtherScalar& _s) -> + typename std::enable_ifvalues_[0] * _s), Scalar>::value, + VectorT&>::type { + for (auto& e : *this) { + e *= _s; + } + return *this; + } + + /// component-wise self-division by scalar + template + auto operator/=(const OtherScalar& _s) -> + typename std::enable_ifvalues_[0] / _s), Scalar>::value, + VectorT&>::type { + for (auto& e : *this) { + e /= _s; + } + return *this; + } + + /// component-wise multiplication with scalar + template + typename std::enable_if() * std::declval()), + Scalar>::value, + VectorT>::type + operator*(const OtherScalar& _s) const { + return vector_type(*this) *= _s; + } + + /// component-wise division by with scalar + template + typename std::enable_if() / std::declval()), + Scalar>::value, + VectorT>::type + operator/(const OtherScalar& _s) const { + return vector_type(*this) /= _s; + } + + //---------------------------------------------------------- vector operators + + /// component-wise self-multiplication + template + auto operator*=(const VectorT& _rhs) -> + typename std::enable_if< + sizeof(decltype(this->values_[0] * *_rhs.data())) >= 0, + vector_type&>::type { + for (int i = 0; i < DIM; ++i) { + data()[i] *= _rhs.data()[i]; + } + return *this; + } + + /// component-wise self-division + template + auto operator/=(const VectorT& _rhs) -> + typename std::enable_if< + sizeof(decltype(this->values_[0] / *_rhs.data())) >= 0, + vector_type&>::type { + for (int i = 0; i < DIM; ++i) { + data()[i] /= _rhs.data()[i]; + } + return *this; + } + + /// vector difference from this + template + auto operator-=(const VectorT& _rhs) -> + typename std::enable_if< + sizeof(decltype(this->values_[0] - *_rhs.data())) >= 0, + vector_type&>::type { + for (int i = 0; i < DIM; ++i) { + data()[i] -= _rhs.data()[i]; + } + return *this; + } + + /// vector self-addition + template + auto operator+=(const VectorT& _rhs) -> + typename std::enable_if< + sizeof(decltype(this->values_[0] + *_rhs.data())) >= 0, + vector_type&>::type { + for (int i = 0; i < DIM; ++i) { + data()[i] += _rhs.data()[i]; + } + return *this; + } + + /// component-wise vector multiplication + template + auto operator*(const VectorT& _rhs) const -> + typename std::enable_if< + sizeof(decltype(this->values_[0] * *_rhs.data())) >= 0, + vector_type>::type { + return vector_type(*this) *= _rhs; + } + + /// component-wise vector division + template + auto operator/(const VectorT& _rhs) const -> + typename std::enable_if< + sizeof(decltype(this->values_[0] / *_rhs.data())) >= 0, + vector_type>::type { + return vector_type(*this) /= _rhs; + } + + /// component-wise vector addition + template + auto operator+(const VectorT& _rhs) const -> + typename std::enable_if< + sizeof(decltype(this->values_[0] + *_rhs.data())) >= 0, + vector_type>::type { + return vector_type(*this) += _rhs; + } + + /// component-wise vector difference + template + auto operator-(const VectorT& _rhs) const -> + typename std::enable_if< + sizeof(decltype(this->values_[0] - *_rhs.data())) >= 0, + vector_type>::type { + return vector_type(*this) -= _rhs; + } + + /// unary minus + vector_type operator-(void) const { + vector_type v; + std::transform(values_.begin(), values_.end(), v.values_.begin(), + [](const Scalar &s) { return -s; }); + return v; + } + + /// cross product: only defined for Vec3* as specialization + /// \see OpenMesh::cross + template + auto operator% (const VectorT &_rhs) const -> + typename std::enable_if>::type { + return { + values_[1] * _rhs[2] - values_[2] * _rhs[1], + values_[2] * _rhs[0] - values_[0] * _rhs[2], + values_[0] * _rhs[1] - values_[1] * _rhs[0] + }; + } + + /// compute scalar product + /// \see OpenMesh::dot + template + auto operator|(const VectorT& _rhs) const -> + decltype(*this->data() * *_rhs.data()) { + + return std::inner_product(begin() + 1, begin() + DIM, _rhs.begin() + 1, + *begin() * *_rhs.begin()); + } + + //------------------------------------------------------------ euclidean norm + + /// \name Euclidean norm calculations + //@{ + + /// compute squared euclidean norm + template + decltype(std::declval() * std::declval()) sqrnorm() const { + static_assert(std::is_same::value, "S and Scalar need " + "to be the same type. (Never override the default template " + "arguments.)"); + typedef decltype(values_[0] * values_[0]) RESULT; + return std::accumulate(values_.cbegin() + 1, values_.cend(), + values_[0] * values_[0], + [](const RESULT &l, const Scalar &r) { return l + r * r; }); + } + + /// compute euclidean norm + template + auto norm() const -> + decltype(std::sqrt(std::declval>().sqrnorm())) { + static_assert(std::is_same::value, "S and Scalar need " + "to be the same type. (Never override the default template " + "arguments.)"); + return std::sqrt(sqrnorm()); + } + + template + auto length() const -> + decltype(std::declval>().norm()) { + static_assert(std::is_same::value, "S and Scalar need " + "to be the same type. (Never override the default template " + "arguments.)"); + return norm(); + } + + /** normalize vector, return normalized vector + */ + template + auto normalize() -> + decltype(*this /= std::declval>().norm()) { + static_assert(std::is_same::value, "S and Scalar need " + "to be the same type. (Never override the default template " + "arguments.)"); + return *this /= norm(); + } + + /** return normalized vector + */ + template + auto normalized() const -> + decltype(*this / std::declval>().norm()) { + static_assert(std::is_same::value, "S and Scalar need " + "to be the same type. (Never override the default template " + "arguments.)"); + return *this / norm(); + } + + /** normalize vector, return normalized vector and avoids div by zero + */ + template + typename std::enable_if< + sizeof(decltype( + static_cast(0), + std::declval>().norm())) >= 0, + vector_type&>::type + normalize_cond() { + static_assert(std::is_same::value, "S and Scalar need " + "to be the same type. (Never override the default template " + "arguments.)"); + auto n = norm(); + if (n != static_cast(0)) { + *this /= n; + } + return *this; + } + + //@} + + //------------------------------------------------------------ euclidean norm + + /// \name Non-Euclidean norm calculations + //@{ + + /// compute L1 (Manhattan) norm + Scalar l1_norm() const { + return std::accumulate( + values_.cbegin() + 1, values_.cend(), values_[0]); + } + + /// compute l8_norm + Scalar l8_norm() const { + return max_abs(); + } + + //@} + + //------------------------------------------------------------ max, min, mean + + /// \name Minimum maximum and mean + //@{ + + /// return the maximal component + Scalar max() const { + return *std::max_element(values_.cbegin(), values_.cend()); + } + + /// return the maximal absolute component + Scalar max_abs() const { + return std::abs( + *std::max_element(values_.cbegin(), values_.cend(), + [](const Scalar &a, const Scalar &b) { + return std::abs(a) < std::abs(b); + })); + } + + /// return the minimal component + Scalar min() const { + return *std::min_element(values_.cbegin(), values_.cend()); + } + + /// return the minimal absolute component + Scalar min_abs() const { + return std::abs( + *std::min_element(values_.cbegin(), values_.cend(), + [](const Scalar &a, const Scalar &b) { + return std::abs(a) < std::abs(b); + })); + } + + /// return arithmetic mean + Scalar mean() const { + return l1_norm()/DIM; + } + + /// return absolute arithmetic mean + Scalar mean_abs() const { + return std::accumulate(values_.cbegin() + 1, values_.cend(), + std::abs(values_[0]), + [](const Scalar &l, const Scalar &r) { + return l + std::abs(r); + }) / DIM; + } + + /// minimize values: same as *this = min(*this, _rhs), but faster + vector_type& minimize(const vector_type& _rhs) { + std::transform(values_.cbegin(), values_.cend(), + _rhs.values_.cbegin(), + values_.begin(), + [](const Scalar &l, const Scalar &r) { + return std::min(l, r); + }); + return *this; + } + + /// minimize values and signalize coordinate minimization + bool minimized(const vector_type& _rhs) { + bool result = false; + std::transform(values_.cbegin(), values_.cend(), + _rhs.values_.cbegin(), + values_.begin(), + [&result](const Scalar &l, const Scalar &r) { + if (l < r) { + return l; + } else { + result = true; + return r; + } + }); + return result; + } + + /// maximize values: same as *this = max(*this, _rhs), but faster + vector_type& maximize(const vector_type& _rhs) { + std::transform(values_.cbegin(), values_.cend(), + _rhs.values_.cbegin(), + values_.begin(), + [](const Scalar &l, const Scalar &r) { + return std::max(l, r); + }); + return *this; + } + + /// maximize values and signalize coordinate maximization + bool maximized(const vector_type& _rhs) { + bool result = false; + std::transform(values_.cbegin(), values_.cend(), + _rhs.values_.cbegin(), + values_.begin(), + [&result](const Scalar &l, const Scalar &r) { + if (l > r) { + return l; + } else { + result = true; + return r; + } + }); + return result; + } + + /// component-wise min + inline vector_type min(const vector_type& _rhs) const { + return vector_type(*this).minimize(_rhs); + } + + /// component-wise max + inline vector_type max(const vector_type& _rhs) const { + return vector_type(*this).maximize(_rhs); + } + + //@} + + //------------------------------------------------------------ misc functions + + /// component-wise apply function object with Scalar operator()(Scalar). + template + inline vector_type apply(const Functor& _func) const { + vector_type result; + std::transform(result.values_.cbegin(), result.values_.cend(), + result.values_.begin(), _func); + return result; + } + + /// store the same value in each component (e.g. to clear all entries) + vector_type& vectorize(const Scalar& _s) { + std::fill(values_.begin(), values_.end(), _s); + return *this; + } + + /// store the same value in each component + static vector_type vectorized(const Scalar& _s) { + return vector_type().vectorize(_s); + } + + /// lexicographical comparison + bool operator<(const vector_type& _rhs) const { + return std::lexicographical_compare( + values_.begin(), values_.end(), + _rhs.values_.begin(), _rhs.values_.end()); + } + + /// swap with another vector + void swap(VectorT& _other) + noexcept(noexcept(std::swap(values_, _other.values_))) { + std::swap(values_, _other.values_); + } + + //------------------------------------------------------------ component iterators + + /// \name Component iterators + //@{ + + using iterator = typename container::iterator; + using const_iterator = typename container::const_iterator; + using reverse_iterator = typename container::reverse_iterator; + using const_reverse_iterator = typename container::const_reverse_iterator; + + iterator begin() noexcept { return values_.begin(); } + const_iterator begin() const noexcept { return values_.cbegin(); } + const_iterator cbegin() const noexcept { return values_.cbegin(); } + + iterator end() noexcept { return values_.end(); } + const_iterator end() const noexcept { return values_.cend(); } + const_iterator cend() const noexcept { return values_.cend(); } + + reverse_iterator rbegin() noexcept { return values_.rbegin(); } + const_reverse_iterator rbegin() const noexcept { return values_.crbegin(); } + const_reverse_iterator crbegin() const noexcept { return values_.crbegin(); } + + reverse_iterator rend() noexcept { return values_.rend(); } + const_reverse_iterator rend() const noexcept { return values_.crend(); } + const_reverse_iterator crend() const noexcept { return values_.crend(); } + + //@} +}; + +/// Component wise multiplication from the left +template +auto operator*(const OtherScalar& _s, const VectorT &rhs) -> + decltype(rhs.operator*(_s)) { + + return rhs * _s; +} + +/// output a vector by printing its space-separated compontens +template +auto operator<<(std::ostream& os, const VectorT &_vec) -> + typename std::enable_if< + sizeof(decltype(os << _vec[0])) >= 0, std::ostream&>::type { + + os << _vec[0]; + for (int i = 1; i < DIM; ++i) { + os << " " << _vec[i]; + } + return os; +} + +/// read the space-separated components of a vector from a stream +template +auto operator>> (std::istream& is, VectorT &_vec) -> + typename std::enable_if< + sizeof(decltype(is >> _vec[0])) >= 0, std::istream &>::type { + for (int i = 0; i < DIM; ++i) + is >> _vec[i]; + return is; +} + +/// \relates OpenMesh::VectorT +/// symmetric version of the dot product +template +Scalar dot(const VectorT& _v1, const VectorT& _v2) { + return (_v1 | _v2); +} + +/// \relates OpenMesh::VectorT +/// symmetric version of the cross product +template +auto +cross(const VectorT& _v1, const VectorT& _v2) -> + decltype(_v1 % _v2) { + return (_v1 % _v2); +} + +/// \relates OpenMesh::VectorT +/// non-member swap +template +void swap(VectorT& _v1, VectorT& _v2) +noexcept(noexcept(_v1.swap(_v2))) { + _v1.swap(_v2); +} + +/// \relates OpenMesh::VectorT +/// non-member norm +template +Scalar norm(const VectorT& _v) { + return _v.norm(); +} + +/// \relates OpenMesh::VectorT +/// non-member sqrnorm +template +Scalar sqrnorm(const VectorT& _v) { + return _v.sqrnorm(); +} +/// \relates OpenMesh::VectorT +/// non-member vectorize +template +VectorT& vectorize(VectorT& _v, OtherScalar const& _val) { + return _v.vectorize(_val); +} + +/// \relates OpenMesh::VectorT +/// non-member normalize +template +VectorT& normalize(VectorT& _v) { + return _v.normalize(); +} + +/// \relates OpenMesh::VectorT +/// non-member maximize +template +VectorT& maximize(VectorT& _v1, VectorT& _v2) { + return _v1.maximize(_v2); +} + +/// \relates OpenMesh::VectorT +/// non-member minimize +template +VectorT& minimize(VectorT& _v1, VectorT& _v2) { + return _v1.minimize(_v2); +} + +//== TYPEDEFS ================================================================= + +/** 1-byte signed vector */ +typedef VectorT Vec1c; +/** 1-byte unsigned vector */ +typedef VectorT Vec1uc; +/** 1-short signed vector */ +typedef VectorT Vec1s; +/** 1-short unsigned vector */ +typedef VectorT Vec1us; +/** 1-int signed vector */ +typedef VectorT Vec1i; +/** 1-int unsigned vector */ +typedef VectorT Vec1ui; +/** 1-float vector */ +typedef VectorT Vec1f; +/** 1-double vector */ +typedef VectorT Vec1d; + +/** 2-byte signed vector */ +typedef VectorT Vec2c; +/** 2-byte unsigned vector */ +typedef VectorT Vec2uc; +/** 2-short signed vector */ +typedef VectorT Vec2s; +/** 2-short unsigned vector */ +typedef VectorT Vec2us; +/** 2-int signed vector */ +typedef VectorT Vec2i; +/** 2-int unsigned vector */ +typedef VectorT Vec2ui; +/** 2-float vector */ +typedef VectorT Vec2f; +/** 2-double vector */ +typedef VectorT Vec2d; + +/** 3-byte signed vector */ +typedef VectorT Vec3c; +/** 3-byte unsigned vector */ +typedef VectorT Vec3uc; +/** 3-short signed vector */ +typedef VectorT Vec3s; +/** 3-short unsigned vector */ +typedef VectorT Vec3us; +/** 3-int signed vector */ +typedef VectorT Vec3i; +/** 3-int unsigned vector */ +typedef VectorT Vec3ui; +/** 3-float vector */ +typedef VectorT Vec3f; +/** 3-double vector */ +typedef VectorT Vec3d; +/** 3-bool vector */ +typedef VectorT Vec3b; + +/** 4-byte signed vector */ +typedef VectorT Vec4c; +/** 4-byte unsigned vector */ +typedef VectorT Vec4uc; +/** 4-short signed vector */ +typedef VectorT Vec4s; +/** 4-short unsigned vector */ +typedef VectorT Vec4us; +/** 4-int signed vector */ +typedef VectorT Vec4i; +/** 4-int unsigned vector */ +typedef VectorT Vec4ui; +/** 4-float vector */ +typedef VectorT Vec4f; +/** 4-double vector */ +typedef VectorT Vec4d; + +/** 5-byte signed vector */ +typedef VectorT Vec5c; +/** 5-byte unsigned vector */ +typedef VectorT Vec5uc; +/** 5-short signed vector */ +typedef VectorT Vec5s; +/** 5-short unsigned vector */ +typedef VectorT Vec5us; +/** 5-int signed vector */ +typedef VectorT Vec5i; +/** 5-int unsigned vector */ +typedef VectorT Vec5ui; +/** 5-float vector */ +typedef VectorT Vec5f; +/** 5-double vector */ +typedef VectorT Vec5d; + +/** 6-byte signed vector */ +typedef VectorT Vec6c; +/** 6-byte unsigned vector */ +typedef VectorT Vec6uc; +/** 6-short signed vector */ +typedef VectorT Vec6s; +/** 6-short unsigned vector */ +typedef VectorT Vec6us; +/** 6-int signed vector */ +typedef VectorT Vec6i; +/** 6-int unsigned vector */ +typedef VectorT Vec6ui; +/** 6-float vector */ +typedef VectorT Vec6f; +/** 6-double vector */ +typedef VectorT Vec6d; + +} // namespace OpenMesh + +/** + * Literal operator for inline specification of colors in HTML syntax. + * + * Example: + * \code{.cpp} + * OpenMesh::Vec4f light_blue = 0x1FCFFFFF_htmlColor; + * \endcode + */ +constexpr OpenMesh::Vec4f operator"" _htmlColor(unsigned long long raw_color) { + return OpenMesh::Vec4f( + ((raw_color >> 24) & 0xFF) / 255.0f, + ((raw_color >> 16) & 0xFF) / 255.0f, + ((raw_color >> 8) & 0xFF) / 255.0f, + ((raw_color >> 0) & 0xFF) / 255.0f); +} + +#endif /* OPENMESH_SRC_OPENMESH_CORE_GEOMETRY_VECTOR11T_HH_ */ diff --git a/libs/OpenMesh/include/OpenMesh/Core/Geometry/VectorT.hh b/libs/OpenMesh/include/OpenMesh/Core/Geometry/VectorT.hh new file mode 100644 index 0000000..3384332 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Geometry/VectorT.hh @@ -0,0 +1,440 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// CLASS VectorT +// +//============================================================================= + +// Don't parse this header file with doxygen since +// for some reason (obviously due to a bug in doxygen, +// bugreport: https://bugzilla.gnome.org/show_bug.cgi?id=629182) +// macro expansion and preprocessor defines +// don't work properly. + +#if ((defined(_MSC_VER) && (_MSC_VER >= 1900)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENMESH_VECTOR_LEGACY) +#include "Vector11T.hh" +#else +#ifndef DOXYGEN + +#ifndef OPENMESH_VECTOR_HH +#define OPENMESH_VECTOR_HH + + +//== INCLUDES ================================================================= + +#include +#include +#include +#include +#include + +#if defined(__GNUC__) && defined(__SSE__) +#include +#endif + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + + +//== CLASS DEFINITION ========================================================= + + +/** The N values of the template Scalar type are the only data members + of the class VectorT. This guarantees 100% compatibility + with arrays of type Scalar and size N, allowing us to define the + cast operators to and from arrays and array pointers. + + In addition, this class will be specialized for Vec4f to be 16 bit + aligned, so that aligned SSE instructions can be used on these + vectors. +*/ +template class VectorDataT { + public: + Scalar values_[N]; +}; + + +#if defined(__GNUC__) && defined(__SSE__) + +/// This specialization enables us to use aligned SSE instructions. +template<> class VectorDataT { + public: + union { + __m128 m128; + float values_[4]; + }; +}; + +#endif + + + + +//== CLASS DEFINITION ========================================================= + + +#define DIM N +#define TEMPLATE_HEADER template +#define CLASSNAME VectorT +#define DERIVED VectorDataT +#define unroll(expr) for (int i=0; i + A vector is an array of \ values of type \. + The actual data is stored in an VectorDataT, this class just adds + the necessary operators. +*/ +#include "VectorT_inc.hh" + +#undef DIM +#undef TEMPLATE_HEADER +#undef CLASSNAME +#undef DERIVED +#undef unroll + + + + +//== PARTIAL TEMPLATE SPECIALIZATIONS ========================================= +#if OM_PARTIAL_SPECIALIZATION + + +#define TEMPLATE_HEADER template +#define CLASSNAME VectorT +#define DERIVED VectorDataT + + +#define DIM 2 +#define unroll(expr) expr(0) expr(1) +#define unroll_comb(expr, op) expr(0) op expr(1) +#define unroll_csv(expr) expr(0), expr(1) +#include "VectorT_inc.hh" +#undef DIM +#undef unroll +#undef unroll_comb +#undef unroll_csv + + +#define DIM 3 +#define unroll(expr) expr(0) expr(1) expr(2) +#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) +#define unroll_csv(expr) expr(0), expr(1), expr(2) +#include "VectorT_inc.hh" +#undef DIM +#undef unroll +#undef unroll_comb +#undef unroll_csv + + +#define DIM 4 +#define unroll(expr) expr(0) expr(1) expr(2) expr(3) +#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) +#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3) +#include "VectorT_inc.hh" +#undef DIM +#undef unroll +#undef unroll_comb +#undef unroll_csv + +#define DIM 5 +#define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4) +#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op expr(4) +#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4) +#include "VectorT_inc.hh" +#undef DIM +#undef unroll +#undef unroll_comb +#undef unroll_csv + +#define DIM 6 +#define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4) expr(5) +#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op expr(4) op expr(5) +#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4), expr(5) +#include "VectorT_inc.hh" +#undef DIM +#undef unroll +#undef unroll_comb +#undef unroll_csv + + +#undef TEMPLATE_HEADER +#undef CLASSNAME +#undef DERIVED + + + + +//== FULL TEMPLATE SPECIALIZATIONS ============================================ +#else + +/// cross product for Vec3f +template<> +inline VectorT +VectorT::operator%(const VectorT& _rhs) const +{ + return + VectorT(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1], + values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2], + values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]); +} + + +/// cross product for Vec3d +template<> +inline VectorT +VectorT::operator%(const VectorT& _rhs) const +{ + return + VectorT(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1], + values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2], + values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]); +} + +#endif + + + +//== GLOBAL FUNCTIONS ========================================================= + + +/// \relates OpenMesh::VectorT +/// scalar * vector +template +inline VectorT operator*(Scalar2 _s, const VectorT& _v) { + return _v*_s; +} + + +/// \relates OpenMesh::VectorT +/// symmetric version of the dot product +template +inline Scalar +dot(const VectorT& _v1, const VectorT& _v2) { + return (_v1 | _v2); +} + + +/// \relates OpenMesh::VectorT +/// symmetric version of the cross product +template +inline VectorT +cross(const VectorT& _v1, const VectorT& _v2) { + return (_v1 % _v2); +} + + +/// \relates OpenMesh::VectorT +/// non-member norm +template +Scalar norm(const VectorT& _v) { + return _v.norm(); +} + + +/// \relates OpenMesh::VectorT +/// non-member sqrnorm +template +Scalar sqrnorm(const VectorT& _v) { + return _v.sqrnorm(); +} + + +/// \relates OpenMesh::VectorT +/// non-member vectorize +template +VectorT& vectorize(VectorT& _v, OtherScalar const& _val) { + return _v.vectorize(_val); +} + + +/// \relates OpenMesh::VectorT +/// non-member normalize +template +VectorT& normalize(VectorT& _v) { + return _v.normalize(); +} + + +/// \relates OpenMesh::VectorT +/// non-member maximize +template +VectorT& maximize(VectorT& _v1, VectorT& _v2) { + return _v1.maximize(_v2); +} + + +/// \relates OpenMesh::VectorT +/// non-member minimize +template +VectorT& minimize(VectorT& _v1, VectorT& _v2) { + return _v1.minimize(_v2); +} + + +//== TYPEDEFS ================================================================= + +/** 1-byte signed vector */ +typedef VectorT Vec1c; +/** 1-byte unsigned vector */ +typedef VectorT Vec1uc; +/** 1-short signed vector */ +typedef VectorT Vec1s; +/** 1-short unsigned vector */ +typedef VectorT Vec1us; +/** 1-int signed vector */ +typedef VectorT Vec1i; +/** 1-int unsigned vector */ +typedef VectorT Vec1ui; +/** 1-float vector */ +typedef VectorT Vec1f; +/** 1-double vector */ +typedef VectorT Vec1d; + +/** 2-byte signed vector */ +typedef VectorT Vec2c; +/** 2-byte unsigned vector */ +typedef VectorT Vec2uc; +/** 2-short signed vector */ +typedef VectorT Vec2s; +/** 2-short unsigned vector */ +typedef VectorT Vec2us; +/** 2-int signed vector */ +typedef VectorT Vec2i; +/** 2-int unsigned vector */ +typedef VectorT Vec2ui; +/** 2-float vector */ +typedef VectorT Vec2f; +/** 2-double vector */ +typedef VectorT Vec2d; + +/** 3-byte signed vector */ +typedef VectorT Vec3c; +/** 3-byte unsigned vector */ +typedef VectorT Vec3uc; +/** 3-short signed vector */ +typedef VectorT Vec3s; +/** 3-short unsigned vector */ +typedef VectorT Vec3us; +/** 3-int signed vector */ +typedef VectorT Vec3i; +/** 3-int unsigned vector */ +typedef VectorT Vec3ui; +/** 3-float vector */ +typedef VectorT Vec3f; +/** 3-double vector */ +typedef VectorT Vec3d; +/** 3-bool vector */ +typedef VectorT Vec3b; + +/** 4-byte signed vector */ +typedef VectorT Vec4c; +/** 4-byte unsigned vector */ +typedef VectorT Vec4uc; +/** 4-short signed vector */ +typedef VectorT Vec4s; +/** 4-short unsigned vector */ +typedef VectorT Vec4us; +/** 4-int signed vector */ +typedef VectorT Vec4i; +/** 4-int unsigned vector */ +typedef VectorT Vec4ui; +/** 4-float vector */ +typedef VectorT Vec4f; +/** 4-double vector */ +typedef VectorT Vec4d; + +/** 5-byte signed vector */ +typedef VectorT Vec5c; +/** 5-byte unsigned vector */ +typedef VectorT Vec5uc; +/** 5-short signed vector */ +typedef VectorT Vec5s; +/** 5-short unsigned vector */ +typedef VectorT Vec5us; +/** 5-int signed vector */ +typedef VectorT Vec5i; +/** 5-int unsigned vector */ +typedef VectorT Vec5ui; +/** 5-float vector */ +typedef VectorT Vec5f; +/** 5-double vector */ +typedef VectorT Vec5d; + +/** 6-byte signed vector */ +typedef VectorT Vec6c; +/** 6-byte unsigned vector */ +typedef VectorT Vec6uc; +/** 6-short signed vector */ +typedef VectorT Vec6s; +/** 6-short unsigned vector */ +typedef VectorT Vec6us; +/** 6-int signed vector */ +typedef VectorT Vec6i; +/** 6-int unsigned vector */ +typedef VectorT Vec6ui; +/** 6-float vector */ +typedef VectorT Vec6f; +/** 6-double vector */ +typedef VectorT Vec6d; + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= + + +#endif // OPENMESH_VECTOR_HH defined +//============================================================================= +#endif // DOXYGEN +#endif // C++11 diff --git a/libs/OpenMesh/include/OpenMesh/Core/Geometry/VectorT_inc.hh b/libs/OpenMesh/include/OpenMesh/Core/Geometry/VectorT_inc.hh new file mode 100644 index 0000000..96b6c10 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Geometry/VectorT_inc.hh @@ -0,0 +1,668 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + + + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +// Set template keywords and class names properly when +// parsing with doxygen. This only seems to work this way since +// the scope of preprocessor defines is limited to one file in doxy. +#ifdef DOXYGEN + +// Only used for correct doxygen parsing +#define OPENMESH_VECTOR_HH + +#define DIM N +#define TEMPLATE_HEADER template +#define CLASSNAME VectorT +#define DERIVED VectorDataT +#define unroll(expr) for (int i=0; i vector_type; + + /// returns dimension of the vector (deprecated) + static inline int dim() { return DIM; } + + /// returns dimension of the vector + static inline size_t size() { return DIM; } + + static const size_t size_ = DIM; + + + //-------------------------------------------------------------- constructors + + /// default constructor creates uninitialized values. + inline VectorT() {} + + /// special constructor for 1D vectors + explicit inline VectorT(const Scalar& v) { +// assert(DIM==1); +// values_[0] = v0; + vectorize(v); + } + +#if DIM == 2 + /// special constructor for 2D vectors + inline VectorT(const Scalar v0, const Scalar v1) { + Base::values_[0] = v0; Base::values_[1] = v1; + } +#endif + +#if DIM == 3 + /// special constructor for 3D vectors + inline VectorT(const Scalar v0, const Scalar v1, const Scalar v2) { + Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2; + } +#endif + +#if DIM == 4 + /// special constructor for 4D vectors + inline VectorT(const Scalar v0, const Scalar v1, + const Scalar v2, const Scalar v3) { + Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2; Base::values_[3]=v3; + } + + VectorT homogenized() const { return VectorT(Base::values_[0]/Base::values_[3], Base::values_[1]/Base::values_[3], Base::values_[2]/Base::values_[3], 1); } +#endif + +#if DIM == 5 + /// special constructor for 5D vectors + inline VectorT(const Scalar v0, const Scalar v1, const Scalar v2, + const Scalar v3, const Scalar v4) { + Base::values_[0]=v0; Base::values_[1]=v1;Base::values_[2]=v2; Base::values_[3]=v3; Base::values_[4]=v4; + } +#endif + +#if DIM == 6 + /// special constructor for 6D vectors + inline VectorT(const Scalar v0, const Scalar v1, const Scalar v2, + const Scalar v3, const Scalar v4, const Scalar v5) { + Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2; + Base::values_[3]=v3; Base::values_[4]=v4; Base::values_[5]=v5; + } +#endif + + /// construct from a value array (explicit) + explicit inline VectorT(const Scalar _values[DIM]) { + memcpy(data(), _values, DIM*sizeof(Scalar)); + } + + +#ifdef OM_CC_MIPS + /// assignment from a vector of the same kind + // mipspro need this method + inline vector_type& operator=(const vector_type& _rhs) { + memcpy(Base::values_, _rhs.Base::values_, DIM*sizeof(Scalar)); + return *this; + } +#endif + + + /// copy & cast constructor (explicit) + template + explicit inline VectorT(const VectorT& _rhs) { + operator=(_rhs); + } + + + + + //--------------------------------------------------------------------- casts + + /// cast from vector with a different scalar type + template + inline vector_type& operator=(const VectorT& _rhs) { +#define expr(i) Base::values_[i] = (Scalar)_rhs[i]; + unroll(expr); +#undef expr + return *this; + } + +// /// cast to Scalar array +// inline operator Scalar*() { return Base::values_; } + +// /// cast to const Scalar array +// inline operator const Scalar*() const { return Base::values_; } + + /// access to Scalar array + inline Scalar* data() { return Base::values_; } + + /// access to const Scalar array + inline const Scalar*data() const { return Base::values_; } + + + //----------------------------------------------------------- element access + +// /// get i'th element read-write +// inline Scalar& operator[](int _i) { +// assert(_i>=0 && _i=0 && _i operator%(const VectorT& _rhs) const +#if DIM==3 + { + return + VectorT(Base::values_[1]*_rhs.Base::values_[2]-Base::values_[2]*_rhs.Base::values_[1], + Base::values_[2]*_rhs.Base::values_[0]-Base::values_[0]*_rhs.Base::values_[2], + Base::values_[0]*_rhs.Base::values_[1]-Base::values_[1]*_rhs.Base::values_[0]); + } +#else + ; +#endif + + + /// compute scalar product + /// \see OpenMesh::dot + inline Scalar operator|(const vector_type& _rhs) const { + Scalar p(0); +#define expr(i) p += Base::values_[i] * _rhs.Base::values_[i]; + unroll(expr); +#undef expr + return p; + } + + + + + + //------------------------------------------------------------ euclidean norm + + /// \name Euclidean norm calculations + //@{ + /// compute euclidean norm + inline Scalar norm() const { return (Scalar)sqrt(sqrnorm()); } + inline Scalar length() const { return norm(); } // OpenSG interface + + /// compute squared euclidean norm + inline Scalar sqrnorm() const + { +#if DIM==N + Scalar s(0); +#define expr(i) s += Base::values_[i] * Base::values_[i]; + unroll(expr); +#undef expr + return s; +#else +#define expr(i) Base::values_[i]*Base::values_[i] + return (unroll_comb(expr, +)); +#undef expr +#endif + } + + /** normalize vector, return normalized vector + */ + + inline vector_type& normalize() + { + *this /= norm(); + return *this; + } + + /** return normalized vector + */ + + inline const vector_type normalized() const + { + return *this / norm(); + } + + /** normalize vector, return normalized vector and avoids div by zero + */ + inline vector_type& normalize_cond() + { + Scalar n = norm(); + if (n != (Scalar)0.0) + { + *this /= n; + } + return *this; + } + + //@} + + //------------------------------------------------------------ euclidean norm + + /// \name Non-Euclidean norm calculations + //@{ + + /// compute L1 (Manhattan) norm + inline Scalar l1_norm() const + { +#if DIM==N + Scalar s(0); +#define expr(i) s += std::abs(Base::values_[i]); + unroll(expr); +#undef expr + return s; +#else +#define expr(i) std::abs(Base::values_[i]) + return (unroll_comb(expr, +)); +#undef expr +#endif + } + + /// compute l8_norm + inline Scalar l8_norm() const + { + return max_abs(); + } + + //@} + + //------------------------------------------------------------ max, min, mean + + /// \name Minimum maximum and mean + //@{ + + /// return the maximal component + inline Scalar max() const + { + Scalar m(Base::values_[0]); + for(int i=1; im) m=Base::values_[i]; + return m; + } + + /// return the maximal absolute component + inline Scalar max_abs() const + { + Scalar m(std::abs(Base::values_[0])); + for(int i=1; im) + m=std::abs(Base::values_[i]); + return m; + } + + + /// return the minimal component + inline Scalar min() const + { + Scalar m(Base::values_[0]); + for(int i=1; i Base::values_[i]) Base::values_[i] = _rhs[i]; + unroll(expr); +#undef expr + return *this; + } + + /// maximize values and signalize coordinate maximization + inline bool maximized(const vector_type& _rhs) { + bool result(false); +#define expr(i) if (_rhs[i] > Base::values_[i]) { Base::values_[i] =_rhs[i]; result = true; } + unroll(expr); +#undef expr + return result; + } + + /// component-wise min + inline vector_type min(const vector_type& _rhs) const { + return vector_type(*this).minimize(_rhs); + } + + /// component-wise max + inline vector_type max(const vector_type& _rhs) const { + return vector_type(*this).maximize(_rhs); + } + + //@} + + //------------------------------------------------------------ misc functions + + /// component-wise apply function object with Scalar operator()(Scalar). + template + inline vector_type apply(const Functor& _func) const { + vector_type result; +#define expr(i) result[i] = _func(Base::values_[i]); + unroll(expr); +#undef expr + return result; + } + + /// store the same value in each component (e.g. to clear all entries) + vector_type& vectorize(const Scalar& _s) { +#define expr(i) Base::values_[i] = _s; + unroll(expr); +#undef expr + return *this; + } + + + /// store the same value in each component + static vector_type vectorized(const Scalar& _s) { + return vector_type().vectorize(_s); + } + + + /// lexicographical comparison + bool operator<(const vector_type& _rhs) const { +#define expr(i) if (Base::values_[i] != _rhs.Base::values_[i]) \ + return (Base::values_[i] < _rhs.Base::values_[i]); + unroll(expr); +#undef expr + return false; + } +}; + + + +/// read the space-separated components of a vector from a stream +TEMPLATE_HEADER +inline std::istream& +operator>>(std::istream& is, VectorT& vec) +{ +#define expr(i) is >> vec[i]; + unroll(expr); +#undef expr + return is; +} + + +/// output a vector by printing its space-separated compontens +TEMPLATE_HEADER +inline std::ostream& +operator<<(std::ostream& os, const VectorT& vec) +{ +#if DIM==N + for(int i=0; i +// -------------------- STL +#if defined( OM_CC_MIPS ) +# include +#else +# include +#endif +#include +// -------------------- OpenMesh + + +//== NAMESPACES =============================================================== + +namespace OpenMesh { +namespace IO { + + +//============================================================================= + + +/** \name Handling binary input/output. + These functions take care of swapping bytes to get the right Endian. +*/ +//@{ + +//----------------------------------------------------------------------------- + + +/** Binary read a \c short from \c _is and perform byte swapping if + \c _swap is true */ +short int read_short(FILE* _in, bool _swap=false); + +/** Binary read an \c int from \c _is and perform byte swapping if + \c _swap is true */ +int read_int(FILE* _in, bool _swap=false); + +/** Binary read a \c float from \c _is and perform byte swapping if + \c _swap is true */ +float read_float(FILE* _in, bool _swap=false); + +/** Binary read a \c double from \c _is and perform byte swapping if + \c _swap is true */ +double read_double(FILE* _in, bool _swap=false); + +/** Binary read a \c short from \c _is and perform byte swapping if + \c _swap is true */ +short int read_short(std::istream& _in, bool _swap=false); + +/** Binary read an \c int from \c _is and perform byte swapping if + \c _swap is true */ +int read_int(std::istream& _in, bool _swap=false); + +/** Binary read a \c float from \c _is and perform byte swapping if + \c _swap is true */ +float read_float(std::istream& _in, bool _swap=false); + +/** Binary read a \c double from \c _is and perform byte swapping if + \c _swap is true */ +double read_double(std::istream& _in, bool _swap=false); + + +/** Binary write a \c short to \c _os and perform byte swapping if + \c _swap is true */ +void write_short(short int _i, FILE* _out, bool _swap=false); + +/** Binary write an \c int to \c _os and perform byte swapping if + \c _swap is true */ +void write_int(int _i, FILE* _out, bool _swap=false); + +/** Binary write a \c float to \c _os and perform byte swapping if + \c _swap is true */ +void write_float(float _f, FILE* _out, bool _swap=false); + +/** Binary write a \c double to \c _os and perform byte swapping if + \c _swap is true */ +void write_double(double _d, FILE* _out, bool _swap=false); + +/** Binary write a \c short to \c _os and perform byte swapping if + \c _swap is true */ +void write_short(short int _i, std::ostream& _out, bool _swap=false); + +/** Binary write an \c int to \c _os and perform byte swapping if + \c _swap is true */ +void write_int(int _i, std::ostream& _out, bool _swap=false); + +/** Binary write a \c float to \c _os and perform byte swapping if + \c _swap is true */ +void write_float(float _f, std::ostream& _out, bool _swap=false); + +/** Binary write a \c double to \c _os and perform byte swapping if + \c _swap is true */ +void write_double(double _d, std::ostream& _out, bool _swap=false); + +//@} + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_MESHREADER_HH defined +//============================================================================= + diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/IOInstances.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/IOInstances.hh new file mode 100644 index 0000000..744b9a8 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/IOInstances.hh @@ -0,0 +1,115 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Helper file for static builds +// +// In opposite to dynamic builds where the instance of every reader module +// is generated within the OpenMesh library, static builds only instanciate +// objects that are at least referenced once. As all reader modules are +// never used directly, they will not be part of a static build, hence +// this file. +// +//============================================================================= + + +#ifndef __IOINSTANCES_HH__ +#define __IOINSTANCES_HH__ + +#if defined(OM_STATIC_BUILD) || defined(ARCH_DARWIN) + +//============================================================================= + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +//=== NAMESPACES ============================================================== + +namespace OpenMesh { +namespace IO { + +//============================================================================= + + +// Instanciate every Reader module +static BaseReader* OFFReaderInstance = &OFFReader(); +static BaseReader* OBJReaderInstance = &OBJReader(); +static BaseReader* PLYReaderInstance = &PLYReader(); +static BaseReader* STLReaderInstance = &STLReader(); +static BaseReader* OMReaderInstance = &OMReader(); + +// Instanciate every writer module +static BaseWriter* OBJWriterInstance = &OBJWriter(); +static BaseWriter* OFFWriterInstance = &OFFWriter(); +static BaseWriter* STLWriterInstance = &STLWriter(); +static BaseWriter* OMWriterInstance = &OMWriter(); +static BaseWriter* PLYWriterInstance = &PLYWriter(); + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif // static ? +#endif //__IOINSTANCES_HH__ +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/IOManager.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/IOManager.hh new file mode 100644 index 0000000..58c157f --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/IOManager.hh @@ -0,0 +1,272 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +//============================================================================= +// +// Implements the OpenMesh IOManager singleton +// +//============================================================================= + +#ifndef __IOMANAGER_HH__ +#define __IOMANAGER_HH__ + + +//=== INCLUDES ================================================================ + + +// STL +#include +#include +#include +#include + +// OpenMesh +#include +#include +#include +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { +namespace IO { + + +//=== IMPLEMENTATION ========================================================== + + +/** This is the real IOManager class that is later encapsulated by + SingletonT to enforce its uniqueness. _IOManager_ is not meant to be used + directly by the programmer - the IOManager alias exists for this task. + + All reader/writer modules register themselves at this class. For + reading or writing data all modules are asked to do the job. If no + suitable module is found, an error is returned. + + For the sake of reading, the target data structure is hidden + behind the BaseImporter interface that takes care of adding + vertices or faces. + + Writing from a source structure is encapsulate similarly behind a + BaseExporter interface, providing iterators over vertices/faces to + the writer modules. + + \see \ref mesh_io +*/ + +class OPENMESHDLLEXPORT _IOManager_ +{ +private: + + /// Constructor has nothing todo for the Manager + _IOManager_() {} + + /// Destructor has nothing todo for the Manager + ~_IOManager_() {}; + + /** Declare the singleton getter function as friend to access the private constructor + and destructor + */ + friend OPENMESHDLLEXPORT _IOManager_& IOManager(); + +public: + + /** + Read a mesh from file _filename. The target data structure is specified + by the given BaseImporter. The \c read method consecutively queries all + of its reader modules. True is returned upon success, false if all + reader modules failed to interprete _filename. + */ + bool read(const std::string& _filename, + BaseImporter& _bi, + Options& _opt); + +/** + Read a mesh from open std::istream _is. The target data structure is specified + by the given BaseImporter. The \c sread method consecutively queries all + of its reader modules. True is returned upon success, false if all + reader modules failed to use _is. + */ + bool read(std::istream& _filename, + const std::string& _ext, + BaseImporter& _bi, + Options& _opt); + + + /** Write a mesh to file _filename. The source data structure is specified + by the given BaseExporter. The \c save method consecutively queries all + of its writer modules. True is returned upon success, false if all + writer modules failed to write the requested format. + Options is determined by _filename's extension. + */ + bool write(const std::string& _filename, + BaseExporter& _be, + Options _opt=Options::Default, + std::streamsize _precision = 6); + +/** Write a mesh to open std::ostream _os. The source data structure is specified + by the given BaseExporter. The \c save method consecutively queries all + of its writer modules. True is returned upon success, false if all + writer modules failed to write the requested format. + Options is determined by _filename's extension. + */ + bool write(std::ostream& _filename, + const std::string& _ext, + BaseExporter& _be, + Options _opt=Options::Default, + std::streamsize _precision = 6); + + + /// Returns true if the format is supported by one of the reader modules. + bool can_read( const std::string& _format ) const; + + /// Returns true if the format is supported by one of the writer modules. + bool can_write( const std::string& _format ) const; + + + size_t binary_size(const std::string& _format, + BaseExporter& _be, + Options _opt = Options::Default) + { + const BaseWriter *bw = find_writer(_format); + return bw ? bw->binary_size(_be,_opt) : 0; + } + + + +public: //-- QT convenience function ------------------------------------------ + + + /** Returns all readable file extension + descriptions in one string. + File formats are separated by ;;. + Convenience function for Qt file dialogs. + */ + const std::string& qt_read_filters() const { return read_filters_; } + + + /** Returns all writeable file extension + descriptions in one string. + File formats are separated by ;;. + Convenience function for Qt file dialogs. + */ + const std::string& qt_write_filters() const { return write_filters_; } + + + +private: + + // collect all readable file extensions + void update_read_filters(); + + + // collect all writeable file extensions + void update_write_filters(); + + + +public: //-- SYSTEM PART------------------------------------------------------ + + + /** Registers a new reader module. A call to this function should be + implemented in the constructor of all classes derived from BaseReader. + */ + bool register_module(BaseReader* _bl) + { + reader_modules_.insert(_bl); + update_read_filters(); + return true; + } + + + + /** Registers a new writer module. A call to this function should be + implemented in the constructor of all classed derived from BaseWriter. + */ + bool register_module(BaseWriter* _bw) + { + writer_modules_.insert(_bw); + update_write_filters(); + return true; + } + + +private: + + const BaseWriter *find_writer(const std::string& _format); + + // stores registered reader modules + std::set reader_modules_; + + // stores registered writer modules + std::set writer_modules_; + + // input filters (e.g. for Qt file dialog) + std::string read_filters_; + + // output filters (e.g. for Qt file dialog) + std::string write_filters_; +}; + + +//============================================================================= + + +//_IOManager_* __IOManager_instance; Causes memory leak, as destructor is never called + +OPENMESHDLLEXPORT _IOManager_& IOManager(); + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/MeshIO.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/MeshIO.hh new file mode 100644 index 0000000..49b6f64 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/MeshIO.hh @@ -0,0 +1,296 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +#ifndef OM_MESHIO_HH +#define OM_MESHIO_HH + + +//=== INCLUDES ================================================================ + +// -------------------- system settings +#include + +// -------------------- check include order +#if defined (OPENMESH_TRIMESH_ARRAY_KERNEL_HH) || \ + defined (OPENMESH_POLYMESH_ARRAY_KERNEL_HH) + + // Issue warning if MeshIO was not included before Mesh Type + // Nobody knows why this order was enforced. + // If somebody encounters an error resulting from a wrong order, please report it to the OpenMesh developers. + // If we don't here about any errors, this check will be removed + // @TODO: Remove after reasonable time + #ifdef WIN32 + #pragma message("MeshIO.hh was included after Mesh Type. You may ignore this warning. Please report errors resulting ifrom this order to the developers!") + #else + #warning "MeshIO.hh was included after Mesh Type. You may ignore this warning. Please report errors resulting from this order to the developers!" + #endif + +#endif + +// -------------------- OpenMesh +#include +#include +#include +#include + + +//== NAMESPACES ============================================================== + +namespace OpenMesh { +namespace IO { + + +//=== IMPLEMENTATION ========================================================== + + +/** \name Mesh Reading / Writing + Convenience functions the map to IOManager functions. + \see OpenMesh::IO::_IOManager_ +*/ +//@{ + + +//----------------------------------------------------------------------------- + + +/** \brief Read a mesh from file _filename. + + The file format is determined by the file extension. + + \note If you link statically against OpenMesh, you have to add + the define OM_STATIC_BUILD to your application. This will + ensure that readers and writers get initialized correctly. + + @param _mesh The target mesh that will be filled with the read data + @param _filename fill to load + + @return Successful? + */ +template +bool +read_mesh(Mesh& _mesh, + const std::string& _filename) +{ + Options opt; + return read_mesh(_mesh, _filename, opt, true); +} + + +/** \brief Read a mesh from file _filename. + + The file format is determined by the file extension. + + \note If you link statically against OpenMesh, you have to add + the define OM_STATIC_BUILD to your application. This will + ensure that readers and writers get initialized correctly. + + @param _mesh The target mesh that will be filled with the read data + @param _filename fill to load + @param _opt Reader options (e.g. skip loading of normals ... depends + on the reader capabilities). Note that simply passing an + Options::Flag enum is not sufficient. + @param _clear Clear the target data before filling it (allows to + load multiple files into one Mesh). If you only want to read a mesh + without clearing set _clear to false. Providing a default Options + object is sufficient in this case. + + @return Successful? +*/ +template +bool +read_mesh(Mesh& _mesh, + const std::string& _filename, + Options& _opt, + bool _clear = true) +{ + if (_clear) _mesh.clear(); + ImporterT importer(_mesh); + return IOManager().read(_filename, importer, _opt); +} + + +/** \brief Read a mesh from file open std::istream. + + The file format is determined by parameter _ext. _ext has to include + ".[format]" in order to work properly (e.g. ".OFF") + + \note If you link statically against OpenMesh, you have to add + the define OM_STATIC_BUILD to your application. This will + ensure that readers and writers get initialized correctly. + + @param _mesh The target mesh that will be filled with the read data + @param _is stream to load the data from + @param _ext The file format that is written to the stream + @param _opt Reader options (e.g. skip loading of normals ... depends + on the reader capabilities) + @param _clear Clear the target data before filling it (allows to + load multiple files into one Mesh) + + @return Successful? +*/ +template +bool +read_mesh(Mesh& _mesh, + std::istream& _is, + const std::string& _ext, + Options& _opt, + bool _clear = true) +{ + if (_clear) _mesh.clear(); + ImporterT importer(_mesh); + return IOManager().read(_is,_ext, importer, _opt); +} + + + +//----------------------------------------------------------------------------- + + +/** \brief Write a mesh to the file _filename. + + The file format is determined by _filename's extension. + + \note If you link statically against OpenMesh, you have to add + the define OM_STATIC_BUILD to your application. This will + ensure that readers and writers get initialized correctly. + + @param _mesh The mesh that will be written to file + @param _filename output filename + @param _opt Writer options (e.g. writing of normals ... depends + on the writer capabilities) + @param _precision specifies stream precision for ascii files + + @return Successful? +*/ +template +bool write_mesh(const Mesh& _mesh, + const std::string& _filename, + Options _opt = Options::Default, + std::streamsize _precision = 6) +{ + ExporterT exporter(_mesh); + return IOManager().write(_filename, exporter, _opt, _precision); +} + + +//----------------------------------------------------------------------------- + + +/** Write a mesh to an open std::ostream. + + The file format is determined by parameter _ext. _ext has to include + ".[format]" in order to work properly (e.g. ".OFF") + + \note If you link statically against OpenMesh, you have to add + the define OM_STATIC_BUILD to your application. This will + ensure that readers and writers get initialized correctly. + + @param _mesh The mesh that will be written to file + @param _os output stream to write into + @param _ext extension defining the type of output + @param _opt Writer options (e.g. writing of normals ... depends + on the writer capabilities) + @param _precision specifies stream precision for ascii files + + @return Successful? +*/ +template +bool write_mesh(const Mesh& _mesh, + std::ostream& _os, + const std::string& _ext, + Options _opt = Options::Default, + std::streamsize _precision = 6) +{ + ExporterT exporter(_mesh); + return IOManager().write(_os,_ext, exporter, _opt, _precision); +} + + +//----------------------------------------------------------------------------- + +/** \brief Get binary size of data + + This function calls the corresponding writer which calculates the size + of the data that would be written to a binary file + + The file format is determined by parameter _ext. _ext has to include + ".[format]" in order to work properly (e.g. ".OFF") + + @param _mesh Mesh to write + @param _ext extension of the file (used to determine the writing module) + @param _opt Writer options (e.g. writing of normals ... depends + on the writer capabilities) + + @return Binary size in bytes used when writing the data +*/ +template +size_t binary_size(const Mesh& _mesh, + const std::string& _ext, + Options _opt = Options::Default) +{ + ExporterT exporter(_mesh); + return IOManager().binary_size(_ext, exporter, _opt); +} + + +//----------------------------------------------------------------------------- + +//@} + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#if defined(OM_STATIC_BUILD) || defined(ARCH_DARWIN) +# include +#endif +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/OFFFormat.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/OFFFormat.hh new file mode 100644 index 0000000..bd87f56 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/OFFFormat.hh @@ -0,0 +1,99 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +#ifndef OPENMESH_IO_OFFFORMAT_HH +#define OPENMESH_IO_OFFFORMAT_HH + + +//=== INCLUDES ================================================================ + + +// OpenMesh +#include + + +//== NAMESPACES ============================================================== + + +namespace OpenMesh { +namespace IO { + + +//=== IMPLEMENTATION ========================================================== + + +/** \name Mesh Reading / Writing + Option for writer modules. +*/ +//@{ + + +//----------------------------------------------------------------------------- + +#ifndef DOXY_IGNORE_THIS + +struct OPENMESHDLLEXPORT OFFFormat +{ + typedef int integer_type; + typedef float float_type; +}; + +#endif + + + +//@} + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/OMFormat.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/OMFormat.hh new file mode 100644 index 0000000..9bbcd86 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/OMFormat.hh @@ -0,0 +1,751 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +#ifndef OPENMESH_IO_OMFORMAT_HH +#define OPENMESH_IO_OMFORMAT_HH + + +//=== INCLUDES ================================================================ + +#include +#include +#include +#include +#include +#include +// -------------------- +#include +#if defined(OM_CC_GCC) && (OM_GCC_VERSION < 30000) +# include +# define OM_MISSING_HEADER_LIMITS 1 +#else +# include +#endif + + +//== NAMESPACES ============================================================== + +#ifndef DOXY_IGNORE_THIS +namespace OpenMesh { +namespace IO { +namespace OMFormat { + + +//=== IMPLEMENTATION ========================================================== + + +/** \name Mesh Reading / Writing +*/ +//@{ + +//----------------------------------------------------------------------------- + + // <:Header> + // <:Comment> + // Chunk 0 + // <:ChunkHeader> + // <:Comment> + // data + // Chunk 1 + // <:ChunkHeader> + // <:Comment> + // data + // . + // . + // . + // Chunk N + + // + // NOTICE! + // + // The usage of data types who differ in size + // on different pc architectures (32/64 bit) and/or + // operating systems, e.g. (unsigned) long, size_t, + // is not recommended because of inconsistencies + // in case of cross writing and reading. + // + // Basic types that are supported are: + + + typedef unsigned char uchar; + typedef uint8_t uint8; + typedef uint16_t uint16; + typedef uint32_t uint32; + typedef uint64_t uint64; + typedef int8_t int8; + typedef int16_t int16; + typedef int32_t int32; + typedef int64_t int64; + typedef float32_t float32; + typedef float64_t float64; + + struct Header + { + uchar magic_[2]; // OM + uchar mesh_; // [T]riangles, [Q]uads, [P]olygonals + uint8 version_; + uint32 n_vertices_; + uint32 n_faces_; + uint32 n_edges_; + + size_t store( std::ostream& _os, bool _swap ) const + { + _os.write( (char*)this, 4); // magic_, mesh_, version_ + size_t bytes = 4; + bytes += binary::store( _os, n_vertices_, _swap ); + bytes += binary::store( _os, n_faces_, _swap ); + bytes += binary::store( _os, n_edges_, _swap ); + return bytes; + } + + size_t restore( std::istream& _is, bool _swap ) + { + if (_is.read( (char*)this, 4 ).eof()) + return 0; + + size_t bytes = 4; + bytes += binary::restore( _is, n_vertices_, _swap ); + bytes += binary::restore( _is, n_faces_, _swap ); + bytes += binary::restore( _is, n_edges_, _swap ); + return bytes; + } + + }; + + struct Chunk + { + // Hardcoded this size to an uint32 to make the system 32/64 bit compatible. + // Needs further investigation! + typedef uint32 esize_t; // element size, used for custom properties + + enum Type { + Type_Pos = 0x00, + Type_Normal = 0x01, + Type_Texcoord = 0x02, + Type_Status = 0x03, + Type_Color = 0x04, + Type_Custom = 0x06, + Type_Topology = 0x07 + }; + + enum Entity { + Entity_Vertex = 0x00, + Entity_Mesh = 0x01, + Entity_Face = 0x02, + Entity_Edge = 0x04, + Entity_Halfedge = 0x06, + Entity_Sentinel = 0x07 + }; + + enum Dim { + Dim_1D = 0x00, + Dim_2D = 0x01, + Dim_3D = 0x02, + Dim_4D = 0x03, + Dim_5D = 0x04, + Dim_6D = 0x05, + Dim_7D = 0x06, + Dim_8D = 0x07 + }; + + enum Integer_Size { + Integer_8 = 0x00, // 1 byte for (unsigned) char + Integer_16 = 0x01, // 2 bytes for short + Integer_32 = 0x02, // 4 bytes for long + Integer_64 = 0x03 // 8 bytes for long long + }; + + enum Float_Size { + Float_32 = 0x00, // 4 bytes for float + Float_64 = 0x01, // 8 bytes for double + Float_128 = 0x02 // 16 bytes for long double (an assumption!) + }; + + static const int SIZE_RESERVED = 1; // 1 + static const int SIZE_NAME = 1; // 2 + static const int SIZE_ENTITY = 3; // 5 + static const int SIZE_TYPE = 4; // 9 + + static const int SIZE_SIGNED = 1; // 10 + static const int SIZE_FLOAT = 1; // 11 + static const int SIZE_DIM = 3; // 14 + static const int SIZE_BITS = 2; // 16 + + static const int OFF_RESERVED = 0; // 0 + static const int OFF_NAME = SIZE_RESERVED + OFF_RESERVED; // 2 + static const int OFF_ENTITY = SIZE_NAME + OFF_NAME; // 3 + static const int OFF_TYPE = SIZE_ENTITY + OFF_ENTITY; // 5 + static const int OFF_SIGNED = SIZE_TYPE + OFF_TYPE; // 9 + static const int OFF_FLOAT = SIZE_SIGNED + OFF_SIGNED; // 10 + static const int OFF_DIM = SIZE_FLOAT + OFF_FLOAT; // 11 + static const int OFF_BITS = SIZE_DIM + OFF_DIM; // 14 + + // !Attention! When changing the bit size, the operators + // << (uint16, Header) and << (Header, uint16) must be changed as well + // + // Entries signed_, float_, dim_, bits_ are not used when type_ + // equals Type_Custom + // + struct Header // 16 bits long + { + unsigned reserved_: SIZE_RESERVED; + unsigned name_ : SIZE_NAME; // 1 named property, 0 anonymous + unsigned entity_ : SIZE_ENTITY; // 0 vertex, 1 mesh, 2 edge, + // 4 halfedge, 6 face + unsigned type_ : SIZE_TYPE; // 0 pos, 1 normal, 2 texcoord, + // 3 status, 4 color 6 custom 7 topology + unsigned signed_ : SIZE_SIGNED; // bool + unsigned float_ : SIZE_FLOAT; // bool + unsigned dim_ : SIZE_DIM; // 0 1D, 1 2D, 2 3D, .., 7 8D + unsigned bits_ : SIZE_BITS; // {8, 16, 32, 64} | {32, 64, 128} + // (integer) (float) + unsigned unused_ : 16; // fill up to 32 bits + }; // struct Header + + + class PropertyName : public std::string + { + public: + + static const size_t size_max = 256; + + PropertyName( ) { } + + PropertyName( const std::string& _name ) { *this = _name; } + + bool is_valid() const { return is_valid( size() ); } + + static bool is_valid( size_t _s ) { return _s <= size_max; } + + PropertyName& operator = ( const std::string& _rhs ) + { + assert( is_valid( _rhs.size() ) ); + + if ( is_valid( _rhs.size() ) ) + std::string::operator = ( _rhs ); + else + { + omerr() << "Warning! Property name too long. Will be shortened!\n"; + this->std::string::operator = ( _rhs.substr(0, size_max) ); + } + + return *this; + } + + }; + + }; // Chunk + + // ------------------------------------------------------------ Helper + + // -------------------- get size information + + /// Return size of header in bytes. + inline size_t header_size(void) { return sizeof(Header); } + + + /// Return size of chunk header in bytes. + inline size_t chunk_header_size( void ) { return sizeof(uint16); } + + + /// Return the size of a scale in bytes. + inline size_t scalar_size( const Chunk::Header& _hdr ) + { + return _hdr.float_ ? (0x01 << _hdr.bits_) : (0x04 << _hdr.bits_); + } + + + /// Return the dimension of the vector in a chunk + inline size_t dimensions(const Chunk::Header& _chdr) { return _chdr.dim_+1; } + + + /// Return the size of a vector in bytes. + inline size_t vector_size( const Chunk::Header& _chdr ) + { + return dimensions(_chdr)*scalar_size(_chdr); + } + + + /// Return the size of chunk data in bytes + inline size_t chunk_data_size( Header& _hdr, Chunk::Header& _chunk_hdr ) + { + size_t C; + switch( _chunk_hdr.entity_ ) + { + case Chunk::Entity_Vertex: C = _hdr.n_vertices_; break; + case Chunk::Entity_Face: C = _hdr.n_faces_; break; + case Chunk::Entity_Halfedge: C = _hdr.n_edges_*2; break; + case Chunk::Entity_Edge: C = _hdr.n_edges_; break; + case Chunk::Entity_Mesh: C = 1; break; + default: + C = 0; + std::cerr << "Invalid value in _chunk_hdr.entity_\n"; + assert( false ); + break; + } + + return C * vector_size( _chunk_hdr ); + } + + inline size_t chunk_size( Header& _hdr, Chunk::Header& _chunk_hdr ) + { + return chunk_header_size() + chunk_data_size( _hdr, _chunk_hdr ); + } + + // -------------------- convert from Chunk::Header to storage type + + uint16& operator << (uint16& val, const Chunk::Header& hdr); + Chunk::Header& operator << (Chunk::Header& hdr, const uint16 val); + + + // -------------------- type information + + template bool is_float(const T&) + { +#if defined(OM_MISSING_HEADER_LIMITS) + return !Utils::NumLimitsT::is_integer(); +#else + return !std::numeric_limits::is_integer; +#endif + } + + template bool is_integer(const T) + { +#if defined(OM_MISSING_HEADER_LIMITS) + return Utils::NumLimitsT::is_integer(); +#else + return std::numeric_limits::is_integer; +#endif + } + + template bool is_signed(const T&) + { +#if defined(OM_MISSING_HEADER_LIMITS) + return Utils::NumLimitsT::is_signed(); +#else + return std::numeric_limits::is_signed; +#endif + } + + // -------------------- conversions (format type <- type/value) + + template + inline + Chunk::Dim dim( VecType ) + { + assert( vector_traits< VecType >::size() < 9 ); + return static_cast(vector_traits< VecType >::size() - 1); + } + + template + inline + Chunk::Dim dim( const Chunk::Header& _hdr ) + { + return static_cast( _hdr.dim_ ); + } + + // calc minimum (power-of-2) number of bits needed + Chunk::Integer_Size needed_bits( size_t s ); + + // Convert size of type to Integer_Size +#ifdef NDEBUG + template Chunk::Integer_Size integer_size(const T&) +#else + template Chunk::Integer_Size integer_size(const T& d) +#endif + { +#ifndef NDEBUG + assert( is_integer(d) ); +#endif + + switch( sizeof(T) ) + { + case 1: return OMFormat::Chunk::Integer_8; + case 2: return OMFormat::Chunk::Integer_16; + case 4: return OMFormat::Chunk::Integer_32; + case 8: return OMFormat::Chunk::Integer_64; + default: + std::cerr << "Invalid value in integer_size\n"; + assert( false ); + break; + } + return Chunk::Integer_Size(0); + } + + + // Convert size of type to FLoat_Size +#ifdef NDEBUG + template Chunk::Float_Size float_size(const T&) +#else + template Chunk::Float_Size float_size(const T& d) +#endif + { +#ifndef NDEBUG + assert( is_float(d) ); +#endif + + switch( sizeof(T) ) + { + case 4: return OMFormat::Chunk::Float_32; + case 8: return OMFormat::Chunk::Float_64; + case 16: return OMFormat::Chunk::Float_128; + default: + std::cerr << "Invalid value in float_size\n"; + assert( false ); + break; + } + return Chunk::Float_Size(0); + } + + // Return the storage type (Chunk::Header::bits_) + template + inline + unsigned int bits(const T& val) + { + return is_integer(val) + ? (static_cast(integer_size(val))) + : (static_cast(float_size(val))); + } + + // -------------------- create/read version + + inline uint8 mk_version(const uint16 major, const uint16 minor) + { return (major & 0x07) << 5 | (minor & 0x1f); } + + + inline uint16 major_version(const uint8 version) + { return (version >> 5) & 0x07; } + + + inline uint16 minor_version(const uint8 version) + { return (version & 0x001f); } + + + // ---------------------------------------- convenience functions + + const char *as_string(Chunk::Type t); + const char *as_string(Chunk::Entity e); + const char *as_string(Chunk::Dim d); + const char *as_string(Chunk::Integer_Size d); + const char *as_string(Chunk::Float_Size d); + + std::ostream& operator << ( std::ostream& _os, const Header& _h ); + std::ostream& operator << ( std::ostream& _os, const Chunk::Header& _c ); + +//@} +} // namespace OMFormat + + // -------------------- (re-)store header + + template <> inline + size_t store( std::ostream& _os, const OMFormat::Header& _hdr, bool _swap) + { return _hdr.store( _os, _swap ); } + + template <> inline + size_t restore( std::istream& _is, OMFormat::Header& _hdr, bool _swap ) + { return _hdr.restore( _is, _swap ); } + + + // -------------------- (re-)store chunk header + + template <> inline + size_t + store( std::ostream& _os, const OMFormat::Chunk::Header& _hdr, bool _swap) + { + OMFormat::uint16 val; val << _hdr; + return binary::store( _os, val, _swap ); + } + + template <> inline + size_t + restore( std::istream& _is, OMFormat::Chunk::Header& _hdr, bool _swap ) + { + OMFormat::uint16 val; + size_t bytes = binary::restore( _is, val, _swap ); + + _hdr << val; + + return bytes; + } + + // -------------------- (re-)store integer with wanted number of bits (bytes) + + typedef GenProg::TrueType t_signed; + typedef GenProg::FalseType t_unsigned; + + // helper to store a an integer + template< typename T > + size_t + store( std::ostream& _os, + const T& _val, + OMFormat::Chunk::Integer_Size _b, + bool _swap, + t_signed); + + // helper to store a an unsigned integer + template< typename T > + size_t + store( std::ostream& _os, + const T& _val, + OMFormat::Chunk::Integer_Size _b, + bool _swap, + t_unsigned); + + /// Store an integer with a wanted number of bits + template< typename T > + inline + size_t + store( std::ostream& _os, + const T& _val, + OMFormat::Chunk::Integer_Size _b, + bool _swap) + { + assert( OMFormat::is_integer( _val ) ); + + if ( OMFormat::is_signed( _val ) ) + return store( _os, _val, _b, _swap, t_signed() ); + return store( _os, _val, _b, _swap, t_unsigned() ); + } + + // helper to store a an integer + template< typename T > inline + size_t restore( std::istream& _is, + T& _val, + OMFormat::Chunk::Integer_Size _b, + bool _swap, + t_signed); + + // helper to store a an unsigned integer + template< typename T > inline + size_t restore( std::istream& _is, + T& _val, + OMFormat::Chunk::Integer_Size _b, + bool _swap, + t_unsigned); + + /// Restore an integer with a wanted number of bits + template< typename T > + inline + size_t + restore( std::istream& _is, + T& _val, + OMFormat::Chunk::Integer_Size _b, + bool _swap) + { + assert( OMFormat::is_integer( _val ) ); + + if ( OMFormat::is_signed( _val ) ) + return restore( _is, _val, _b, _swap, t_signed() ); + return restore( _is, _val, _b, _swap, t_unsigned() ); + } + + + // + // ---------------------------------------- storing vectors + template inline + size_t store( std::ostream& _os, const VecT& _vec, GenProg::Int2Type<2>, + bool _swap ) + { + size_t bytes = store( _os, _vec[0], _swap ); + bytes += store( _os, _vec[1], _swap ); + return bytes; + } + + template inline + size_t store( std::ostream& _os, const VecT& _vec, GenProg::Int2Type<3>, + bool _swap ) + { + size_t bytes = store( _os, _vec[0], _swap ); + bytes += store( _os, _vec[1], _swap ); + bytes += store( _os, _vec[2], _swap ); + return bytes; + } + + template inline + size_t store( std::ostream& _os, const VecT& _vec, GenProg::Int2Type<4>, + bool _swap ) + { + size_t bytes = store( _os, _vec[0], _swap ); + bytes += store( _os, _vec[1], _swap ); + bytes += store( _os, _vec[2], _swap ); + bytes += store( _os, _vec[3], _swap ); + return bytes; + } + + template inline + size_t store( std::ostream& _os, const VecT& _vec, GenProg::Int2Type<1>, + bool _swap ) + { + return store( _os, _vec[0], _swap ); + } + + /// storing a vector type + template inline + size_t vector_store( std::ostream& _os, const VecT& _vec, bool _swap ) + { + return store( _os, _vec, + GenProg::Int2Type< vector_traits::size_ >(), + _swap ); + } + + // ---------------------------------------- restoring vectors + template + inline + size_t + restore( std::istream& _is, VecT& _vec, GenProg::Int2Type<2>, + bool _swap ) + { + size_t bytes = restore( _is, _vec[0], _swap ); + bytes += restore( _is, _vec[1], _swap ); + return bytes; + } + + template + inline + size_t + restore( std::istream& _is, VecT& _vec, GenProg::Int2Type<3>, + bool _swap ) + { + typedef typename vector_traits::value_type scalar_type; + size_t bytes; + + bytes = binary::restore( _is, _vec[0], _swap ); + bytes += binary::restore( _is, _vec[1], _swap ); + bytes += binary::restore( _is, _vec[2], _swap ); + return bytes; + } + + template + inline + size_t + restore( std::istream& _is, VecT& _vec, GenProg::Int2Type<4>, + bool _swap ) + { + typedef typename vector_traits::value_type scalar_type; + size_t bytes; + + bytes = binary::restore( _is, _vec[0], _swap ); + bytes += binary::restore( _is, _vec[1], _swap ); + bytes += binary::restore( _is, _vec[2], _swap ); + bytes += binary::restore( _is, _vec[3], _swap ); + return bytes; + } + + template + inline + size_t + restore( std::istream& _is, VecT& _vec, GenProg::Int2Type<1>, + bool _swap ) + { + return restore( _is, _vec[0], _swap ); + } + + /// Restoring a vector type + template + inline + size_t + vector_restore( std::istream& _is, VecT& _vec, bool _swap ) + { + return restore( _is, _vec, + GenProg::Int2Type< vector_traits::size_ >(), + _swap ); + } + + + // ---------------------------------------- storing property names + + template <> + inline + size_t store( std::ostream& _os, const OMFormat::Chunk::PropertyName& _pn, + bool _swap ) + { + store( _os, _pn.size(), OMFormat::Chunk::Integer_8, _swap ); // 1 byte + if ( _pn.size() ) + _os.write( _pn.c_str(), _pn.size() ); // size bytes + return _pn.size() + 1; + } + + template <> + inline + size_t restore( std::istream& _is, OMFormat::Chunk::PropertyName& _pn, + bool _swap ) + { + size_t size; + + restore( _is, size, OMFormat::Chunk::Integer_8, _swap); // 1 byte + + assert( OMFormat::Chunk::PropertyName::is_valid( size ) ); + + if ( size > 0 ) + { + char buf[256]; + _is.read( buf, size ); // size bytes + buf[size] = '\0'; + _pn.resize(size); + _pn = buf; + } + return size+1; + } + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +#endif +//============================================================================= +#if defined(OM_MISSING_HEADER_LIMITS) +# undef OM_MISSING_HEADER_LIMITS +#endif +//============================================================================= +#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_IO_OMFORMAT_CC) +# define OPENMESH_IO_OMFORMAT_TEMPLATES +# include "OMFormatT.cc" +#endif +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/Options.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/Options.hh new file mode 100644 index 0000000..f266725 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/Options.hh @@ -0,0 +1,250 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +#ifndef OPENMESH_IO_OPTIONS_HH +#define OPENMESH_IO_OPTIONS_HH + + +//=== INCLUDES ================================================================ + + +// OpenMesh +#include + + +//== NAMESPACES ============================================================== + + +namespace OpenMesh { +namespace IO { + + +//=== IMPLEMENTATION ========================================================== + + +/** \name Mesh Reading / Writing + Option for reader and writer modules. +*/ +//@{ + + +//----------------------------------------------------------------------------- + +/** \brief Set options for reader/writer modules. + * + * The class is used in a twofold way. + * -# In combination with reader modules the class is used + * - to pass hints to the reading module, whether the input is + * binary and what byte ordering the binary data has + * - to retrieve information about the file contents after + * succesful reading. + * -# In combination with write modules the class gives directions to + * the writer module, whether to + * - use binary mode or not and what byte order to use + * - store one of the standard properties. + * + * The option are defined in \c Options::Flag as bit values and stored in + * an \c int value as a bitset. + */ +class Options +{ +public: + typedef int enum_type; + typedef enum_type value_type; + + /// Definitions of %Options for reading and writing. The options can be + /// or'ed. + enum Flag { + Default = 0x0000, ///< No options + Binary = 0x0001, ///< Set binary mode for r/w + MSB = 0x0002, ///< Assume big endian byte ordering + LSB = 0x0004, ///< Assume little endian byte ordering + Swap = 0x0008, ///< Swap byte order in binary mode + VertexNormal = 0x0010, ///< Has (r) / store (w) vertex normals + VertexColor = 0x0020, ///< Has (r) / store (w) vertex colors + VertexTexCoord = 0x0040, ///< Has (r) / store (w) texture coordinates + EdgeColor = 0x0080, ///< Has (r) / store (w) edge colors + FaceNormal = 0x0100, ///< Has (r) / store (w) face normals + FaceColor = 0x0200, ///< Has (r) / store (w) face colors + FaceTexCoord = 0x0400, ///< Has (r) / store (w) face texture coordinates + ColorAlpha = 0x0800, ///< Has (r) / store (w) alpha values for colors + ColorFloat = 0x1000, ///< Has (r) / store (w) float values for colors (currently only implemented for PLY and OFF files) + Custom = 0x2000 ///< Has (r) custom properties (currently only implemented in PLY Reader ASCII version) + }; + +public: + + /// Default constructor + Options() : flags_( Default ) + { } + + + /// Copy constructor + Options(const Options& _opt) : flags_(_opt.flags_) + { } + + + /// Initializing constructor setting a single option + Options(Flag _flg) : flags_( _flg) + { } + + + /// Initializing constructor setting multiple options + Options(const value_type _flgs) : flags_( _flgs) + { } + + + ~Options() + { } + + /// Restore state after default constructor. + void cleanup(void) + { flags_ = Default; } + + /// Clear all bits. + void clear(void) + { flags_ = 0; } + + /// Returns true if all bits are zero. + bool is_empty(void) const { return !flags_; } + +public: + + + //@{ + /// Copy options defined in _rhs. + + Options& operator = ( const Options& _rhs ) + { flags_ = _rhs.flags_; return *this; } + + Options& operator = ( const value_type _rhs ) + { flags_ = _rhs; return *this; } + + //@} + + + //@{ + /// Unset options defined in _rhs. + + Options& operator -= ( const value_type _rhs ) + { flags_ &= ~_rhs; return *this; } + + Options& unset( const value_type _rhs) + { return (*this -= _rhs); } + + //@} + + + + //@{ + /// Set options defined in _rhs + + Options& operator += ( const value_type _rhs ) + { flags_ |= _rhs; return *this; } + + Options& set( const value_type _rhs) + { return (*this += _rhs); } + + //@} + +public: + + + // Check if an option or several options are set. + bool check(const value_type _rhs) const + { + return (flags_ & _rhs)==_rhs; + } + + bool is_binary() const { return check(Binary); } + bool vertex_has_normal() const { return check(VertexNormal); } + bool vertex_has_color() const { return check(VertexColor); } + bool vertex_has_texcoord() const { return check(VertexTexCoord); } + bool edge_has_color() const { return check(EdgeColor); } + bool face_has_normal() const { return check(FaceNormal); } + bool face_has_color() const { return check(FaceColor); } + bool face_has_texcoord() const { return check(FaceTexCoord); } + bool color_has_alpha() const { return check(ColorAlpha); } + bool color_is_float() const { return check(ColorFloat); } + + + /// Returns true if _rhs has the same options enabled. + bool operator == (const value_type _rhs) const + { return flags_ == _rhs; } + + + /// Returns true if _rhs does not have the same options enabled. + bool operator != (const value_type _rhs) const + { return flags_ != _rhs; } + + + /// Returns the option set. + operator value_type () const { return flags_; } + +private: + + bool operator && (const value_type _rhs) const; + + value_type flags_; +}; + +//----------------------------------------------------------------------------- + + + + +//@} + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary.hh new file mode 100644 index 0000000..05c9de8 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary.hh @@ -0,0 +1,136 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Helper Functions for binary reading / writing +// +//============================================================================= + +#ifndef OPENMESH_SR_BINARY_HH +#define OPENMESH_SR_BINARY_HH + + +//== INCLUDES ================================================================= + +#include +// -------------------- STL +#include +#include +#include +#include // accumulate +// -------------------- OpenMesh + + +//== NAMESPACES =============================================================== + +namespace OpenMesh { +namespace IO { + + +//============================================================================= + + +//----------------------------------------------------------------------------- + + const static size_t UnknownSize(size_t(-1)); + + +//----------------------------------------------------------------------------- +// struct binary, helper for storing/restoring + +#define X \ + std::ostringstream msg; \ + msg << "Type not supported: " << typeid(value_type).name(); \ + throw std::logic_error(msg.str()) + +/// \struct binary SR_binary.hh +/// +/// The struct defines how to store and restore the type T. +/// It's used by the OM reader/writer modules. +/// +/// The following specialization are provided: +/// - Fundamental types except \c long \c double +/// - %OpenMesh vector types +/// - %OpenMesh::StatusInfo +/// - std::string (max. length 65535) +/// +/// \todo Complete documentation of members +template < typename T > struct binary +{ + typedef T value_type; + + static const bool is_streamable = false; + + static size_t size_of(void) { return UnknownSize; } + static size_t size_of(const value_type&) { return UnknownSize; } + + static + size_t store( std::ostream& /* _os */, + const value_type& /* _v */, + bool /* _swap=false */) + { X; return 0; } + + static + size_t restore( std::istream& /* _is */, + value_type& /* _v */, + bool /* _swap=false */) + { X; return 0; } +}; + +#undef X + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_SR_RBO_HH defined +//============================================================================= + diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary_spec.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary_spec.hh new file mode 100644 index 0000000..956b6e8 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary_spec.hh @@ -0,0 +1,329 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Helper Functions for binary reading / writing +// +//============================================================================= + +#ifndef OPENMESH_SR_BINARY_SPEC_HH +#define OPENMESH_SR_BINARY_SPEC_HH + +//== INCLUDES ================================================================= + +#include +// -------------------- STL +#include +#include +#if defined(OM_CC_GCC) && (OM_CC_VERSION < 30000) +# include +#else +# include +#endif +#include +#include // logic_error +#include // accumulate +// -------------------- OpenMesh +#include +#include +#include +#include +#include + +//== NAMESPACES =============================================================== + +namespace OpenMesh { +namespace IO { + + +//============================================================================= + +#ifndef DOXY_IGNORE_THIS + +//----------------------------------------------------------------------------- +// struct binary, helper for storing/restoring + +#define SIMPLE_BINARY( T ) \ + template <> struct binary< T > { \ + typedef T value_type; \ + static const bool is_streamable = true; \ + static size_t size_of(const value_type&) { return sizeof(value_type); } \ + static size_t size_of(void) { return sizeof(value_type); } \ + static size_t store( std::ostream& _os, const value_type& _val, \ + bool _swap=false) { \ + value_type tmp = _val; \ + if (_swap) reverse_byte_order(tmp); \ + _os.write( (const char*)&tmp, sizeof(value_type) ); \ + return _os.good() ? sizeof(value_type) : 0; \ + } \ + \ + static size_t restore( std::istream& _is, value_type& _val, \ + bool _swap=false) { \ + _is.read( (char*)&_val, sizeof(value_type) ); \ + if (_swap) reverse_byte_order(_val); \ + return _is.good() ? sizeof(value_type) : 0; \ + } \ + } + +SIMPLE_BINARY(bool); +//SIMPLE_BINARY(int); + +// Why is this needed? Should not be used as not 32 bit compatible +//SIMPLE_BINARY(unsigned long); +SIMPLE_BINARY(float); +SIMPLE_BINARY(double); +SIMPLE_BINARY(long double); +SIMPLE_BINARY(char); + +SIMPLE_BINARY(int8_t); +SIMPLE_BINARY(int16_t); +SIMPLE_BINARY(int32_t); +SIMPLE_BINARY(int64_t); +SIMPLE_BINARY(uint8_t); +SIMPLE_BINARY(uint16_t); +SIMPLE_BINARY(uint32_t); +SIMPLE_BINARY(uint64_t); + +#undef SIMPLE_BINARY + +// For unsigned long which is of size 64 bit on 64 bit +// architectures: convert into 32 bit unsigned integer value +// in order to stay compatible between 32/64 bit architectures. +// This allows cross reading BUT forbids storing unsigned longs +// as data type since higher order word (4 bytes) will be truncated. +// Does not work in case the data type that is to be stored +// exceeds the value range of unsigned int in size, which is improbable... + +#define SIMPLE_BINARY( T ) \ + template <> struct binary< T > { \ + typedef T value_type; \ + static const bool is_streamable = true; \ + static size_t size_of(const value_type&) { return sizeof(value_type); } \ + static size_t size_of(void) { return sizeof(value_type); } \ + static size_t store( std::ostream& _os, const value_type& _val, \ + bool _swap=false) { \ + value_type tmp = _val; \ + if (_swap) reverse_byte_order(tmp); \ + /* Convert unsigned long to unsigned int for compatibility reasons */ \ + unsigned int t1 = static_cast(tmp); \ + _os.write( (const char*)&t1, sizeof(unsigned int) ); \ + return _os.good() ? sizeof(unsigned int) : 0; \ + } \ + \ + static size_t restore( std::istream& _is, value_type& _val, \ + bool _swap=false) { \ + unsigned int t1; \ + _is.read( (char*)&t1, sizeof(unsigned int) ); \ + _val = t1; \ + if (_swap) reverse_byte_order(_val); \ + return _is.good() ? sizeof(unsigned int) : 0; \ + } \ + } + +SIMPLE_BINARY(unsigned long); + +#undef SIMPLE_BINARY + +#define VECTORT_BINARY( T ) \ + template <> struct binary< T > { \ + typedef T value_type; \ + static const bool is_streamable = true; \ + static size_t size_of(void) { return sizeof(value_type); } \ + static size_t size_of(const value_type&) { return size_of(); } \ + static size_t store( std::ostream& _os, const value_type& _val, \ + bool _swap=false) { \ + value_type tmp = _val; \ + size_t i, b = size_of(_val), N = value_type::size_; \ + if (_swap) for (i=0; i struct binary< std::string > { + typedef std::string value_type; + typedef uint16_t length_t; + + static const bool is_streamable = true; + + static size_t size_of() { return UnknownSize; } + static size_t size_of(const value_type &_v) + { return sizeof(length_t) + _v.size(); } + + static + size_t store(std::ostream& _os, const value_type& _v, bool _swap=false) + { +#if defined(OM_CC_GCC) && (OM_CC_VERSION < 30000) + if (_v.size() < Utils::NumLimitsT::max() ) +#else + if (_v.size() < std::numeric_limits::max() ) +#endif + { + length_t len = length_t(_v.size()); + + size_t bytes = binary::store( _os, len, _swap ); + _os.write( _v.data(), len ); + return _os.good() ? len+bytes : 0; + } + throw std::runtime_error("Cannot store string longer than 64Kb"); + } + + static + size_t restore(std::istream& _is, value_type& _val, bool _swap=false) + { + length_t len; + size_t bytes = binary::restore( _is, len, _swap ); + _val.resize(len); + _is.read( const_cast(_val.data()), len ); + + return _is.good() ? (len+bytes) : 0; + } +}; + + +template <> struct binary +{ + typedef OpenMesh::Attributes::StatusInfo value_type; + typedef value_type::value_type status_t; + + static const bool is_streamable = true; + + static size_t size_of() { return sizeof(status_t); } + static size_t size_of(const value_type&) { return size_of(); } + + static size_t n_bytes(size_t _n_elem) + { return _n_elem*sizeof(status_t); } + + static + size_t store(std::ostream& _os, const value_type& _v, bool _swap=false) + { + status_t v=_v.bits(); + return binary::store(_os, v, _swap); + } + + static + size_t restore( std::istream& _os, value_type& _v, bool _swap=false) + { + status_t v; + size_t b = binary::restore(_os, v, _swap); + _v.set_bits(v); + return b; + } +}; + + +//----------------------------------------------------------------------------- +// std::vector specializations for struct binary<> + +template +struct FunctorStore { + FunctorStore( std::ostream& _os, bool _swap) : os_(_os), swap_(_swap) { } + size_t operator () ( size_t _v1, const T& _s2 ) + { return _v1+binary::store(os_, _s2, swap_ ); } + + std::ostream& os_; + bool swap_; +}; + + +template +struct FunctorRestore { + FunctorRestore( std::istream& _is, bool _swap) : is_(_is), swap_(_swap) { } + size_t operator () ( size_t _v1, T& _s2 ) + { return _v1+binary::restore(is_, _s2, swap_ ); } + std::istream& is_; + bool swap_; +}; + +#include +#include +#include + +// ---------------------------------------------------------------------------- + +#endif // DOXY_IGNORE_THIS + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_SR_BINARY_SPEC_HH defined +//============================================================================= + diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary_vector_of_bool.inl b/libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary_vector_of_bool.inl new file mode 100644 index 0000000..3ec619c --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary_vector_of_bool.inl @@ -0,0 +1,98 @@ + +template <> struct binary< std::vector > +{ + + typedef std::vector< bool > value_type; + typedef value_type::value_type elem_type; + + static const bool is_streamable = true; + + static size_t size_of(void) { return UnknownSize; } + static size_t size_of(const value_type& _v) + { + return _v.size() / 8 + ((_v.size() % 8)!=0); + } + + static + size_t store( std::ostream& _ostr, const value_type& _v, bool ) + { + size_t bytes = 0; + + size_t N = _v.size() / 8; + size_t R = _v.size() % 8; + + size_t idx; // element index + unsigned char bits; // bitset + + for (idx=0; idx < N; ++idx) + { + bits = static_cast(_v[idx]) + | (static_cast(_v[idx+1]) << 1) + | (static_cast(_v[idx+2]) << 2) + | (static_cast(_v[idx+3]) << 3) + | (static_cast(_v[idx+4]) << 4) + | (static_cast(_v[idx+5]) << 5) + | (static_cast(_v[idx+6]) << 6) + | (static_cast(_v[idx+7]) << 7); + _ostr << bits; + } + bytes = N; + + if (R) + { + bits = 0; + switch(R) + { + case 7: bits |= (static_cast(_v[idx+6]) << 6); + case 6: bits |= (static_cast(_v[idx+5]) << 5); + case 5: bits |= (static_cast(_v[idx+4]) << 4); + case 4: bits |= (static_cast(_v[idx+3]) << 3); + case 3: bits |= (static_cast(_v[idx+2]) << 2); + case 2: bits |= (static_cast(_v[idx+1]) << 1); + case 1: bits |= static_cast(_v[idx+0]); + } + _ostr << bits; + ++bytes; + } + + assert( bytes == size_of(_v) ); + + return bytes; + } + + static + size_t restore( std::istream& _istr, value_type& _v, bool ) + { + size_t bytes = 0; + + size_t N = _v.size() / 8; + size_t R = _v.size() % 8; + + size_t idx; // element index + unsigned char bits; // bitset + + for (idx=0; idx < N; ++idx) + { + _istr >> bits; + _v[idx+0] = ((bits & 0x01)!=0); + _v[idx+1] = ((bits & 0x02)!=0); + _v[idx+2] = ((bits & 0x04)!=0); + _v[idx+3] = ((bits & 0x08)!=0); + _v[idx+4] = ((bits & 0x10)!=0); + _v[idx+5] = ((bits & 0x20)!=0); + _v[idx+6] = ((bits & 0x40)!=0); + _v[idx+7] = ((bits & 0x80)!=0); + } + bytes = N; + + if (R) + { + _istr >> bits; + for(; idx < _v.size(); ++idx) + _v[idx] = (bits & (1 << (idx%8)))!=0; + ++bytes; + } + + return bytes; + } +}; diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary_vector_of_fundamentals.inl b/libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary_vector_of_fundamentals.inl new file mode 100644 index 0000000..15ebae2 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary_vector_of_fundamentals.inl @@ -0,0 +1,53 @@ + +#define BINARY_VECTOR( T ) \ +template <> struct binary< std::vector< T > > { \ + typedef std::vector< T > value_type; \ + typedef value_type::value_type elem_type; \ + \ + static const bool is_streamable = true; \ + \ + static size_t size_of(void) \ + { return IO::UnknownSize; } \ + \ + static size_t size_of(const value_type& _v) \ + { return sizeof(elem_type)*_v.size(); } \ + \ + static \ + size_t store(std::ostream& _os, const value_type& _v, bool _swap=false) { \ + size_t bytes=0; \ + \ + if (_swap) \ + bytes = std::accumulate( _v.begin(), _v.end(), bytes, \ + FunctorStore(_os,_swap) ); \ + else { \ + bytes = size_of(_v); \ + _os.write( reinterpret_cast(&_v[0]), bytes ); \ + } \ + return _os.good() ? bytes : 0; \ + } \ + \ + static size_t restore(std::istream& _is, value_type& _v, bool _swap=false) { \ + size_t bytes=0; \ + \ + if ( _swap) \ + bytes = std::accumulate( _v.begin(), _v.end(), size_t(0), \ + FunctorRestore(_is, _swap) ); \ + else \ + { \ + bytes = size_of(_v); \ + _is.read( reinterpret_cast(&_v[0]), bytes ); \ + } \ + return _is.good() ? bytes : 0; \ + } \ +} + +BINARY_VECTOR( short ); +BINARY_VECTOR( unsigned short ); +BINARY_VECTOR( int ); +BINARY_VECTOR( unsigned int ); +BINARY_VECTOR( long ); +BINARY_VECTOR( unsigned long ); +BINARY_VECTOR( float ); +BINARY_VECTOR( double ); + +#undef BINARY_VECTOR diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary_vector_of_string.inl b/libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary_vector_of_string.inl new file mode 100644 index 0000000..c6201de --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/SR_binary_vector_of_string.inl @@ -0,0 +1,39 @@ + +template <> struct binary< std::vector< std::string > > +{ + // struct binary interface + + typedef std::vector< std::string > value_type; + typedef value_type::value_type elem_type; + + static const bool is_streamable = true; + + // Helper + + struct Sum + { + size_t operator() ( size_t _v1, const elem_type& _s2 ) + { return _v1 + binary::size_of(_s2); } + }; + + // struct binary interface + + static size_t size_of(void) { return UnknownSize; } + + static size_t size_of(const value_type& _v) + { return std::accumulate( _v.begin(), _v.end(), size_t(0), Sum() ); } + + static + size_t store(std::ostream& _os, const value_type& _v, bool _swap=false) + { + return std::accumulate( _v.begin(), _v.end(), size_t(0), + FunctorStore(_os, _swap) ); + } + + static + size_t restore(std::istream& _is, value_type& _v, bool _swap=false) + { + return std::accumulate( _v.begin(), _v.end(), size_t(0), + FunctorRestore(_is, _swap) ); + } +}; diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/SR_rbo.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/SR_rbo.hh new file mode 100644 index 0000000..64275c4 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/SR_rbo.hh @@ -0,0 +1,256 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Helper Functions for binary reading / writing +// +//============================================================================= + +#ifndef OPENMESH_SR_RBO_HH +#define OPENMESH_SR_RBO_HH + + +//== INCLUDES ================================================================= + +#include +// -------------------- STL +#if defined(OM_CC_MIPS) +# include // size_t +#else +# include // size_t +#endif +#include +#include +// -------------------- OpenMesh +#include +#include +#include + +//== NAMESPACES =============================================================== + +namespace OpenMesh { +namespace IO { + + +//============================================================================= + + +/** \name Handling binary input/output. + These functions take care of swapping bytes to get the right Endian. +*/ +//@{ + + +//----------------------------------------------------------------------------- + +/** this does not compile for g++3.4 and higher, hence we comment the +function body which will result in a linker error */ + +template < size_t N > inline +void _reverse_byte_order_N(uint8_t* _val); + +template <> inline +void _reverse_byte_order_N<1>(uint8_t* /*_val*/) { } + + +template <> inline +void _reverse_byte_order_N<2>(uint8_t* _val) +{ + _val[0] ^= _val[1]; _val[1] ^= _val[0]; _val[0] ^= _val[1]; +} + + +template <> inline +void _reverse_byte_order_N<4>(uint8_t* _val) +{ + _val[0] ^= _val[3]; _val[3] ^= _val[0]; _val[0] ^= _val[3]; // 0 <-> 3 + _val[1] ^= _val[2]; _val[2] ^= _val[1]; _val[1] ^= _val[2]; // 1 <-> 2 +} + + +template <> inline +void _reverse_byte_order_N<8>(uint8_t* _val) +{ + _val[0] ^= _val[7]; _val[7] ^= _val[0]; _val[0] ^= _val[7]; // 0 <-> 7 + _val[1] ^= _val[6]; _val[6] ^= _val[1]; _val[1] ^= _val[6]; // 1 <-> 6 + _val[2] ^= _val[5]; _val[5] ^= _val[2]; _val[2] ^= _val[5]; // 2 <-> 5 + _val[3] ^= _val[4]; _val[4] ^= _val[3]; _val[3] ^= _val[4]; // 3 <-> 4 +} + + +template <> inline +void _reverse_byte_order_N<12>(uint8_t* _val) +{ + _val[0] ^= _val[11]; _val[11] ^= _val[0]; _val[0] ^= _val[11]; // 0 <-> 11 + _val[1] ^= _val[10]; _val[10] ^= _val[1]; _val[1] ^= _val[10]; // 1 <-> 10 + _val[2] ^= _val[ 9]; _val[ 9] ^= _val[2]; _val[2] ^= _val[ 9]; // 2 <-> 9 + _val[3] ^= _val[ 8]; _val[ 8] ^= _val[3]; _val[3] ^= _val[ 8]; // 3 <-> 8 + _val[4] ^= _val[ 7]; _val[ 7] ^= _val[4]; _val[4] ^= _val[ 7]; // 4 <-> 7 + _val[5] ^= _val[ 6]; _val[ 6] ^= _val[5]; _val[5] ^= _val[ 6]; // 5 <-> 6 +} + + +template <> inline +void _reverse_byte_order_N<16>(uint8_t* _val) +{ + _reverse_byte_order_N<8>(_val); + _reverse_byte_order_N<8>(_val+8); + std::swap(*(uint64_t*)_val, *(((uint64_t*)_val)+1)); +} + + +//----------------------------------------------------------------------------- +// wrapper for byte reordering + +// reverting pointers makes no sense, hence forbid it. +/** this does not compile for g++3.4 and higher, hence we comment the +function body which will result in a linker error */ +template inline T* reverse_byte_order(T* t); +// Should never reach this point. If so, then some operator were not +// overloaded. Especially check for IO::binary<> specialization on +// custom data types. + + +inline void compile_time_error__no_fundamental_type() +{ + // we should never reach this point + assert(false); +} + +// default action for byte reversal: cause an error to avoid +// surprising behaviour! +template T& reverse_byte_order( T& _t ) +{ + omerr() << "Not defined for type " << typeid(T).name() << std::endl; + compile_time_error__no_fundamental_type(); + return _t; +} + +template <> inline bool& reverse_byte_order(bool & _t) { return _t; } +template <> inline char& reverse_byte_order(char & _t) { return _t; } +#if defined(OM_CC_GCC) +template <> inline signed char& reverse_byte_order(signed char & _t) { return _t; } +#endif +template <> inline uchar& reverse_byte_order(uchar& _t) { return _t; } + +// Instead do specializations for the necessary types +#define REVERSE_FUNDAMENTAL_TYPE( T ) \ + template <> inline T& reverse_byte_order( T& _t ) {\ + _reverse_byte_order_N( reinterpret_cast(&_t) ); \ + return _t; \ + } + +// REVERSE_FUNDAMENTAL_TYPE(bool) +// REVERSE_FUNDAMENTAL_TYPE(char) +// REVERSE_FUNDAMENTAL_TYPE(uchar) +REVERSE_FUNDAMENTAL_TYPE(int16_t) +REVERSE_FUNDAMENTAL_TYPE(uint16_t) +// REVERSE_FUNDAMENTAL_TYPE(int) +// REVERSE_FUNDAMENTAL_TYPE(uint) + +REVERSE_FUNDAMENTAL_TYPE(unsigned long) +REVERSE_FUNDAMENTAL_TYPE(int32_t) +REVERSE_FUNDAMENTAL_TYPE(uint32_t) +REVERSE_FUNDAMENTAL_TYPE(int64_t) +REVERSE_FUNDAMENTAL_TYPE(uint64_t) +REVERSE_FUNDAMENTAL_TYPE(float) +REVERSE_FUNDAMENTAL_TYPE(double) +REVERSE_FUNDAMENTAL_TYPE(long double) + +#undef REVERSE_FUNDAMENTAL_TYPE + +#if 0 + +#define REVERSE_VECTORT_TYPE( T ) \ + template <> inline T& reverse_byte_order(T& _v) {\ + for (size_t i; i< T::size_; ++i) \ + _reverse_byte_order_N< sizeof(T::value_type) >( reinterpret_cast(&_v[i])); \ + return _v; \ + } + +#define REVERSE_VECTORT_TYPES( N ) \ + REVERSE_VECTORT_TYPE( Vec##N##c ) \ + REVERSE_VECTORT_TYPE( Vec##N##uc ) \ + REVERSE_VECTORT_TYPE( Vec##N##s ) \ + REVERSE_VECTORT_TYPE( Vec##N##us ) \ + REVERSE_VECTORT_TYPE( Vec##N##i ) \ + REVERSE_VECTORT_TYPE( Vec##N##ui ) \ + REVERSE_VECTORT_TYPE( Vec##N##f ) \ + REVERSE_VECTORT_TYPE( Vec##N##d ) \ + +REVERSE_VECTORT_TYPES(1) +REVERSE_VECTORT_TYPES(2) +REVERSE_VECTORT_TYPES(3) +REVERSE_VECTORT_TYPES(4) +REVERSE_VECTORT_TYPES(6) + +#undef REVERSE_VECTORT_TYPES +#undef REVERSE_VECTORT_TYPE + +#endif + +template inline +T reverse_byte_order(const T& a) +{ + compile_timer_error__const_means_const(a); + return a; +} + + +//@} + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_SR_RBO_HH defined +//============================================================================= + diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/SR_store.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/SR_store.hh new file mode 100644 index 0000000..e1b99a0 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/SR_store.hh @@ -0,0 +1,72 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Helper Functions for binary reading / writing +// +//============================================================================= + +#ifndef OPENMESH_SR_STORE_HH +#define OPENMESH_SR_STORE_HH + + +//== INCLUDES ================================================================= + +#include +#include +#include +#include +#include +#include + +//============================================================================= +#endif // OPENMESH_STORE_HH defined +//============================================================================= + diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/SR_types.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/SR_types.hh new file mode 100644 index 0000000..9628f59 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/SR_types.hh @@ -0,0 +1,112 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Helper Functions for binary reading / writing +// +//============================================================================= + +#ifndef OPENMESH_SR_TYPES_HH +#define OPENMESH_SR_TYPES_HH + + +//== INCLUDES ================================================================= + +#include + + +//== NAMESPACES =============================================================== + +namespace OpenMesh { +namespace IO { + + +//============================================================================= + + +/** \name Handling binary input/output. + These functions take care of swapping bytes to get the right Endian. +*/ +//@{ + +//----------------------------------------------------------------------------- + +typedef unsigned char uchar; +typedef unsigned short ushort; +typedef unsigned long ulong; + +typedef signed char int8_t; typedef unsigned char uint8_t; +typedef short int16_t; typedef unsigned short uint16_t; + +// Int should be 32 bit on all archs. +// long is 32 under windows but 64 under unix 64 bit +typedef int int32_t; typedef unsigned int uint32_t; +#if defined(OM_CC_MSVC) +typedef __int64 int64_t; typedef unsigned __int64 uint64_t; +#else +typedef long long int64_t; typedef unsigned long long uint64_t; +#endif + +typedef float float32_t; +typedef double float64_t; + +typedef uint8_t rgb_t[3]; +typedef uint8_t rgba_t[4]; + +//@} + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_MESHREADER_HH defined +//============================================================================= + diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/StoreRestore.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/StoreRestore.hh new file mode 100644 index 0000000..fff6708 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/StoreRestore.hh @@ -0,0 +1,117 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Helper Functions for binary reading / writing +// +//============================================================================= + +#ifndef OPENMESH_STORERESTORE_HH +#define OPENMESH_STORERESTORE_HH + + +//== INCLUDES ================================================================= + +#include +#include +#include +#include + +//== NAMESPACES =============================================================== + +namespace OpenMesh { +namespace IO { + + +//============================================================================= + + +/** \name Handling binary input/output. + These functions take care of swapping bytes to get the right Endian. +*/ +//@{ + + +//----------------------------------------------------------------------------- +// StoreRestore definitions + +template inline +bool is_streamable(void) +{ return binary< T >::is_streamable; } + +template inline +bool is_streamable( const T& ) +{ return binary< T >::is_streamable; } + +template inline +size_t size_of( const T& _v ) +{ return binary< T >::size_of(_v); } + +template inline +size_t size_of(void) +{ return binary< T >::size_of(); } + +template inline +size_t store( std::ostream& _os, const T& _v, bool _swap=false) +{ return binary< T >::store( _os, _v, _swap ); } + +template inline +size_t restore( std::istream& _is, T& _v, bool _swap=false) +{ return binary< T >::restore( _is, _v, _swap ); } + +//@} + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_MESHREADER_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/exporter/BaseExporter.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/exporter/BaseExporter.hh new file mode 100644 index 0000000..477d95a --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/exporter/BaseExporter.hh @@ -0,0 +1,165 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements the baseclass for MeshWriter exporter modules +// +//============================================================================= + + +#ifndef __BASEEXPORTER_HH__ +#define __BASEEXPORTER_HH__ + + +//=== INCLUDES ================================================================ + + +// STL +#include + +// OpenMesh +#include +#include +#include + + +//=== NAMESPACES ============================================================== + + +namespace OpenMesh { +namespace IO { + + +//=== EXPORTER ================================================================ + + +/** + Base class for exporter modules. + The exporter modules provide an interface between the writer modules and + the target data structure. +*/ + +class OPENMESHDLLEXPORT BaseExporter +{ +public: + + virtual ~BaseExporter() { } + + + // get vertex data + virtual Vec3f point(VertexHandle _vh) const = 0; + virtual Vec3f normal(VertexHandle _vh) const = 0; + virtual Vec3uc color(VertexHandle _vh) const = 0; + virtual Vec4uc colorA(VertexHandle _vh) const = 0; + virtual Vec3ui colori(VertexHandle _vh) const = 0; + virtual Vec4ui colorAi(VertexHandle _vh) const = 0; + virtual Vec3f colorf(VertexHandle _vh) const = 0; + virtual Vec4f colorAf(VertexHandle _vh) const = 0; + virtual Vec2f texcoord(VertexHandle _vh) const = 0; + virtual Vec2f texcoord(HalfedgeHandle _heh) const = 0; + + + // get face data + virtual unsigned int + get_vhandles(FaceHandle _fh, + std::vector& _vhandles) const=0; + /// + /// \brief getHeh returns the HalfEdgeHandle that belongs to the face + /// specified by _fh and has a toVertexHandle that corresponds to _vh. + /// \param _fh FaceHandle that is used to search for the half edge handle + /// \param _vh to_vertex_handle of the searched heh + /// \return HalfEdgeHandle or invalid HalfEdgeHandle if none is found. + /// + virtual HalfedgeHandle getHeh(FaceHandle _fh, VertexHandle _vh) const = 0; + virtual unsigned int + get_face_texcoords(std::vector& _hehandles) const = 0; + virtual Vec3f normal(FaceHandle _fh) const = 0; + virtual Vec3uc color (FaceHandle _fh) const = 0; + virtual Vec4uc colorA(FaceHandle _fh) const = 0; + virtual Vec3ui colori(FaceHandle _fh) const = 0; + virtual Vec4ui colorAi(FaceHandle _fh) const = 0; + virtual Vec3f colorf(FaceHandle _fh) const = 0; + virtual Vec4f colorAf(FaceHandle _fh) const = 0; + + // get edge data + virtual Vec3uc color(EdgeHandle _eh) const = 0; + virtual Vec4uc colorA(EdgeHandle _eh) const = 0; + virtual Vec3ui colori(EdgeHandle _eh) const = 0; + virtual Vec4ui colorAi(EdgeHandle _eh) const = 0; + virtual Vec3f colorf(EdgeHandle _eh) const = 0; + virtual Vec4f colorAf(EdgeHandle _eh) const = 0; + + // get reference to base kernel + virtual const BaseKernel* kernel() { return 0; } + + + // query number of faces, vertices, normals, texcoords + virtual size_t n_vertices() const = 0; + virtual size_t n_faces() const = 0; + virtual size_t n_edges() const = 0; + + + // property information + virtual bool is_triangle_mesh() const { return false; } + virtual bool has_vertex_normals() const { return false; } + virtual bool has_vertex_colors() const { return false; } + virtual bool has_vertex_texcoords() const { return false; } + virtual bool has_edge_colors() const { return false; } + virtual bool has_face_normals() const { return false; } + virtual bool has_face_colors() const { return false; } +}; + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/exporter/ExporterT.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/exporter/ExporterT.hh new file mode 100644 index 0000000..9a9d9b3 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/exporter/ExporterT.hh @@ -0,0 +1,338 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements an exporter module for arbitrary OpenMesh meshes +// +//============================================================================= + + +#ifndef __EXPORTERT_HH__ +#define __EXPORTERT_HH__ + + +//=== INCLUDES ================================================================ + +// C++ +#include + +// OpenMesh +#include +#include +#include +#include +#include +#include + + +//=== NAMESPACES ============================================================== + +namespace OpenMesh { +namespace IO { + + +//=== EXPORTER CLASS ========================================================== + +/** + * This class template provides an exporter module for OpenMesh meshes. + */ +template +class ExporterT : public BaseExporter +{ +public: + + // Constructor + ExporterT(const Mesh& _mesh) : mesh_(_mesh) {} + + + // get vertex data + + Vec3f point(VertexHandle _vh) const + { + return vector_cast(mesh_.point(_vh)); + } + + Vec3f normal(VertexHandle _vh) const + { + return (mesh_.has_vertex_normals() + ? vector_cast(mesh_.normal(_vh)) + : Vec3f(0.0f, 0.0f, 0.0f)); + } + + Vec3uc color(VertexHandle _vh) const + { + return (mesh_.has_vertex_colors() + ? color_cast(mesh_.color(_vh)) + : Vec3uc(0, 0, 0)); + } + + Vec4uc colorA(VertexHandle _vh) const + { + return (mesh_.has_vertex_colors() + ? color_cast(mesh_.color(_vh)) + : Vec4uc(0, 0, 0, 0)); + } + + Vec3ui colori(VertexHandle _vh) const + { + return (mesh_.has_vertex_colors() + ? color_cast(mesh_.color(_vh)) + : Vec3ui(0, 0, 0)); + } + + Vec4ui colorAi(VertexHandle _vh) const + { + return (mesh_.has_vertex_colors() + ? color_cast(mesh_.color(_vh)) + : Vec4ui(0, 0, 0, 0)); + } + + Vec3f colorf(VertexHandle _vh) const + { + return (mesh_.has_vertex_colors() + ? color_cast(mesh_.color(_vh)) + : Vec3f(0, 0, 0)); + } + + Vec4f colorAf(VertexHandle _vh) const + { + return (mesh_.has_vertex_colors() + ? color_cast(mesh_.color(_vh)) + : Vec4f(0, 0, 0, 0)); + } + + Vec2f texcoord(VertexHandle _vh) const + { +#if defined(OM_CC_GCC) && (OM_CC_VERSION<30000) + // Workaround! + // gcc 2.95.3 exits with internal compiler error at the + // code below!??? **) + if (mesh_.has_vertex_texcoords2D()) + return vector_cast(mesh_.texcoord2D(_vh)); + return Vec2f(0.0f, 0.0f); +#else // **) + return (mesh_.has_vertex_texcoords2D() + ? vector_cast(mesh_.texcoord2D(_vh)) + : Vec2f(0.0f, 0.0f)); +#endif + } + + Vec2f texcoord(HalfedgeHandle _heh) const + { + return (mesh_.has_halfedge_texcoords2D() + ? vector_cast(mesh_.texcoord2D(_heh)) + : Vec2f(0.0f, 0.0f)); + } + + // get edge data + + Vec3uc color(EdgeHandle _eh) const + { + return (mesh_.has_edge_colors() + ? color_cast(mesh_.color(_eh)) + : Vec3uc(0, 0, 0)); + } + + Vec4uc colorA(EdgeHandle _eh) const + { + return (mesh_.has_edge_colors() + ? color_cast(mesh_.color(_eh)) + : Vec4uc(0, 0, 0, 0)); + } + + Vec3ui colori(EdgeHandle _eh) const + { + return (mesh_.has_edge_colors() + ? color_cast(mesh_.color(_eh)) + : Vec3ui(0, 0, 0)); + } + + Vec4ui colorAi(EdgeHandle _eh) const + { + return (mesh_.has_edge_colors() + ? color_cast(mesh_.color(_eh)) + : Vec4ui(0, 0, 0, 0)); + } + + Vec3f colorf(EdgeHandle _eh) const + { + return (mesh_.has_vertex_colors() + ? color_cast(mesh_.color(_eh)) + : Vec3f(0, 0, 0)); + } + + Vec4f colorAf(EdgeHandle _eh) const + { + return (mesh_.has_vertex_colors() + ? color_cast(mesh_.color(_eh)) + : Vec4f(0, 0, 0, 0)); + } + + // get face data + + unsigned int get_vhandles(FaceHandle _fh, + std::vector& _vhandles) const + { + unsigned int count(0); + _vhandles.clear(); + for (typename Mesh::CFVIter fv_it=mesh_.cfv_iter(_fh); fv_it.is_valid(); ++fv_it) + { + _vhandles.push_back(*fv_it); + ++count; + } + return count; + } + + unsigned int get_face_texcoords(std::vector& _hehandles) const + { + unsigned int count(0); + _hehandles.clear(); + for(typename Mesh::CHIter he_it=mesh_.halfedges_begin(); + he_it != mesh_.halfedges_end(); ++he_it) + { + _hehandles.push_back(vector_cast(mesh_.texcoord2D( *he_it))); + ++count; + } + + return count; + } + + HalfedgeHandle getHeh(FaceHandle _fh, VertexHandle _vh) const + { + typename Mesh::ConstFaceHalfedgeIter fh_it; + for(fh_it = mesh_.cfh_iter(_fh); fh_it.is_valid();++fh_it) + { + if(mesh_.to_vertex_handle(*fh_it) == _vh) + return *fh_it; + } + return *fh_it; + } + + Vec3f normal(FaceHandle _fh) const + { + return (mesh_.has_face_normals() + ? vector_cast(mesh_.normal(_fh)) + : Vec3f(0.0f, 0.0f, 0.0f)); + } + + Vec3uc color(FaceHandle _fh) const + { + return (mesh_.has_face_colors() + ? color_cast(mesh_.color(_fh)) + : Vec3uc(0, 0, 0)); + } + + Vec4uc colorA(FaceHandle _fh) const + { + return (mesh_.has_face_colors() + ? color_cast(mesh_.color(_fh)) + : Vec4uc(0, 0, 0, 0)); + } + + Vec3ui colori(FaceHandle _fh) const + { + return (mesh_.has_face_colors() + ? color_cast(mesh_.color(_fh)) + : Vec3ui(0, 0, 0)); + } + + Vec4ui colorAi(FaceHandle _fh) const + { + return (mesh_.has_face_colors() + ? color_cast(mesh_.color(_fh)) + : Vec4ui(0, 0, 0, 0)); + } + + Vec3f colorf(FaceHandle _fh) const + { + return (mesh_.has_vertex_colors() + ? color_cast(mesh_.color(_fh)) + : Vec3f(0, 0, 0)); + } + + Vec4f colorAf(FaceHandle _fh) const + { + return (mesh_.has_vertex_colors() + ? color_cast(mesh_.color(_fh)) + : Vec4f(0, 0, 0, 0)); + } + + virtual const BaseKernel* kernel() { return &mesh_; } + + + // query number of faces, vertices, normals, texcoords + size_t n_vertices() const { return mesh_.n_vertices(); } + size_t n_faces() const { return mesh_.n_faces(); } + size_t n_edges() const { return mesh_.n_edges(); } + + + // property information + bool is_triangle_mesh() const + { return Mesh::is_triangles(); } + + bool has_vertex_normals() const { return mesh_.has_vertex_normals(); } + bool has_vertex_colors() const { return mesh_.has_vertex_colors(); } + bool has_vertex_texcoords() const { return mesh_.has_vertex_texcoords2D(); } + bool has_edge_colors() const { return mesh_.has_edge_colors(); } + bool has_face_normals() const { return mesh_.has_face_normals(); } + bool has_face_colors() const { return mesh_.has_face_colors(); } + +private: + + const Mesh& mesh_; +}; + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/importer/BaseImporter.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/importer/BaseImporter.hh new file mode 100644 index 0000000..afcfd6c --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/importer/BaseImporter.hh @@ -0,0 +1,205 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements the baseclass for IOManager importer modules +// +//============================================================================= + + +#ifndef __BASEIMPORTER_HH__ +#define __BASEIMPORTER_HH__ + + +//=== INCLUDES ================================================================ + + +// STL +#include + +// OpenMesh +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { +namespace IO { + + +//=== IMPLEMENTATION ========================================================== + + +/** Base class for importer modules. Importer modules provide an + * interface between the loader modules and the target data + * structure. This is basically a wrapper providing virtual versions + * for the required mesh functions. + */ +class OPENMESHDLLEXPORT BaseImporter +{ +public: + + // base class needs virtual destructor + virtual ~BaseImporter() {} + + + // add a vertex with coordinate \c _point + virtual VertexHandle add_vertex(const Vec3f& _point) = 0; + + // add a vertex without coordinate. Use set_point to set the position deferred + virtual VertexHandle add_vertex() = 0; + + // add a face with indices _indices refering to vertices + typedef std::vector VHandles; + virtual FaceHandle add_face(const VHandles& _indices) = 0; + + // add texture coordinates per face, _vh references the first texcoord + virtual void add_face_texcoords( FaceHandle _fh, VertexHandle _vh, const std::vector& _face_texcoords) = 0; + + // add texture 3d coordinates per face, _vh references the first texcoord + virtual void add_face_texcoords( FaceHandle _fh, VertexHandle _vh, const std::vector& _face_texcoords) = 0; + + // Set the texture index for a face + virtual void set_face_texindex( FaceHandle _fh, int _texId ) = 0; + + // Set coordinate of the given vertex. Use this function, if you created a vertex without coordinate + virtual void set_point(VertexHandle _vh, const Vec3f& _point) = 0; + + // set vertex normal + virtual void set_normal(VertexHandle _vh, const Vec3f& _normal) = 0; + + // set vertex color + virtual void set_color(VertexHandle _vh, const Vec3uc& _color) = 0; + + // set vertex color + virtual void set_color(VertexHandle _vh, const Vec4uc& _color) = 0; + + // set vertex color + virtual void set_color(VertexHandle _vh, const Vec3f& _color) = 0; + + // set vertex color + virtual void set_color(VertexHandle _vh, const Vec4f& _color) = 0; + + // set vertex texture coordinate + virtual void set_texcoord(VertexHandle _vh, const Vec2f& _texcoord) = 0; + + // set vertex texture coordinate + virtual void set_texcoord(HalfedgeHandle _heh, const Vec2f& _texcoord) = 0; + + // set 3d vertex texture coordinate + virtual void set_texcoord(VertexHandle _vh, const Vec3f& _texcoord) = 0; + + // set 3d vertex texture coordinate + virtual void set_texcoord(HalfedgeHandle _heh, const Vec3f& _texcoord) = 0; + + // set edge color + virtual void set_color(EdgeHandle _eh, const Vec3uc& _color) = 0; + + // set edge color + virtual void set_color(EdgeHandle _eh, const Vec4uc& _color) = 0; + + // set edge color + virtual void set_color(EdgeHandle _eh, const Vec3f& _color) = 0; + + // set edge color + virtual void set_color(EdgeHandle _eh, const Vec4f& _color) = 0; + + // set face normal + virtual void set_normal(FaceHandle _fh, const Vec3f& _normal) = 0; + + // set face color + virtual void set_color(FaceHandle _fh, const Vec3uc& _color) = 0; + + // set face color + virtual void set_color(FaceHandle _fh, const Vec4uc& _color) = 0; + + // set face color + virtual void set_color(FaceHandle _fh, const Vec3f& _color) = 0; + + // set face color + virtual void set_color(FaceHandle _fh, const Vec4f& _color) = 0; + + // Store a property in the mesh mapping from an int to a texture file + // Use set_face_texindex to set the index for each face + virtual void add_texture_information( int _id , std::string _name ) = 0; + + // get reference to base kernel + virtual BaseKernel* kernel() { return 0; } + + virtual bool is_triangle_mesh() const { return false; } + + // reserve mem for elements + virtual void reserve( unsigned int /* nV */, + unsigned int /* nE */, + unsigned int /* nF */) {} + + // query number of faces, vertices, normals, texcoords + virtual size_t n_vertices() const = 0; + virtual size_t n_faces() const = 0; + virtual size_t n_edges() const = 0; + + + // pre-processing + virtual void prepare() {} + + // post-processing + virtual void finish() {} +}; + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/importer/ImporterT.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/importer/ImporterT.hh new file mode 100644 index 0000000..fb6b669 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/importer/ImporterT.hh @@ -0,0 +1,408 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements an importer module for arbitrary OpenMesh meshes +// +//============================================================================= + + +#ifndef __IMPORTERT_HH__ +#define __IMPORTERT_HH__ + + +//=== INCLUDES ================================================================ + + +#include +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { +namespace IO { + + +//=== IMPLEMENTATION ========================================================== + + +/** + * This class template provides an importer module for OpenMesh meshes. + */ +template +class ImporterT : public BaseImporter +{ +public: + + typedef typename Mesh::Point Point; + typedef typename Mesh::Normal Normal; + typedef typename Mesh::Color Color; + typedef typename Mesh::TexCoord2D TexCoord2D; + typedef typename Mesh::TexCoord3D TexCoord3D; + typedef std::vector VHandles; + + + ImporterT(Mesh& _mesh) : mesh_(_mesh), halfedgeNormals_() {} + + + virtual VertexHandle add_vertex(const Vec3f& _point) + { + return mesh_.add_vertex(vector_cast(_point)); + } + + virtual VertexHandle add_vertex() + { + return mesh_.new_vertex(); + } + + virtual FaceHandle add_face(const VHandles& _indices) + { + FaceHandle fh; + + if (_indices.size() > 2) + { + VHandles::const_iterator it, it2, end(_indices.end()); + + + // test for valid vertex indices + for (it=_indices.begin(); it!=end; ++it) + if (! mesh_.is_valid_handle(*it)) + { + omerr() << "ImporterT: Face contains invalid vertex index\n"; + return fh; + } + + + // don't allow double vertices + for (it=_indices.begin(); it!=end; ++it) + for (it2=it+1; it2!=end; ++it2) + if (*it == *it2) + { + omerr() << "ImporterT: Face has equal vertices\n"; + return fh; + } + + + // try to add face + fh = mesh_.add_face(_indices); + // separate non-manifold faces and mark them + if (!fh.is_valid()) + { + VHandles vhandles(_indices.size()); + + // double vertices + for (unsigned int j=0; j<_indices.size(); ++j) + { + // DO STORE p, reference may not work since vertex array + // may be relocated after adding a new vertex ! + Point p = mesh_.point(_indices[j]); + vhandles[j] = mesh_.add_vertex(p); + + // Mark vertices of failed face as non-manifold + if (mesh_.has_vertex_status()) { + mesh_.status(vhandles[j]).set_fixed_nonmanifold(true); + } + } + + // add face + fh = mesh_.add_face(vhandles); + + // Mark failed face as non-manifold + if (mesh_.has_face_status()) + mesh_.status(fh).set_fixed_nonmanifold(true); + + // Mark edges of failed face as non-two-manifold + if (mesh_.has_edge_status()) { + typename Mesh::FaceEdgeIter fe_it = mesh_.fe_iter(fh); + for(; fe_it.is_valid(); ++fe_it) { + mesh_.status(*fe_it).set_fixed_nonmanifold(true); + } + } + } + + //write the half edge normals + if (mesh_.has_halfedge_normals()) + { + //iterate over all incoming haldedges of the added face + for (typename Mesh::FaceHalfedgeIter fh_iter = mesh_.fh_begin(fh); + fh_iter != mesh_.fh_end(fh); ++fh_iter) + { + //and write the normals to it + typename Mesh::HalfedgeHandle heh = *fh_iter; + typename Mesh::VertexHandle vh = mesh_.to_vertex_handle(heh); + typename std::map::iterator it_heNs = halfedgeNormals_.find(vh); + if (it_heNs != halfedgeNormals_.end()) + mesh_.set_normal(heh,it_heNs->second); + } + halfedgeNormals_.clear(); + } + } + return fh; + } + + // vertex attributes + + virtual void set_point(VertexHandle _vh, const Vec3f& _point) + { + mesh_.set_point(_vh,vector_cast(_point)); + } + + virtual void set_normal(VertexHandle _vh, const Vec3f& _normal) + { + if (mesh_.has_vertex_normals()) + mesh_.set_normal(_vh, vector_cast(_normal)); + + //saves normals for half edges. + //they will be written, when the face is added + if (mesh_.has_halfedge_normals()) + halfedgeNormals_[_vh] = vector_cast(_normal); + } + + virtual void set_color(VertexHandle _vh, const Vec4uc& _color) + { + if (mesh_.has_vertex_colors()) + mesh_.set_color(_vh, color_cast(_color)); + } + + virtual void set_color(VertexHandle _vh, const Vec3uc& _color) + { + if (mesh_.has_vertex_colors()) + mesh_.set_color(_vh, color_cast(_color)); + } + + virtual void set_color(VertexHandle _vh, const Vec4f& _color) + { + if (mesh_.has_vertex_colors()) + mesh_.set_color(_vh, color_cast(_color)); + } + + virtual void set_color(VertexHandle _vh, const Vec3f& _color) + { + if (mesh_.has_vertex_colors()) + mesh_.set_color(_vh, color_cast(_color)); + } + + virtual void set_texcoord(VertexHandle _vh, const Vec2f& _texcoord) + { + if (mesh_.has_vertex_texcoords2D()) + mesh_.set_texcoord2D(_vh, vector_cast(_texcoord)); + } + + virtual void set_texcoord(HalfedgeHandle _heh, const Vec2f& _texcoord) + { + if (mesh_.has_halfedge_texcoords2D()) + mesh_.set_texcoord2D(_heh, vector_cast(_texcoord)); + } + + virtual void set_texcoord(VertexHandle _vh, const Vec3f& _texcoord) + { + if (mesh_.has_vertex_texcoords3D()) + mesh_.set_texcoord3D(_vh, vector_cast(_texcoord)); + } + + virtual void set_texcoord(HalfedgeHandle _heh, const Vec3f& _texcoord) + { + if (mesh_.has_halfedge_texcoords3D()) + mesh_.set_texcoord3D(_heh, vector_cast(_texcoord)); + } + + + // edge attributes + + virtual void set_color(EdgeHandle _eh, const Vec4uc& _color) + { + if (mesh_.has_edge_colors()) + mesh_.set_color(_eh, color_cast(_color)); + } + + virtual void set_color(EdgeHandle _eh, const Vec3uc& _color) + { + if (mesh_.has_edge_colors()) + mesh_.set_color(_eh, color_cast(_color)); + } + + virtual void set_color(EdgeHandle _eh, const Vec4f& _color) + { + if (mesh_.has_edge_colors()) + mesh_.set_color(_eh, color_cast(_color)); + } + + virtual void set_color(EdgeHandle _eh, const Vec3f& _color) + { + if (mesh_.has_edge_colors()) + mesh_.set_color(_eh, color_cast(_color)); + } + + // face attributes + + virtual void set_normal(FaceHandle _fh, const Vec3f& _normal) + { + if (mesh_.has_face_normals()) + mesh_.set_normal(_fh, vector_cast(_normal)); + } + + virtual void set_color(FaceHandle _fh, const Vec3uc& _color) + { + if (mesh_.has_face_colors()) + mesh_.set_color(_fh, color_cast(_color)); + } + + virtual void set_color(FaceHandle _fh, const Vec4uc& _color) + { + if (mesh_.has_face_colors()) + mesh_.set_color(_fh, color_cast(_color)); + } + + virtual void set_color(FaceHandle _fh, const Vec3f& _color) + { + if (mesh_.has_face_colors()) + mesh_.set_color(_fh, color_cast(_color)); + } + + virtual void set_color(FaceHandle _fh, const Vec4f& _color) + { + if (mesh_.has_face_colors()) + mesh_.set_color(_fh, color_cast(_color)); + } + + virtual void add_face_texcoords( FaceHandle _fh, VertexHandle _vh, const std::vector& _face_texcoords) + { + // get first halfedge handle + HalfedgeHandle cur_heh = mesh_.halfedge_handle(_fh); + HalfedgeHandle end_heh = mesh_.prev_halfedge_handle(cur_heh); + + // find start heh + while( mesh_.to_vertex_handle(cur_heh) != _vh && cur_heh != end_heh ) + cur_heh = mesh_.next_halfedge_handle( cur_heh); + + for(unsigned int i=0; i<_face_texcoords.size(); ++i) + { + set_texcoord( cur_heh, _face_texcoords[i]); + cur_heh = mesh_.next_halfedge_handle( cur_heh); + } + } + + virtual void add_face_texcoords( FaceHandle _fh, VertexHandle _vh, const std::vector& _face_texcoords) + { + // get first halfedge handle + HalfedgeHandle cur_heh = mesh_.halfedge_handle(_fh); + HalfedgeHandle end_heh = mesh_.prev_halfedge_handle(cur_heh); + + // find start heh + while( mesh_.to_vertex_handle(cur_heh) != _vh && cur_heh != end_heh ) + cur_heh = mesh_.next_halfedge_handle( cur_heh); + + for(unsigned int i=0; i<_face_texcoords.size(); ++i) + { + set_texcoord( cur_heh, _face_texcoords[i]); + cur_heh = mesh_.next_halfedge_handle( cur_heh); + } + } + + virtual void set_face_texindex( FaceHandle _fh, int _texId ) { + if ( mesh_.has_face_texture_index() ) { + mesh_.set_texture_index(_fh , _texId); + } + } + + virtual void add_texture_information( int _id , std::string _name ) { + OpenMesh::MPropHandleT< std::map< int, std::string > > property; + + if ( !mesh_.get_property_handle(property,"TextureMapping") ) { + mesh_.add_property(property,"TextureMapping"); + } + + if ( mesh_.property(property).find( _id ) == mesh_.property(property).end() ) + mesh_.property(property)[_id] = _name; + } + + // low-level access to mesh + + virtual BaseKernel* kernel() { return &mesh_; } + + bool is_triangle_mesh() const + { return Mesh::is_triangles(); } + + void reserve(unsigned int nV, unsigned int nE, unsigned int nF) + { + mesh_.reserve(nV, nE, nF); + } + + // query number of faces, vertices, normals, texcoords + size_t n_vertices() const { return mesh_.n_vertices(); } + size_t n_faces() const { return mesh_.n_faces(); } + size_t n_edges() const { return mesh_.n_edges(); } + + + void prepare() { } + + + void finish() { } + + +private: + + Mesh& mesh_; + // stores normals for halfedges of the next face + std::map halfedgeNormals_; +}; + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/reader/BaseReader.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/reader/BaseReader.hh new file mode 100644 index 0000000..463b9c7 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/reader/BaseReader.hh @@ -0,0 +1,213 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements the baseclass for IOManager file access modules +// +//============================================================================= + + +#ifndef __BASEREADER_HH__ +#define __BASEREADER_HH__ + + +//=== INCLUDES ================================================================ + + +// STD C++ +#include +#include +#include +#include +#include + +// OpenMesh +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { +namespace IO { + + +//=== IMPLEMENTATION ========================================================== + + +/** + Base class for reader modules. + Reader modules access persistent data and pass them to the desired + data structure by the means of a BaseImporter derivative. + All reader modules must be derived from this class. +*/ +class OPENMESHDLLEXPORT BaseReader +{ +public: + + /// Destructor + virtual ~BaseReader() {}; + + /// Returns a brief description of the file type that can be parsed. + virtual std::string get_description() const = 0; + + /** Returns a string with the accepted file extensions separated by a + whitespace and in small caps. + */ + virtual std::string get_extensions() const = 0; + + /// Return magic bits used to determine file format + virtual std::string get_magic() const { return std::string(""); } + + + /** Reads a mesh given by a filename. Usually this method opens a stream + and passes it to stream read method. Acceptance checks by filename + extension can be placed here. + + Options can be passed via _opt. After execution _opt contains the Options + that were available + */ + virtual bool read(const std::string& _filename, + BaseImporter& _bi, + Options& _opt) = 0; + + /** Reads a mesh given by a std::stream. This method usually uses the same stream reading method + that read uses. Options can be passed via _opt. After execution _opt contains the Options + that were available. + + Please make sure that if _is is std::ifstream, the correct std::ios_base::openmode flags are set. + */ + virtual bool read(std::istream& _is, + BaseImporter& _bi, + Options& _opt) = 0; + + + /** \brief Returns true if writer can parse _filename (checks extension). + * _filename can also provide an extension without a name for a file e.g. _filename == "om" checks, if the reader can read the "om" extension + * @param _filename complete name of a file or just the extension + * @result true, if reader can read data with the given extension + */ + virtual bool can_u_read(const std::string& _filename) const; + + +protected: + + // case insensitive search for _ext in _fname. + bool check_extension(const std::string& _fname, + const std::string& _ext) const; +}; + + +/** \brief Trim left whitespace + * + * Removes whitespace at the beginning of the string + * + * @param _string input string + * @return trimmed string + */ +static inline std::string &left_trim(std::string &_string) { + + // Find out if the compiler supports CXX11 + #if ( __cplusplus >= 201103L || _MSVC_LANG >= 201103L ) + // as with CXX11 we can use lambda expressions + _string.erase(_string.begin(), std::find_if(_string.begin(), _string.end(), [](int i)->int { return ! std::isspace(i); })); + #else + // we do what we did before + _string.erase(_string.begin(), std::find_if(_string.begin(), _string.end(), std::not1(std::ptr_fun(std::isspace)))); + #endif + + return _string; +} + +/** \brief Trim right whitespace + * + * Removes whitespace at the end of the string + * + * @param _string input string + * @return trimmed string + */ +static inline std::string &right_trim(std::string &_string) { + + // Find out if the compiler supports CXX11 + #if ( __cplusplus >= 201103L || _MSVC_LANG >= 201103L ) + // as with CXX11 we can use lambda expressions + _string.erase(std::find_if(_string.rbegin(), _string.rend(), [](int i)->int { return ! std::isspace(i); } ).base(), _string.end()); + #else + // we do what we did before + _string.erase(std::find_if(_string.rbegin(), _string.rend(), std::not1(std::ptr_fun(std::isspace))).base(), _string.end()); + #endif + + + + return _string; +} + +/** \brief Trim whitespace + * + * Removes whitespace at the beginning and end of the string + * + * @param _string input string + * @return trimmed string + */ +static inline std::string &trim(std::string &_string) { + return left_trim(right_trim(_string)); +} + + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/reader/OBJReader.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/reader/OBJReader.hh new file mode 100644 index 0000000..70c3a2f --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/reader/OBJReader.hh @@ -0,0 +1,201 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements an reader module for OBJ files +// +//============================================================================= + + +#ifndef __OBJREADER_HH__ +#define __OBJREADER_HH__ + + +//=== INCLUDES ================================================================ + + +#include +#include +#include + +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { +namespace IO { + + +//== IMPLEMENTATION =========================================================== + + +/** + Implementation of the OBJ format reader. +*/ +class OPENMESHDLLEXPORT _OBJReader_ : public BaseReader +{ +public: + + _OBJReader_(); + + virtual ~_OBJReader_() { } + + std::string get_description() const { return "Alias/Wavefront"; } + std::string get_extensions() const { return "obj"; } + + bool read(const std::string& _filename, + BaseImporter& _bi, + Options& _opt); + + bool read(std::istream& _in, + BaseImporter& _bi, + Options& _opt); + +private: + +#ifndef DOXY_IGNORE_THIS + class Material + { + public: + + Material() { cleanup(); } + + void cleanup() + { + Kd_is_set_ = false; + Ka_is_set_ = false; + Ks_is_set_ = false; + Tr_is_set_ = false; + map_Kd_is_set_ = false; + } + + bool is_valid(void) const + { return Kd_is_set_ || Ka_is_set_ || Ks_is_set_ || Tr_is_set_ || map_Kd_is_set_; } + + bool has_Kd(void) { return Kd_is_set_; } + bool has_Ka(void) { return Ka_is_set_; } + bool has_Ks(void) { return Ks_is_set_; } + bool has_Tr(void) { return Tr_is_set_; } + bool has_map_Kd(void) { return map_Kd_is_set_; } + + void set_Kd( float r, float g, float b ) + { Kd_=Vec3f(r,g,b); Kd_is_set_=true; } + + void set_Ka( float r, float g, float b ) + { Ka_=Vec3f(r,g,b); Ka_is_set_=true; } + + void set_Ks( float r, float g, float b ) + { Ks_=Vec3f(r,g,b); Ks_is_set_=true; } + + void set_Tr( float t ) + { Tr_=t; Tr_is_set_=true; } + + void set_map_Kd( std::string _name, int _index_Kd ) + { map_Kd_ = _name, index_Kd_ = _index_Kd; map_Kd_is_set_ = true; }; + + const Vec3f& Kd( void ) const { return Kd_; } + const Vec3f& Ka( void ) const { return Ka_; } + const Vec3f& Ks( void ) const { return Ks_; } + float Tr( void ) const { return Tr_; } + const std::string& map_Kd( void ) { return map_Kd_ ; } + const int& map_Kd_index( void ) { return index_Kd_ ; } + + private: + + Vec3f Kd_; bool Kd_is_set_; // diffuse + Vec3f Ka_; bool Ka_is_set_; // ambient + Vec3f Ks_; bool Ks_is_set_; // specular + float Tr_; bool Tr_is_set_; // transperency + + std::string map_Kd_; int index_Kd_; bool map_Kd_is_set_; // Texture + + }; +#endif + + typedef std::map MaterialList; + + MaterialList materials_; + + bool read_material( std::fstream& _in ); + + +private: + + bool read_vertices(std::istream& _in, BaseImporter& _bi, Options& _opt, + std::vector & normals, + std::vector & colors, + std::vector & texcoords3d, + std::vector & texcoords, + std::vector & vertexHandles, + Options & fileOptions); + + std::string path_; + +}; + + +//== TYPE DEFINITION ========================================================== + + +extern _OBJReader_ __OBJReaderInstance; +OPENMESHDLLEXPORT _OBJReader_& OBJReader(); + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/reader/OFFReader.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/reader/OFFReader.hh new file mode 100644 index 0000000..755093a --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/reader/OFFReader.hh @@ -0,0 +1,171 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements a reader module for OFF files +// +//============================================================================= + + +#ifndef __OFFREADER_HH__ +#define __OFFREADER_HH__ + + +//=== INCLUDES ================================================================ + + +#include +#include +#include + +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { +namespace IO { + + +//== FORWARDS ================================================================= + + +class BaseImporter; + + +//== IMPLEMENTATION =========================================================== + + +/** + Implementation of the OFF format reader. This class is singleton'ed by + SingletonT to OFFReader. + + By passing Options to the read function you can manipulate the reading behavoir. + The following options can be set: + + VertexNormal + VertexColor + VertexTexCoord + FaceColor + ColorAlpha [only when reading binary] + + These options define if the corresponding data should be read (if available) + or if it should be omitted. + + After execution of the read function. The options object contains information about + what was actually read. + + e.g. if VertexNormal was true when the read function was called, but the file + did not contain vertex normals then it is false afterwards. + + When reading a binary off with Color Flag in the header it is assumed that all vertices + and faces have colors in the format "int int int". + If ColorAlpha is set the format "int int int int" is assumed. + +*/ + +class OPENMESHDLLEXPORT _OFFReader_ : public BaseReader +{ +public: + + _OFFReader_(); + + /// Destructor + virtual ~_OFFReader_() {}; + + std::string get_description() const { return "Object File Format"; } + std::string get_extensions() const { return "off"; } + std::string get_magic() const { return "OFF"; } + + bool read(const std::string& _filename, + BaseImporter& _bi, + Options& _opt); + + bool can_u_read(const std::string& _filename) const; + + bool read(std::istream& _in, BaseImporter& _bi, Options& _opt ); + +private: + + bool can_u_read(std::istream& _is) const; + + bool read_ascii(std::istream& _in, BaseImporter& _bi, Options& _opt) const; + bool read_binary(std::istream& _in, BaseImporter& _bi, Options& _opt, bool swap) const; + + void readValue(std::istream& _in, float& _value) const; + void readValue(std::istream& _in, int& _value) const; + void readValue(std::istream& _in, unsigned int& _value) const; + + int getColorType(std::string & _line, bool _texCoordsAvailable) const; + + //available options for reading + mutable Options options_; + //options that the user wants to read + mutable Options userOptions_; +}; + + +//== TYPE DEFINITION ========================================================== + + +/// Declare the single entity of the OFF reader +extern _OFFReader_ __OFFReaderInstance; +OPENMESHDLLEXPORT _OFFReader_& OFFReader(); + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/reader/OMReader.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/reader/OMReader.hh new file mode 100644 index 0000000..4b1f67d --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/reader/OMReader.hh @@ -0,0 +1,178 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements a reader module for OFF files +// +//============================================================================= + + +#ifndef __OMREADER_HH__ +#define __OMREADER_HH__ + + +//=== INCLUDES ================================================================ + +// OpenMesh +#include +#include +#include +#include +#include +#include + +// STD C++ +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { +namespace IO { + + +//== IMPLEMENTATION =========================================================== + + +/** + Implementation of the OM format reader. This class is singleton'ed by + SingletonT to OMReader. +*/ +class OPENMESHDLLEXPORT _OMReader_ : public BaseReader +{ +public: + + _OMReader_(); + virtual ~_OMReader_() { } + + std::string get_description() const { return "OpenMesh File Format"; } + std::string get_extensions() const { return "om"; } + std::string get_magic() const { return "OM"; } + + bool read(const std::string& _filename, + BaseImporter& _bi, + Options& _opt ); + +//! Stream Reader for std::istream input in binary format + bool read(std::istream& _is, + BaseImporter& _bi, + Options& _opt ); + + virtual bool can_u_read(const std::string& _filename) const; + virtual bool can_u_read(std::istream& _is) const; + + +private: + + bool supports( const OMFormat::uint8 version ) const; + + bool read_ascii(std::istream& _is, BaseImporter& _bi, Options& _opt) const; + bool read_binary(std::istream& _is, BaseImporter& _bi, Options& _opt) const; + + typedef OMFormat::Header Header; + typedef OMFormat::Chunk::Header ChunkHeader; + typedef OMFormat::Chunk::PropertyName PropertyName; + + // initialized/updated by read_binary*/read_ascii* + mutable size_t bytes_; + mutable Options fileOptions_; + mutable Header header_; + mutable ChunkHeader chunk_header_; + mutable PropertyName property_name_; + + bool read_binary_vertex_chunk( std::istream &_is, + BaseImporter &_bi, + Options &_opt, + bool _swap) const; + + bool read_binary_face_chunk( std::istream &_is, + BaseImporter &_bi, + Options &_opt, + bool _swap) const; + + bool read_binary_edge_chunk( std::istream &_is, + BaseImporter &_bi, + Options &_opt, + bool _swap) const; + + bool read_binary_halfedge_chunk( std::istream &_is, + BaseImporter &_bi, + Options &_opt, + bool _swap) const; + + bool read_binary_mesh_chunk( std::istream &_is, + BaseImporter &_bi, + Options &_opt, + bool _swap) const; + + size_t restore_binary_custom_data( std::istream& _is, + BaseProperty* _bp, + size_t _n_elem, + bool _swap) const; + +}; + + +//== TYPE DEFINITION ========================================================== + + +/// Declare the single entity of the OM reader. +extern _OMReader_ __OMReaderInstance; +OPENMESHDLLEXPORT _OMReader_& OMReader(); + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/reader/PLYReader.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/reader/PLYReader.hh new file mode 100644 index 0000000..c887a5b --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/reader/PLYReader.hh @@ -0,0 +1,244 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements a reader module for OFF files +// +//============================================================================= + + +#ifndef __PLYREADER_HH__ +#define __PLYREADER_HH__ + + +//=== INCLUDES ================================================================ + + + +#include +#include +#include +#include + +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { +namespace IO { + + +//== FORWARDS ================================================================= + + +class BaseImporter; + + +//== IMPLEMENTATION =========================================================== + + +/** + Implementation of the PLY format reader. This class is singleton'ed by + SingletonT to OFFReader. It can read custom properties, accessible via the name + of the custom properties. List properties has the type std::vector. + +*/ + +class OPENMESHDLLEXPORT _PLYReader_ : public BaseReader +{ +public: + + _PLYReader_(); + + std::string get_description() const { return "PLY polygon file format"; } + std::string get_extensions() const { return "ply"; } + std::string get_magic() const { return "PLY"; } + + bool read(const std::string& _filename, + BaseImporter& _bi, + Options& _opt); + + bool read(std::istream& _is, + BaseImporter& _bi, + Options& _opt); + + bool can_u_read(const std::string& _filename) const; + + enum ValueType { + Unsupported, + ValueTypeINT8, ValueTypeCHAR, + ValueTypeUINT8, ValueTypeUCHAR, + ValueTypeINT16, ValueTypeSHORT, + ValueTypeUINT16, ValueTypeUSHORT, + ValueTypeINT32, ValueTypeINT, + ValueTypeUINT32, ValueTypeUINT, + ValueTypeFLOAT32, ValueTypeFLOAT, + ValueTypeFLOAT64, ValueTypeDOUBLE + }; + +private: + + bool can_u_read(std::istream& _is) const; + + bool read_ascii(std::istream& _in, BaseImporter& _bi, const Options& _opt) const; + bool read_binary(std::istream& _in, BaseImporter& _bi, bool swap, const Options& _opt) const; + + float readToFloatValue(ValueType _type , std::fstream& _in) const; + + void readValue(ValueType _type , std::istream& _in, float& _value) const; + void readValue(ValueType _type , std::istream& _in, double& _value) const; + void readValue(ValueType _type , std::istream& _in, unsigned int& _value) const; + void readValue(ValueType _type , std::istream& _in, unsigned short& _value) const; + void readValue(ValueType _type , std::istream& _in, unsigned char& _value) const; + void readValue(ValueType _type , std::istream& _in, int& _value) const; + void readValue(ValueType _type , std::istream& _in, short& _value) const; + void readValue(ValueType _type , std::istream& _in, signed char& _value) const; + + void readInteger(ValueType _type, std::istream& _in, int& _value) const; + void readInteger(ValueType _type, std::istream& _in, unsigned int& _value) const; + + /// Read unsupported properties in PLY file + void consume_input(std::istream& _in, int _count) const { + _in.read(reinterpret_cast(&buff[0]), _count); + } + + mutable unsigned char buff[8]; + + /// Available per file options for reading + mutable Options options_; + + /// Options that the user wants to read + mutable Options userOptions_; + + mutable unsigned int vertexCount_; + mutable unsigned int faceCount_; + + mutable uint vertexDimension_; + + enum Property { + XCOORD,YCOORD,ZCOORD, + TEXX,TEXY, + COLORRED,COLORGREEN,COLORBLUE,COLORALPHA, + XNORM,YNORM,ZNORM, CUSTOM_PROP, VERTEX_INDICES, + UNSUPPORTED + }; + + /// Stores sizes of property types + mutable std::map scalar_size_; + + // Number of vertex properties + struct PropertyInfo + { + Property property; + ValueType value; + std::string name;//for custom properties + ValueType listIndexType;//if type is unsupported, the poerty is not a list. otherwise, it the index type + PropertyInfo():property(UNSUPPORTED),value(Unsupported),name(""),listIndexType(Unsupported){} + PropertyInfo(Property _p, ValueType _v):property(_p),value(_v),name(""),listIndexType(Unsupported){} + PropertyInfo(Property _p, ValueType _v, const std::string& _n):property(_p),value(_v),name(_n),listIndexType(Unsupported){} + }; + + enum Element { + VERTEX, + FACE, + UNKNOWN + }; + + // Information on the elements + struct ElementInfo + { + Element element_; + std::string name_; + unsigned int count_; + std::vector< PropertyInfo > properties_; + }; + + mutable std::vector< ElementInfo > elements_; + + template + inline void read(_PLYReader_::ValueType _type, std::istream& _in, T& _value, OpenMesh::GenProg::TrueType /*_binary*/) const + { + readValue(_type, _in, _value); + } + + template + inline void read(_PLYReader_::ValueType _type, std::istream& _in, T& _value, OpenMesh::GenProg::FalseType /*_binary*/) const + { + _in >> _value; + } + + //read and assign custom properties with the given type. Also creates property, if not exist + template + void readCreateCustomProperty(std::istream& _in, BaseImporter& _bi, Handle _h, const std::string& _propName, const ValueType _valueType, const ValueType _listType) const; + + template + void readCustomProperty(std::istream& _in, BaseImporter& _bi, Handle _h, const std::string& _propName, const _PLYReader_::ValueType _valueType, const _PLYReader_::ValueType _listIndexType) const; +}; + + +//== TYPE DEFINITION ========================================================== + + +/// Declare the single entity of the PLY reader +extern _PLYReader_ __PLYReaderInstance; +OPENMESHDLLEXPORT _PLYReader_& PLYReader(); + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/reader/STLReader.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/reader/STLReader.hh new file mode 100644 index 0000000..b642623 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/reader/STLReader.hh @@ -0,0 +1,151 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements an reader module for STL files +// +//============================================================================= + + +#ifndef __STLREADER_HH__ +#define __STLREADER_HH__ + + +//=== INCLUDES ================================================================ + + +#include +#include + +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { +namespace IO { + +//== FORWARDS ================================================================= + +class BaseImporter; + +//== IMPLEMENTATION =========================================================== + + +/** + Implementation of the STL format reader. This class is singleton'ed by + SingletonT to STLReader. +*/ +class OPENMESHDLLEXPORT _STLReader_ : public BaseReader +{ +public: + + // constructor + _STLReader_(); + + /// Destructor + virtual ~_STLReader_() {}; + + + std::string get_description() const + { return "Stereolithography Interface Format"; } + std::string get_extensions() const { return "stl stla stlb"; } + + bool read(const std::string& _filename, + BaseImporter& _bi, + Options& _opt); + + bool read(std::istream& _in, + BaseImporter& _bi, + Options& _opt); + + /** Set the threshold to be used for considering two point to be equal. + Can be used to merge small gaps */ + void set_epsilon(float _eps) { eps_=_eps; } + + /// Returns the threshold to be used for considering two point to be equal. + float epsilon() const { return eps_; } + + + +private: + + enum STL_Type { STLA, STLB, NONE }; + STL_Type check_stl_type(const std::string& _filename) const; + + bool read_stla(const std::string& _filename, BaseImporter& _bi, Options& _opt) const; + bool read_stla(std::istream& _in, BaseImporter& _bi, Options& _opt) const; + bool read_stlb(const std::string& _filename, BaseImporter& _bi, Options& _opt) const; + bool read_stlb(std::istream& _in, BaseImporter& _bi, Options& _opt) const; + + +private: + + float eps_; +}; + + +//== TYPE DEFINITION ========================================================== + + +/// Declare the single entity of the STL reader +extern _STLReader_ __STLReaderInstance; +OPENMESHDLLEXPORT _STLReader_& STLReader(); + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/writer/BaseWriter.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/writer/BaseWriter.hh new file mode 100644 index 0000000..3e1688f --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/writer/BaseWriter.hh @@ -0,0 +1,155 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements the baseclass for IOManager writer modules +// +//============================================================================= + + +#ifndef __BASEWRITER_HH__ +#define __BASEWRITER_HH__ + + +//=== INCLUDES ================================================================ + + +// STD C++ +#include +#include + +// OpenMesh +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { +namespace IO { + + +//=== IMPLEMENTATION ========================================================== + + +/** + Base class for all writer modules. The module should register itself at + the IOManager by calling the register_module function. +*/ +class OPENMESHDLLEXPORT BaseWriter +{ +public: + + typedef unsigned int Option; + + /// Destructor + virtual ~BaseWriter() {}; + + /// Return short description of the supported file format. + virtual std::string get_description() const = 0; + + /// Return file format's extension. + virtual std::string get_extensions() const = 0; + + /** \brief Returns true if writer can write _filename (checks extension). + * _filename can also provide an extension without a name for a file e.g. _filename == "om" checks, if the writer can write the "om" extension + * @param _filename complete name of a file or just the extension + * @result true, if writer can write data with the given extension + */ + virtual bool can_u_write(const std::string& _filename) const; + + /** Write to a file + * @param _filename write to file with the given filename + * @param _be BaseExporter, which specifies the data source + * @param _opt writing options + * @param _precision can be used to specify the precision of the floating point notation. + */ + virtual bool write(const std::string& _filename, + BaseExporter& _be, + Options _opt, + std::streamsize _precision = 6) const = 0; + + /** Write to a std::ostream + * @param _os write to std::ostream + * @param _be BaseExporter, which specifies the data source + * @param _opt writing options + * @param _precision can be used to specify the precision of the floating point notation. + */ + virtual bool write(std::ostream& _os, + BaseExporter& _be, + Options _opt, + std::streamsize _precision = 6) const = 0; + + /// Returns expected size of file if binary format is supported else 0. + virtual size_t binary_size(BaseExporter&, Options) const { return 0; } + + + +protected: + + bool check(BaseExporter& _be, Options _opt) const + { + return (_opt.check(Options::VertexNormal ) <= _be.has_vertex_normals()) + && (_opt.check(Options::VertexTexCoord)<= _be.has_vertex_texcoords()) + && (_opt.check(Options::VertexColor) <= _be.has_vertex_colors()) + && (_opt.check(Options::FaceNormal) <= _be.has_face_normals()) + && (_opt.check(Options::FaceColor) <= _be.has_face_colors()); + } +}; + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/writer/OBJWriter.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/writer/OBJWriter.hh new file mode 100644 index 0000000..6adc772 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/writer/OBJWriter.hh @@ -0,0 +1,136 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements an IOManager writer module for OBJ files +// +//============================================================================= + + +#ifndef __OBJWRITER_HH__ +#define __OBJWRITER_HH__ + + +//=== INCLUDES ================================================================ + + +#include +#include + +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { +namespace IO { + + +//=== IMPLEMENTATION ========================================================== + + +/** + This class defines the OBJ writer. This class is further singleton'ed + by SingletonT to OBJWriter. +*/ +class OPENMESHDLLEXPORT _OBJWriter_ : public BaseWriter +{ +public: + + _OBJWriter_(); + + /// Destructor + virtual ~_OBJWriter_() {}; + + std::string get_description() const { return "Alias/Wavefront"; } + std::string get_extensions() const { return "obj"; } + + bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const; + + bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const; + + size_t binary_size(BaseExporter&, Options) const { return 0; } + +private: + + mutable std::string path_; + mutable std::string objName_; + + mutable std::vector< OpenMesh::Vec3f > material_; + mutable std::vector< OpenMesh::Vec4f > materialA_; + + size_t getMaterial(OpenMesh::Vec3f _color) const; + + size_t getMaterial(OpenMesh::Vec4f _color) const; + + bool writeMaterial(std::ostream& _out, BaseExporter&, Options) const; + + +}; + + +//== TYPE DEFINITION ========================================================== + + +/// Declare the single entity of the OBJ writer +extern _OBJWriter_ __OBJWriterinstance; +OPENMESHDLLEXPORT _OBJWriter_& OBJWriter(); + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/writer/OFFWriter.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/writer/OFFWriter.hh new file mode 100644 index 0000000..b6f4e14 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/writer/OFFWriter.hh @@ -0,0 +1,138 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements a writer module for OFF files +// +//============================================================================= + + +#ifndef __OFFWRITER_HH__ +#define __OFFWRITER_HH__ + + +//=== INCLUDES ================================================================ + +#include +#include + +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { +namespace IO { + + +//=== IMPLEMENTATION ========================================================== + + +/** + Implementation of the OFF format writer. This class is singleton'ed by + SingletonT to OFFWriter. + + By passing Options to the write function you can manipulate the writing behavoir. + The following options can be set: + + Binary + VertexNormal + VertexColor + VertexTexCoord + FaceColor + ColorAlpha + +*/ +class OPENMESHDLLEXPORT _OFFWriter_ : public BaseWriter +{ +public: + + _OFFWriter_(); + + virtual ~_OFFWriter_() {}; + + std::string get_description() const { return "no description"; } + std::string get_extensions() const { return "off"; } + + bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const; + + bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const; + + size_t binary_size(BaseExporter& _be, Options _opt) const; + + +protected: + void writeValue(std::ostream& _out, int value) const; + void writeValue(std::ostream& _out, unsigned int value) const; + void writeValue(std::ostream& _out, float value) const; + + bool write_ascii(std::ostream& _in, BaseExporter&, Options) const; + bool write_binary(std::ostream& _in, BaseExporter&, Options) const; +}; + + +//== TYPE DEFINITION ========================================================== + + +/// Declare the single entity of the OFF writer. +extern _OFFWriter_ __OFFWriterInstance; +OPENMESHDLLEXPORT _OFFWriter_& OFFWriter(); + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/writer/OMWriter.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/writer/OMWriter.hh new file mode 100644 index 0000000..efc48a8 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/writer/OMWriter.hh @@ -0,0 +1,147 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements a writer module for OM files +// +//============================================================================= + + +#ifndef __OMWRITER_HH__ +#define __OMWRITER_HH__ + + +//=== INCLUDES ================================================================ + + +// STD C++ +#include +#include + +// OpenMesh +#include +#include +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { +namespace IO { + +//=== FORWARDS ================================================================ + + +class BaseExporter; + + +//=== IMPLEMENTATION ========================================================== + + +/** + * Implementation of the OM format writer. This class is singleton'ed by + * SingletonT to OMWriter. + */ +class OPENMESHDLLEXPORT _OMWriter_ : public BaseWriter +{ +public: + + /// Constructor + _OMWriter_(); + + /// Destructor + virtual ~_OMWriter_() {}; + + std::string get_description() const + { return "OpenMesh Format"; } + + std::string get_extensions() const + { return "om"; } + + bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const; + + + + size_t binary_size(BaseExporter& _be, Options _opt) const; + + +protected: + + static const OMFormat::uchar magic_[3]; + static const OMFormat::uint8 version_; + + bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const; + + bool write_binary(std::ostream&, BaseExporter&, Options) const; + + + size_t store_binary_custom_chunk( std::ostream&, const BaseProperty&, + OMFormat::Chunk::Entity, bool) const; +}; + + +//== TYPE DEFINITION ========================================================== + + +/// Declare the single entity of the OM writer. +extern _OMWriter_ __OMWriterInstance; +OPENMESHDLLEXPORT _OMWriter_& OMWriter(); + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/writer/PLYWriter.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/writer/PLYWriter.hh new file mode 100644 index 0000000..65addb6 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/writer/PLYWriter.hh @@ -0,0 +1,177 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements a writer module for PLY files +// +//============================================================================= + + +#ifndef __PLYWRITER_HH__ +#define __PLYWRITER_HH__ + + +//=== INCLUDES ================================================================ + +#include +#include +#include + +#include +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { +namespace IO { + + +//=== IMPLEMENTATION ========================================================== + + +/** + Implementation of the PLY format writer. This class is singleton'ed by + SingletonT to PLYWriter. + + currently supported options: + - VertexColors + - Binary + - Binary -> MSB +*/ +class OPENMESHDLLEXPORT _PLYWriter_ : public BaseWriter +{ +public: + + _PLYWriter_(); + + /// Destructor + virtual ~_PLYWriter_() {}; + + std::string get_description() const { return "PLY polygon file format"; } + std::string get_extensions() const { return "ply"; } + + bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const; + + bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const; + + size_t binary_size(BaseExporter& _be, Options _opt) const; + + enum ValueType { + Unsupported = 0, + ValueTypeFLOAT32, ValueTypeFLOAT, + ValueTypeINT32, ValueTypeINT , ValueTypeUINT, + ValueTypeUCHAR, ValueTypeCHAR, ValueTypeUINT8, + ValueTypeUSHORT, ValueTypeSHORT, + ValueTypeDOUBLE + }; + +private: + mutable Options options_; + + struct CustomProperty + { + ValueType type; + const BaseProperty* property; + CustomProperty(const BaseProperty* const _p):type(Unsupported),property(_p){} + }; + + const char* nameOfType_[12]; + + /// write custom persistant properties into the header for the current element, returns all properties, which were written sorted + std::vector writeCustomTypeHeader(std::ostream& _out, BaseKernel::const_prop_iterator _begin, BaseKernel::const_prop_iterator _end) const; + template + void write_customProp(std::ostream& _our, const CustomProperty& _prop, size_t _index) const; + template + void writeProxy(ValueType _type, std::ostream& _out, T _value, OpenMesh::GenProg::TrueType /*_binary*/) const + { + writeValue(_type, _out, _value); + } + template + void writeProxy(ValueType _type, std::ostream& _out, T _value, OpenMesh::GenProg::FalseType /*_binary*/) const + { + _out << " " << _value; + } + +protected: + void writeValue(ValueType _type, std::ostream& _out, signed char value) const; + void writeValue(ValueType _type, std::ostream& _out, unsigned char value) const; + void writeValue(ValueType _type, std::ostream& _out, short value) const; + void writeValue(ValueType _type, std::ostream& _out, unsigned short value) const; + void writeValue(ValueType _type, std::ostream& _out, int value) const; + void writeValue(ValueType _type, std::ostream& _out, unsigned int value) const; + void writeValue(ValueType _type, std::ostream& _out, float value) const; + void writeValue(ValueType _type, std::ostream& _out, double value) const; + + bool write_ascii(std::ostream& _out, BaseExporter&, Options) const; + bool write_binary(std::ostream& _out, BaseExporter&, Options) const; + /// write header into the stream _out. Returns custom properties (vertex and face) which are written into the header + void write_header(std::ostream& _out, BaseExporter& _be, Options& _opt, std::vector& _ovProps, std::vector& _ofProps) const; +}; + + +//== TYPE DEFINITION ========================================================== + + +/// Declare the single entity of the PLY writer. +extern _PLYWriter_ __PLYWriterInstance; +OPENMESHDLLEXPORT _PLYWriter_& PLYWriter(); + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/writer/STLWriter.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/writer/STLWriter.hh new file mode 100644 index 0000000..92a0113 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/writer/STLWriter.hh @@ -0,0 +1,126 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements a writer module for STL ascii files +// +//============================================================================= +// $Id: STLWriter.hh,v 1.2 2007-05-18 15:17:43 habbecke Exp $ + +#ifndef __STLWRITER_HH__ +#define __STLWRITER_HH__ + + +//=== INCLUDES ================================================================ + +// -------------------- STL +#include +#include +// -------------------- OpenMesh +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { +namespace IO { + + +//=== IMPLEMENTATION ========================================================== + + +/** + Implementation of the STL format writer. This class is singleton'ed by + SingletonT to STLWriter. +*/ +class OPENMESHDLLEXPORT _STLWriter_ : public BaseWriter +{ +public: + + _STLWriter_(); + + /// Destructor + virtual ~_STLWriter_() {}; + + std::string get_description() const { return "Stereolithography Format"; } + std::string get_extensions() const { return "stl stla stlb"; } + + bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const; + + bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const; + + size_t binary_size(BaseExporter&, Options) const; + +private: + bool write_stla(const std::string&, BaseExporter&, Options) const; + bool write_stla(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const; + bool write_stlb(const std::string&, BaseExporter&, Options) const; + bool write_stlb(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const; +}; + + +//== TYPE DEFINITION ========================================================== + + +// Declare the single entity of STL writer. +extern _STLWriter_ __STLWriterInstance; +OPENMESHDLLEXPORT _STLWriter_& STLWriter(); + + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/IO/writer/VTKWriter.hh b/libs/OpenMesh/include/OpenMesh/Core/IO/writer/VTKWriter.hh new file mode 100644 index 0000000..40d9e11 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/IO/writer/VTKWriter.hh @@ -0,0 +1,52 @@ +//============================================================================= +// +// Implements an IOManager writer module for VTK files +// +//============================================================================= + +#ifndef __VTKWRITER_HH__ +#define __VTKWRITER_HH__ + +//=== INCLUDES ================================================================ + +#include +#include + +#include +#include +#include +#include + +//== NAMESPACES =============================================================== + +namespace OpenMesh { +namespace IO { + +//=== IMPLEMENTATION ========================================================== + +class OPENMESHDLLEXPORT _VTKWriter_ : public BaseWriter +{ +public: + _VTKWriter_(); + + std::string get_description() const { return "VTK"; } + std::string get_extensions() const { return "vtk"; } + + bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const; + bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const; + + size_t binary_size(BaseExporter&, Options) const { return 0; } +}; + +//== TYPE DEFINITION ========================================================== + +/// Declare the single entity of the OBJ writer +extern _VTKWriter_ __VTKWriterinstance; +OPENMESHDLLEXPORT _VTKWriter_& VTKWriter(); + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/ArrayItems.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/ArrayItems.hh new file mode 100644 index 0000000..c49944b --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/ArrayItems.hh @@ -0,0 +1,130 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef OPENMESH_ARRAY_ITEMS_HH +#define OPENMESH_ARRAY_ITEMS_HH + + +//== INCLUDES ================================================================= + + +#include +#include +#include + + +//== NAMESPACES =============================================================== + +namespace OpenMesh { + + +//== CLASS DEFINITION ========================================================= + + +/// Definition of mesh items for use in the ArrayKernel +struct ArrayItems +{ + + //------------------------------------------------------ internal vertex type + + /// The vertex item + class Vertex + { + friend class ArrayKernel; + HalfedgeHandle halfedge_handle_; + }; + + + //---------------------------------------------------- internal halfedge type + +#ifndef DOXY_IGNORE_THIS + class Halfedge_without_prev + { + friend class ArrayKernel; + FaceHandle face_handle_; + VertexHandle vertex_handle_; + HalfedgeHandle next_halfedge_handle_; + }; +#endif + +#ifndef DOXY_IGNORE_THIS + class Halfedge_with_prev : public Halfedge_without_prev + { + friend class ArrayKernel; + HalfedgeHandle prev_halfedge_handle_; + }; +#endif + + //TODO: should be selected with config.h define + typedef Halfedge_with_prev Halfedge; + typedef GenProg::Bool2Type HasPrevHalfedge; + + //-------------------------------------------------------- internal edge type +#ifndef DOXY_IGNORE_THIS + class Edge + { + friend class ArrayKernel; + Halfedge halfedges_[2]; + }; +#endif + + //-------------------------------------------------------- internal face type +#ifndef DOXY_IGNORE_THIS + class Face + { + friend class ArrayKernel; + HalfedgeHandle halfedge_handle_; + }; +}; +#endif + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_ITEMS_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/ArrayKernel.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/ArrayKernel.hh new file mode 100644 index 0000000..ccf2748 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/ArrayKernel.hh @@ -0,0 +1,915 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// CLASS ArrayKernel +// +//============================================================================= + + +#ifndef OPENMESH_ARRAY_KERNEL_HH +#define OPENMESH_ARRAY_KERNEL_HH + + +//== INCLUDES ================================================================= +#include + +#include +#include + +#include +#include +#include + +//== NAMESPACES =============================================================== +namespace OpenMesh { + + +//== CLASS DEFINITION ========================================================= +/** \ingroup mesh_kernels_group + + Mesh kernel using arrays for mesh item storage. + + This mesh kernel uses the std::vector as container to store the + mesh items. Therefore all handle types are internally represented + by integers. To get the index from a handle use the handle's \c + idx() method. + + \note For a description of the minimal kernel interface see + OpenMesh::Mesh::BaseKernel. + \note You do not have to use this class directly, use the predefined + mesh-kernel combinations in \ref mesh_types_group. + \see OpenMesh::Concepts::KernelT, \ref mesh_type +*/ + +class OPENMESHDLLEXPORT ArrayKernel : public BaseKernel, public ArrayItems +{ +public: + + // handles + typedef OpenMesh::VertexHandle VertexHandle; + typedef OpenMesh::HalfedgeHandle HalfedgeHandle; + typedef OpenMesh::EdgeHandle EdgeHandle; + typedef OpenMesh::FaceHandle FaceHandle; + typedef Attributes::StatusInfo StatusInfo; + typedef VPropHandleT VertexStatusPropertyHandle; + typedef HPropHandleT HalfedgeStatusPropertyHandle; + typedef EPropHandleT EdgeStatusPropertyHandle; + typedef FPropHandleT FaceStatusPropertyHandle; + +public: + + // --- constructor/destructor --- + ArrayKernel(); + virtual ~ArrayKernel(); + + /** ArrayKernel uses the default copy constructor and assignment operator, which means + that the connectivity and all properties are copied, including reference + counters, allocated bit status masks, etc.. In contrast assign_connectivity + copies only the connectivity, i.e. vertices, edges, faces and their status fields. + NOTE: The geometry (the points property) is NOT copied. Poly/TriConnectivity + override(and hide) that function to provide connectivity consistence.*/ + void assign_connectivity(const ArrayKernel& _other); + + // --- handle -> item --- + VertexHandle handle(const Vertex& _v) const; + + HalfedgeHandle handle(const Halfedge& _he) const; + + EdgeHandle handle(const Edge& _e) const; + + FaceHandle handle(const Face& _f) const; + + + ///checks handle validity - useful for debugging + bool is_valid_handle(VertexHandle _vh) const; + + ///checks handle validity - useful for debugging + bool is_valid_handle(HalfedgeHandle _heh) const; + + ///checks handle validity - useful for debugging + bool is_valid_handle(EdgeHandle _eh) const; + + ///checks handle validity - useful for debugging + bool is_valid_handle(FaceHandle _fh) const; + + + // --- item -> handle --- + const Vertex& vertex(VertexHandle _vh) const + { + assert(is_valid_handle(_vh)); + return vertices_[_vh.idx()]; + } + + Vertex& vertex(VertexHandle _vh) + { + assert(is_valid_handle(_vh)); + return vertices_[_vh.idx()]; + } + + const Halfedge& halfedge(HalfedgeHandle _heh) const + { + assert(is_valid_handle(_heh)); + return edges_[_heh.idx() >> 1].halfedges_[_heh.idx() & 1]; + } + + Halfedge& halfedge(HalfedgeHandle _heh) + { + assert(is_valid_handle(_heh)); + return edges_[_heh.idx() >> 1].halfedges_[_heh.idx() & 1]; + } + + const Edge& edge(EdgeHandle _eh) const + { + assert(is_valid_handle(_eh)); + return edges_[_eh.idx()]; + } + + Edge& edge(EdgeHandle _eh) + { + assert(is_valid_handle(_eh)); + return edges_[_eh.idx()]; + } + + const Face& face(FaceHandle _fh) const + { + assert(is_valid_handle(_fh)); + return faces_[_fh.idx()]; + } + + Face& face(FaceHandle _fh) + { + assert(is_valid_handle(_fh)); + return faces_[_fh.idx()]; + } + + // --- get i'th items --- + + VertexHandle vertex_handle(unsigned int _i) const + { return (_i < n_vertices()) ? handle( vertices_[_i] ) : VertexHandle(); } + + HalfedgeHandle halfedge_handle(unsigned int _i) const + { + return (_i < n_halfedges()) ? + halfedge_handle(edge_handle(_i/2), _i%2) : HalfedgeHandle(); + } + + EdgeHandle edge_handle(unsigned int _i) const + { return (_i < n_edges()) ? handle(edges_[_i]) : EdgeHandle(); } + + FaceHandle face_handle(unsigned int _i) const + { return (_i < n_faces()) ? handle(faces_[_i]) : FaceHandle(); } + +public: + + /** + * \brief Add a new vertex. + * + * If you are rebuilding a mesh that you previously erased using clean() or + * clean_keep_reservation() you probably want to use new_vertex_dirty() + * instead. + * + * \sa new_vertex_dirty() + */ + inline VertexHandle new_vertex() + { + vertices_.push_back(Vertex()); + vprops_resize(n_vertices());//TODO:should it be push_back()? + + return handle(vertices_.back()); + } + + /** + * Same as new_vertex() but uses PropertyContainer::resize_if_smaller() to + * resize the vertex property container. + * + * If you are rebuilding a mesh that you erased with clean() or + * clean_keep_reservation() using this method instead of new_vertex() saves + * reallocation and reinitialization of property memory. + * + * \sa new_vertex() + */ + inline VertexHandle new_vertex_dirty() + { + vertices_.push_back(Vertex()); + vprops_resize_if_smaller(n_vertices());//TODO:should it be push_back()? + + return handle(vertices_.back()); + } + + inline HalfedgeHandle new_edge(VertexHandle _start_vh, VertexHandle _end_vh) + { +// assert(_start_vh != _end_vh); + edges_.push_back(Edge()); + eprops_resize(n_edges());//TODO:should it be push_back()? + hprops_resize(n_halfedges());//TODO:should it be push_back()? + + EdgeHandle eh(handle(edges_.back())); + HalfedgeHandle heh0(halfedge_handle(eh, 0)); + HalfedgeHandle heh1(halfedge_handle(eh, 1)); + set_vertex_handle(heh0, _end_vh); + set_vertex_handle(heh1, _start_vh); + return heh0; + } + + inline FaceHandle new_face() + { + faces_.push_back(Face()); + fprops_resize(n_faces()); + return handle(faces_.back()); + } + + inline FaceHandle new_face(const Face& _f) + { + faces_.push_back(_f); + fprops_resize(n_faces()); + return handle(faces_.back()); + } + +public: + // --- resize/reserve --- + void resize( size_t _n_vertices, size_t _n_edges, size_t _n_faces ); + void reserve(size_t _n_vertices, size_t _n_edges, size_t _n_faces ); + + // --- deletion --- + /** \brief garbage collection + * + * Usually if you delete primitives in OpenMesh, they are only flagged as deleted. + * Only when you call garbage collection, they will be actually removed. + * + * \note Garbage collection invalidates all handles. If you need to keep track of + * a set of handles, you can pass them to the second garbage collection + * function, which will update a vector of handles. + * See also \ref deletedElements. + * + * @param _v Remove deleted vertices? + * @param _e Remove deleted edges? + * @param _f Remove deleted faces? + * + */ + void garbage_collection(bool _v=true, bool _e=true, bool _f=true); + + /** \brief garbage collection with handle tracking + * + * Usually if you delete primitives in OpenMesh, they are only flagged as deleted. + * Only when you call garbage collection, they will be actually removed. + * + * \note Garbage collection invalidates all handles. If you need to keep track of + * a set of handles, you can pass them to this function. The handles that the + * given pointers point to are updated in place. + * See also \ref deletedElements. + * + * @param vh_to_update Pointers to vertex handles that should get updated + * @param hh_to_update Pointers to halfedge handles that should get updated + * @param fh_to_update Pointers to face handles that should get updated + * @param _v Remove deleted vertices? + * @param _e Remove deleted edges? + * @param _f Remove deleted faces? + */ + template + void garbage_collection(std_API_Container_VHandlePointer& vh_to_update, + std_API_Container_HHandlePointer& hh_to_update, + std_API_Container_FHandlePointer& fh_to_update, + bool _v=true, bool _e=true, bool _f=true); + + /// \brief Does the same as clean() and in addition erases all properties. + void clear(); + + /** \brief Remove all vertices, edges and faces and deallocates their memory. + * + * In contrast to clear() this method does neither erases the properties + * nor clears the property vectors. Depending on how you add any new entities + * to the mesh after calling this method, your properties will be initialized + * with old values. + * + * \sa clean_keep_reservation() + */ + void clean(); + + /** \brief Remove all vertices, edges and faces but keep memory allocated. + * + * This method behaves like clean() (also regarding the properties) but + * leaves the memory used for vertex, edge and face storage allocated. This + * leads to no reduction in memory consumption but allows for faster + * performance when rebuilding the mesh. + */ + void clean_keep_reservation(); + + // --- number of items --- + size_t n_vertices() const { return vertices_.size(); } + size_t n_halfedges() const { return 2*edges_.size(); } + size_t n_edges() const { return edges_.size(); } + size_t n_faces() const { return faces_.size(); } + + bool vertices_empty() const { return vertices_.empty(); } + bool halfedges_empty() const { return edges_.empty(); } + bool edges_empty() const { return edges_.empty(); } + bool faces_empty() const { return faces_.empty(); } + + // --- vertex connectivity --- + + HalfedgeHandle halfedge_handle(VertexHandle _vh) const + { return vertex(_vh).halfedge_handle_; } + + void set_halfedge_handle(VertexHandle _vh, HalfedgeHandle _heh) + { +// assert(is_valid_handle(_heh)); + vertex(_vh).halfedge_handle_ = _heh; + } + + bool is_isolated(VertexHandle _vh) const + { return !halfedge_handle(_vh).is_valid(); } + + void set_isolated(VertexHandle _vh) + { vertex(_vh).halfedge_handle_.invalidate(); } + + unsigned int delete_isolated_vertices(); + + // --- halfedge connectivity --- + VertexHandle to_vertex_handle(HalfedgeHandle _heh) const + { return halfedge(_heh).vertex_handle_; } + + VertexHandle from_vertex_handle(HalfedgeHandle _heh) const + { return to_vertex_handle(opposite_halfedge_handle(_heh)); } + + void set_vertex_handle(HalfedgeHandle _heh, VertexHandle _vh) + { +// assert(is_valid_handle(_vh)); + halfedge(_heh).vertex_handle_ = _vh; + } + + FaceHandle face_handle(HalfedgeHandle _heh) const + { return halfedge(_heh).face_handle_; } + + void set_face_handle(HalfedgeHandle _heh, FaceHandle _fh) + { +// assert(is_valid_handle(_fh)); + halfedge(_heh).face_handle_ = _fh; + } + + void set_boundary(HalfedgeHandle _heh) + { halfedge(_heh).face_handle_.invalidate(); } + + /// Is halfedge _heh a boundary halfedge (is its face handle invalid) ? + bool is_boundary(HalfedgeHandle _heh) const + { return !face_handle(_heh).is_valid(); } + + HalfedgeHandle next_halfedge_handle(HalfedgeHandle _heh) const + { return halfedge(_heh).next_halfedge_handle_; } + + void set_next_halfedge_handle(HalfedgeHandle _heh, HalfedgeHandle _nheh) + { + assert(is_valid_handle(_nheh)); +// assert(to_vertex_handle(_heh) == from_vertex_handle(_nheh)); + halfedge(_heh).next_halfedge_handle_ = _nheh; + set_prev_halfedge_handle(_nheh, _heh); + } + + + void set_prev_halfedge_handle(HalfedgeHandle _heh, HalfedgeHandle _pheh) + { + assert(is_valid_handle(_pheh)); + set_prev_halfedge_handle(_heh, _pheh, HasPrevHalfedge()); + } + + void set_prev_halfedge_handle(HalfedgeHandle _heh, HalfedgeHandle _pheh, + GenProg::TrueType) + { halfedge(_heh).prev_halfedge_handle_ = _pheh; } + + void set_prev_halfedge_handle(HalfedgeHandle /* _heh */, HalfedgeHandle /* _pheh */, + GenProg::FalseType) + {} + + HalfedgeHandle prev_halfedge_handle(HalfedgeHandle _heh) const + { return prev_halfedge_handle(_heh, HasPrevHalfedge() ); } + + HalfedgeHandle prev_halfedge_handle(HalfedgeHandle _heh, GenProg::TrueType) const + { return halfedge(_heh).prev_halfedge_handle_; } + + HalfedgeHandle prev_halfedge_handle(HalfedgeHandle _heh, GenProg::FalseType) const + { + if (is_boundary(_heh)) + {//iterating around the vertex should be faster than iterating the boundary + HalfedgeHandle curr_heh(opposite_halfedge_handle(_heh)); + HalfedgeHandle next_heh(next_halfedge_handle(curr_heh)); + do + { + curr_heh = opposite_halfedge_handle(next_heh); + next_heh = next_halfedge_handle(curr_heh); + } + while (next_heh != _heh); + return curr_heh; + } + else + { + HalfedgeHandle heh(_heh); + HalfedgeHandle next_heh(next_halfedge_handle(heh)); + while (next_heh != _heh) { + heh = next_heh; + next_heh = next_halfedge_handle(next_heh); + } + return heh; + } + } + + + HalfedgeHandle opposite_halfedge_handle(HalfedgeHandle _heh) const + { return HalfedgeHandle(_heh.idx() ^ 1); } + + + HalfedgeHandle ccw_rotated_halfedge_handle(HalfedgeHandle _heh) const + { return opposite_halfedge_handle(prev_halfedge_handle(_heh)); } + + + HalfedgeHandle cw_rotated_halfedge_handle(HalfedgeHandle _heh) const + { return next_halfedge_handle(opposite_halfedge_handle(_heh)); } + + // --- edge connectivity --- + static HalfedgeHandle s_halfedge_handle(EdgeHandle _eh, unsigned int _i) + { + assert(_i<=1); + return HalfedgeHandle((_eh.idx() << 1) + _i); + } + + static EdgeHandle s_edge_handle(HalfedgeHandle _heh) + { return EdgeHandle(_heh.idx() >> 1); } + + HalfedgeHandle halfedge_handle(EdgeHandle _eh, unsigned int _i) const + { + return s_halfedge_handle(_eh, _i); + } + + EdgeHandle edge_handle(HalfedgeHandle _heh) const + { return s_edge_handle(_heh); } + + // --- face connectivity --- + HalfedgeHandle halfedge_handle(FaceHandle _fh) const + { return face(_fh).halfedge_handle_; } + + void set_halfedge_handle(FaceHandle _fh, HalfedgeHandle _heh) + { +// assert(is_valid_handle(_heh)); + face(_fh).halfedge_handle_ = _heh; + } + + /// Status Query API + //------------------------------------------------------------ vertex status + const StatusInfo& status(VertexHandle _vh) const + { return property(vertex_status_, _vh); } + + StatusInfo& status(VertexHandle _vh) + { return property(vertex_status_, _vh); } + + /** + * Reinitializes the status of all vertices using the StatusInfo default + * constructor, i.e. all flags will be set to false. + */ + void reset_status() { + PropertyT &status_prop = property(vertex_status_); + PropertyT::vector_type &sprop_v = status_prop.data_vector(); + std::fill(sprop_v.begin(), sprop_v.begin() + n_vertices(), StatusInfo()); + } + + //----------------------------------------------------------- halfedge status + const StatusInfo& status(HalfedgeHandle _hh) const + { return property(halfedge_status_, _hh); } + + StatusInfo& status(HalfedgeHandle _hh) + { return property(halfedge_status_, _hh); } + + //--------------------------------------------------------------- edge status + const StatusInfo& status(EdgeHandle _eh) const + { return property(edge_status_, _eh); } + + StatusInfo& status(EdgeHandle _eh) + { return property(edge_status_, _eh); } + + //--------------------------------------------------------------- face status + const StatusInfo& status(FaceHandle _fh) const + { return property(face_status_, _fh); } + + StatusInfo& status(FaceHandle _fh) + { return property(face_status_, _fh); } + + inline bool has_vertex_status() const + { return vertex_status_.is_valid(); } + + inline bool has_halfedge_status() const + { return halfedge_status_.is_valid(); } + + inline bool has_edge_status() const + { return edge_status_.is_valid(); } + + inline bool has_face_status() const + { return face_status_.is_valid(); } + + inline VertexStatusPropertyHandle vertex_status_pph() const + { return vertex_status_; } + + inline HalfedgeStatusPropertyHandle halfedge_status_pph() const + { return halfedge_status_; } + + inline EdgeStatusPropertyHandle edge_status_pph() const + { return edge_status_; } + + inline FaceStatusPropertyHandle face_status_pph() const + { return face_status_; } + + /// status property by handle + inline VertexStatusPropertyHandle status_pph(VertexHandle /*_hnd*/) const + { return vertex_status_pph(); } + + inline HalfedgeStatusPropertyHandle status_pph(HalfedgeHandle /*_hnd*/) const + { return halfedge_status_pph(); } + + inline EdgeStatusPropertyHandle status_pph(EdgeHandle /*_hnd*/) const + { return edge_status_pph(); } + + inline FaceStatusPropertyHandle status_pph(FaceHandle /*_hnd*/) const + { return face_status_pph(); } + + /// Status Request API + void request_vertex_status() + { + if (!refcount_vstatus_++) + add_property( vertex_status_, "v:status" ); + } + + void request_halfedge_status() + { + if (!refcount_hstatus_++) + add_property( halfedge_status_, "h:status" ); + } + + void request_edge_status() + { + if (!refcount_estatus_++) + add_property( edge_status_, "e:status" ); + } + + void request_face_status() + { + if (!refcount_fstatus_++) + add_property( face_status_, "f:status" ); + } + + /// Status Release API + void release_vertex_status() + { + if ((refcount_vstatus_ > 0) && (! --refcount_vstatus_)) + remove_property(vertex_status_); + } + + void release_halfedge_status() + { + if ((refcount_hstatus_ > 0) && (! --refcount_hstatus_)) + remove_property(halfedge_status_); + } + + void release_edge_status() + { + if ((refcount_estatus_ > 0) && (! --refcount_estatus_)) + remove_property(edge_status_); + } + + void release_face_status() + { + if ((refcount_fstatus_ > 0) && (! --refcount_fstatus_)) + remove_property(face_status_); + } + + /// --- StatusSet API --- + + /*! + Implements a set of connectivity entities (vertex, edge, face, halfedge) + using the available bits in the corresponding mesh status field. + + Status-based sets are much faster than std::set<> and equivalent + in performance to std::vector, but much more convenient. + */ + template + class StatusSetT + { + public: + typedef HandleT Handle; + + protected: + ArrayKernel& kernel_; + + public: + const unsigned int bit_mask_; + + public: + StatusSetT(ArrayKernel& _kernel, const unsigned int _bit_mask) + : kernel_(_kernel), bit_mask_(_bit_mask) + {} + + ~StatusSetT() + {} + + inline bool is_in(Handle _hnd) const + { return kernel_.status(_hnd).is_bit_set(bit_mask_); } + + inline void insert(Handle _hnd) + { kernel_.status(_hnd).set_bit(bit_mask_); } + + inline void erase(Handle _hnd) + { kernel_.status(_hnd).unset_bit(bit_mask_); } + + //! Note: 0(n) complexity + size_t size() const + { + const int n = kernel_.status_pph(Handle()).is_valid() ? + (int)kernel_.property(kernel_.status_pph(Handle())).n_elements() : 0; + + size_t sz = 0; + for (int i = 0; i < n; ++i) + sz += (size_t)is_in(Handle(i)); + return sz; + } + + //! Note: O(n) complexity + void clear() + { + const int n = kernel_.status_pph(Handle()).is_valid() ? + (int)kernel_.property(kernel_.status_pph(Handle())).n_elements() : 0; + + for (int i = 0; i < n; ++i) + erase(Handle(i)); + } + }; + + friend class StatusSetT; + friend class StatusSetT; + friend class StatusSetT; + friend class StatusSetT; + + //! AutoStatusSetT: A status set that automatically picks a status bit + template + class AutoStatusSetT : public StatusSetT + { + private: + typedef HandleT Handle; + typedef StatusSetT Base; + + public: + AutoStatusSetT(ArrayKernel& _kernel) + : StatusSetT(_kernel, _kernel.pop_bit_mask(Handle())) + { /*assert(size() == 0);*/ } //the set should be empty on creation + + ~AutoStatusSetT() + { + //assert(size() == 0);//the set should be empty on leave? + Base::kernel_.push_bit_mask(Handle(), Base::bit_mask_); + } + }; + + friend class AutoStatusSetT; + friend class AutoStatusSetT; + friend class AutoStatusSetT; + friend class AutoStatusSetT; + + typedef AutoStatusSetT VertexStatusSet; + typedef AutoStatusSetT EdgeStatusSet; + typedef AutoStatusSetT FaceStatusSet; + typedef AutoStatusSetT HalfedgeStatusSet; + + //! ExtStatusSet: A status set augmented with an array + template + class ExtStatusSetT : public AutoStatusSetT + { + public: + typedef HandleT Handle; + typedef AutoStatusSetT Base; + + protected: + typedef std::vector HandleContainer; + HandleContainer handles_; + + public: + typedef typename HandleContainer::iterator + iterator; + typedef typename HandleContainer::const_iterator + const_iterator; + public: + ExtStatusSetT(ArrayKernel& _kernel, size_t _capacity_hint = 0) + : Base(_kernel) + { handles_.reserve(_capacity_hint); } + + ~ExtStatusSetT() + { clear(); } + + // Complexity: O(1) + inline void insert(Handle _hnd) + { + if (!is_in(_hnd)) + { + Base::insert(_hnd); + handles_.push_back(_hnd); + } + } + + //! Complexity: O(k), (k - number of the elements in the set) + inline void erase(Handle _hnd) + { + if (is_in(_hnd)) + { + iterator it = std::find(begin(), end(), _hnd); + erase(it); + } + } + + //! Complexity: O(1) + inline void erase(iterator _it) + { + assert(_it != end() && is_in(*_it)); + Base::erase(*_it); + *_it = handles_.back(); + _it.pop_back(); + } + + inline void clear() + { + for (iterator it = begin(); it != end(); ++it) + { + assert(is_in(*it)); + Base::erase(*it); + } + handles_.clear(); + } + + /// Complexity: 0(1) + inline unsigned int size() const + { return handles_.size(); } + inline bool empty() const + { return handles_.empty(); } + + //Vector API + inline iterator begin() + { return handles_.begin(); } + inline const_iterator begin() const + { return handles_.begin(); } + + inline iterator end() + { return handles_.end(); } + inline const_iterator end() const + { return handles_.end(); } + + inline Handle& front() + { return handles_.front(); } + inline const Handle& front() const + { return handles_.front(); } + + inline Handle& back() + { return handles_.back(); } + inline const Handle& back() const + { return handles_.back(); } + }; + + typedef ExtStatusSetT ExtFaceStatusSet; + typedef ExtStatusSetT ExtVertexStatusSet; + typedef ExtStatusSetT ExtEdgeStatusSet; + typedef ExtStatusSetT ExtHalfedgeStatusSet; + +private: + // iterators + typedef std::vector VertexContainer; + typedef std::vector EdgeContainer; + typedef std::vector FaceContainer; + typedef VertexContainer::iterator KernelVertexIter; + typedef VertexContainer::const_iterator KernelConstVertexIter; + typedef EdgeContainer::iterator KernelEdgeIter; + typedef EdgeContainer::const_iterator KernelConstEdgeIter; + typedef FaceContainer::iterator KernelFaceIter; + typedef FaceContainer::const_iterator KernelConstFaceIter; + typedef std::vector BitMaskContainer; + + + KernelVertexIter vertices_begin() { return vertices_.begin(); } + KernelConstVertexIter vertices_begin() const { return vertices_.begin(); } + KernelVertexIter vertices_end() { return vertices_.end(); } + KernelConstVertexIter vertices_end() const { return vertices_.end(); } + + KernelEdgeIter edges_begin() { return edges_.begin(); } + KernelConstEdgeIter edges_begin() const { return edges_.begin(); } + KernelEdgeIter edges_end() { return edges_.end(); } + KernelConstEdgeIter edges_end() const { return edges_.end(); } + + KernelFaceIter faces_begin() { return faces_.begin(); } + KernelConstFaceIter faces_begin() const { return faces_.begin(); } + KernelFaceIter faces_end() { return faces_.end(); } + KernelConstFaceIter faces_end() const { return faces_.end(); } + + /// bit mask container by handle + inline BitMaskContainer& bit_masks(VertexHandle /*_dummy_hnd*/) + { return vertex_bit_masks_; } + inline BitMaskContainer& bit_masks(EdgeHandle /*_dummy_hnd*/) + { return edge_bit_masks_; } + inline BitMaskContainer& bit_masks(FaceHandle /*_dummy_hnd*/) + { return face_bit_masks_; } + inline BitMaskContainer& bit_masks(HalfedgeHandle /*_dummy_hnd*/) + { return halfedge_bit_masks_; } + + template + unsigned int pop_bit_mask(Handle _hnd) + { + assert(!bit_masks(_hnd).empty());//check if the client request too many status sets + unsigned int bit_mask = bit_masks(_hnd).back(); + bit_masks(_hnd).pop_back(); + return bit_mask; + } + + template + void push_bit_mask(Handle _hnd, unsigned int _bit_mask) + { + assert(std::find(bit_masks(_hnd).begin(), bit_masks(_hnd).end(), _bit_mask) == + bit_masks(_hnd).end());//this mask should be not already used + bit_masks(_hnd).push_back(_bit_mask); + } + + void init_bit_masks(BitMaskContainer& _bmc); + void init_bit_masks(); + +protected: + + VertexStatusPropertyHandle vertex_status_; + HalfedgeStatusPropertyHandle halfedge_status_; + EdgeStatusPropertyHandle edge_status_; + FaceStatusPropertyHandle face_status_; + + unsigned int refcount_vstatus_; + unsigned int refcount_hstatus_; + unsigned int refcount_estatus_; + unsigned int refcount_fstatus_; + +private: + VertexContainer vertices_; + EdgeContainer edges_; + FaceContainer faces_; + + BitMaskContainer halfedge_bit_masks_; + BitMaskContainer edge_bit_masks_; + BitMaskContainer vertex_bit_masks_; + BitMaskContainer face_bit_masks_; +}; + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_ARRAY_KERNEL_C) +# define OPENMESH_ARRAY_KERNEL_TEMPLATES +# include "ArrayKernelT.cc" +#endif +//============================================================================= +#endif // OPENMESH_ARRAY_KERNEL_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/AttribKernelT.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/AttribKernelT.hh new file mode 100644 index 0000000..c0d52a8 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/AttribKernelT.hh @@ -0,0 +1,782 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef OPENMESH_ATTRIBKERNEL_HH +#define OPENMESH_ATTRIBKERNEL_HH + + +//== INCLUDES ================================================================= + +#include +#include +#include +#include +#include + +//== NAMESPACES =============================================================== + +namespace OpenMesh { + + +//== CLASS DEFINITION ========================================================= + +/** \class AttribKernelT AttribKernelT.hh + + The attribute kernel adds all standard properties to the kernel. Therefore + the functions/types defined here provide a subset of the kernel + interface as described in Concepts::KernelT. + + \see Concepts::KernelT +*/ +template +class AttribKernelT : public Connectivity +{ +public: + + //---------------------------------------------------------------- item types + + typedef MeshItems MeshItemsT; + typedef Connectivity ConnectivityT; + typedef typename Connectivity::Vertex Vertex; + typedef typename Connectivity::Halfedge Halfedge; + typedef typename Connectivity::Edge Edge; + typedef typename Connectivity::Face Face; + + typedef typename MeshItems::Point Point; + typedef typename MeshItems::Normal Normal; + typedef typename MeshItems::Color Color; + typedef typename MeshItems::TexCoord1D TexCoord1D; + typedef typename MeshItems::TexCoord2D TexCoord2D; + typedef typename MeshItems::TexCoord3D TexCoord3D; + typedef typename MeshItems::Scalar Scalar; + typedef typename MeshItems::TextureIndex TextureIndex; + + typedef typename MeshItems::VertexData VertexData; + typedef typename MeshItems::HalfedgeData HalfedgeData; + typedef typename MeshItems::EdgeData EdgeData; + typedef typename MeshItems::FaceData FaceData; + + typedef AttribKernelT AttribKernel; + + enum Attribs { + VAttribs = MeshItems::VAttribs, + HAttribs = MeshItems::HAttribs, + EAttribs = MeshItems::EAttribs, + FAttribs = MeshItems::FAttribs + }; + + typedef VPropHandleT DataVPropHandle; + typedef HPropHandleT DataHPropHandle; + typedef EPropHandleT DataEPropHandle; + typedef FPropHandleT DataFPropHandle; + +public: + + //-------------------------------------------------- constructor / destructor + + AttribKernelT() + : refcount_vnormals_(0), + refcount_vcolors_(0), + refcount_vtexcoords1D_(0), + refcount_vtexcoords2D_(0), + refcount_vtexcoords3D_(0), + refcount_htexcoords1D_(0), + refcount_htexcoords2D_(0), + refcount_htexcoords3D_(0), + refcount_henormals_(0), + refcount_hecolors_(0), + refcount_ecolors_(0), + refcount_fnormals_(0), + refcount_fcolors_(0), + refcount_ftextureIndex_(0) + { + this->add_property( points_, "v:points" ); + + if (VAttribs & Attributes::Normal) + request_vertex_normals(); + + if (VAttribs & Attributes::Color) + request_vertex_colors(); + + if (VAttribs & Attributes::TexCoord1D) + request_vertex_texcoords1D(); + + if (VAttribs & Attributes::TexCoord2D) + request_vertex_texcoords2D(); + + if (VAttribs & Attributes::TexCoord3D) + request_vertex_texcoords3D(); + + if (HAttribs & Attributes::TexCoord1D) + request_halfedge_texcoords1D(); + + if (HAttribs & Attributes::TexCoord2D) + request_halfedge_texcoords2D(); + + if (HAttribs & Attributes::TexCoord3D) + request_halfedge_texcoords3D(); + + if (HAttribs & Attributes::Color) + request_halfedge_colors(); + + if (VAttribs & Attributes::Status) + Connectivity::request_vertex_status(); + + if (HAttribs & Attributes::Status) + Connectivity::request_halfedge_status(); + + if (HAttribs & Attributes::Normal) + request_halfedge_normals(); + + if (EAttribs & Attributes::Status) + Connectivity::request_edge_status(); + + if (EAttribs & Attributes::Color) + request_edge_colors(); + + if (FAttribs & Attributes::Normal) + request_face_normals(); + + if (FAttribs & Attributes::Color) + request_face_colors(); + + if (FAttribs & Attributes::Status) + Connectivity::request_face_status(); + + if (FAttribs & Attributes::TextureIndex) + request_face_texture_index(); + + //FIXME: data properties might actually cost storage even + //if there are no data traits?? + this->add_property(data_vpph_); + this->add_property(data_fpph_); + this->add_property(data_hpph_); + this->add_property(data_epph_); + } + + virtual ~AttribKernelT() + { + // should remove properties, but this will be done in + // BaseKernel's destructor anyway... + } + + /** Assignment from another mesh of \em another type. + \note All that's copied is connectivity and vertex positions. + All other information (like e.g. attributes or additional + elements from traits classes) is not copied. + \note If you want to copy all information, including *custom* properties, + use PolyMeshT::operator=() instead. + */ + template + void assign(const _AttribKernel& _other, bool copyStandardProperties = false) + { + //copy standard properties if necessary + if(copyStandardProperties) + this->copy_all_kernel_properties(_other); + + this->assign_connectivity(_other); + for (typename Connectivity::VertexIter v_it = Connectivity::vertices_begin(); + v_it != Connectivity::vertices_end(); ++v_it) + {//assumes Point constructor supports cast from _AttribKernel::Point + set_point(*v_it, (Point)_other.point(*v_it)); + } + + //initialize standard properties if necessary + if(copyStandardProperties) + initializeStandardProperties(); + } + + //-------------------------------------------------------------------- points + + const Point* points() const + { return this->property(points_).data(); } + + const Point& point(VertexHandle _vh) const + { return this->property(points_, _vh); } + + Point& point(VertexHandle _vh) + { return this->property(points_, _vh); } + + void set_point(VertexHandle _vh, const Point& _p) + { this->property(points_, _vh) = _p; } + + + //------------------------------------------------------------ vertex normals + + const Normal* vertex_normals() const + { return this->property(vertex_normals_).data(); } + + const Normal& normal(VertexHandle _vh) const + { return this->property(vertex_normals_, _vh); } + + void set_normal(VertexHandle _vh, const Normal& _n) + { this->property(vertex_normals_, _vh) = _n; } + + + //------------------------------------------------------------- vertex colors + + const Color* vertex_colors() const + { return this->property(vertex_colors_).data(); } + + const Color& color(VertexHandle _vh) const + { return this->property(vertex_colors_, _vh); } + + void set_color(VertexHandle _vh, const Color& _c) + { this->property(vertex_colors_, _vh) = _c; } + + + //------------------------------------------------------- vertex 1D texcoords + + const TexCoord1D* texcoords1D() const { + return this->property(vertex_texcoords1D_).data(); + } + + const TexCoord1D& texcoord1D(VertexHandle _vh) const { + return this->property(vertex_texcoords1D_, _vh); + } + + void set_texcoord1D(VertexHandle _vh, const TexCoord1D& _t) { + this->property(vertex_texcoords1D_, _vh) = _t; + } + + + //------------------------------------------------------- vertex 2D texcoords + + const TexCoord2D* texcoords2D() const { + return this->property(vertex_texcoords2D_).data(); + } + + const TexCoord2D& texcoord2D(VertexHandle _vh) const { + return this->property(vertex_texcoords2D_, _vh); + } + + void set_texcoord2D(VertexHandle _vh, const TexCoord2D& _t) { + this->property(vertex_texcoords2D_, _vh) = _t; + } + + + //------------------------------------------------------- vertex 3D texcoords + + const TexCoord3D* texcoords3D() const { + return this->property(vertex_texcoords3D_).data(); + } + + const TexCoord3D& texcoord3D(VertexHandle _vh) const { + return this->property(vertex_texcoords3D_, _vh); + } + + void set_texcoord3D(VertexHandle _vh, const TexCoord3D& _t) { + this->property(vertex_texcoords3D_, _vh) = _t; + } + + //.------------------------------------------------------ halfedge 1D texcoords + + const TexCoord1D* htexcoords1D() const { + return this->property(halfedge_texcoords1D_).data(); + } + + const TexCoord1D& texcoord1D(HalfedgeHandle _heh) const { + return this->property(halfedge_texcoords1D_, _heh); + } + + void set_texcoord1D(HalfedgeHandle _heh, const TexCoord1D& _t) { + this->property(halfedge_texcoords1D_, _heh) = _t; + } + + + //------------------------------------------------------- halfedge 2D texcoords + + const TexCoord2D* htexcoords2D() const { + return this->property(halfedge_texcoords2D_).data(); + } + + const TexCoord2D& texcoord2D(HalfedgeHandle _heh) const { + return this->property(halfedge_texcoords2D_, _heh); + } + + void set_texcoord2D(HalfedgeHandle _heh, const TexCoord2D& _t) { + this->property(halfedge_texcoords2D_, _heh) = _t; + } + + + //------------------------------------------------------- halfedge 3D texcoords + + const TexCoord3D* htexcoords3D() const { + return this->property(halfedge_texcoords3D_).data(); + } + + const TexCoord3D& texcoord3D(HalfedgeHandle _heh) const { + return this->property(halfedge_texcoords3D_, _heh); + } + + void set_texcoord3D(HalfedgeHandle _heh, const TexCoord3D& _t) { + this->property(halfedge_texcoords3D_, _heh) = _t; + } + + //------------------------------------------------------------- edge colors + + const Color* edge_colors() const + { return this->property(edge_colors_).data(); } + + const Color& color(EdgeHandle _eh) const + { return this->property(edge_colors_, _eh); } + + void set_color(EdgeHandle _eh, const Color& _c) + { this->property(edge_colors_, _eh) = _c; } + + + //------------------------------------------------------------- halfedge normals + + const Normal& normal(HalfedgeHandle _heh) const + { return this->property(halfedge_normals_, _heh); } + + void set_normal(HalfedgeHandle _heh, const Normal& _n) + { this->property(halfedge_normals_, _heh) = _n; } + + + //------------------------------------------------------------- halfedge colors + + const Color* halfedge_colors() const + { return this->property(halfedge_colors_).data(); } + + const Color& color(HalfedgeHandle _heh) const + { return this->property(halfedge_colors_, _heh); } + + void set_color(HalfedgeHandle _heh, const Color& _c) + { this->property(halfedge_colors_, _heh) = _c; } + + //-------------------------------------------------------------- face normals + + const Normal& normal(FaceHandle _fh) const + { return this->property(face_normals_, _fh); } + + void set_normal(FaceHandle _fh, const Normal& _n) + { this->property(face_normals_, _fh) = _n; } + + //-------------------------------------------------------------- per Face Texture index + + const TextureIndex& texture_index(FaceHandle _fh) const + { return this->property(face_texture_index_, _fh); } + + void set_texture_index(FaceHandle _fh, const TextureIndex& _t) + { this->property(face_texture_index_, _fh) = _t; } + + //--------------------------------------------------------------- face colors + + const Color& color(FaceHandle _fh) const + { return this->property(face_colors_, _fh); } + + void set_color(FaceHandle _fh, const Color& _c) + { this->property(face_colors_, _fh) = _c; } + + //------------------------------------------------ request / alloc properties + + void request_vertex_normals() + { + if (!refcount_vnormals_++) + this->add_property( vertex_normals_, "v:normals" ); + } + + void request_vertex_colors() + { + if (!refcount_vcolors_++) + this->add_property( vertex_colors_, "v:colors" ); + } + + void request_vertex_texcoords1D() + { + if (!refcount_vtexcoords1D_++) + this->add_property( vertex_texcoords1D_, "v:texcoords1D" ); + } + + void request_vertex_texcoords2D() + { + if (!refcount_vtexcoords2D_++) + this->add_property( vertex_texcoords2D_, "v:texcoords2D" ); + } + + void request_vertex_texcoords3D() + { + if (!refcount_vtexcoords3D_++) + this->add_property( vertex_texcoords3D_, "v:texcoords3D" ); + } + + void request_halfedge_texcoords1D() + { + if (!refcount_htexcoords1D_++) + this->add_property( halfedge_texcoords1D_, "h:texcoords1D" ); + } + + void request_halfedge_texcoords2D() + { + if (!refcount_htexcoords2D_++) + this->add_property( halfedge_texcoords2D_, "h:texcoords2D" ); + } + + void request_halfedge_texcoords3D() + { + if (!refcount_htexcoords3D_++) + this->add_property( halfedge_texcoords3D_, "h:texcoords3D" ); + } + + void request_edge_colors() + { + if (!refcount_ecolors_++) + this->add_property( edge_colors_, "e:colors" ); + } + + void request_halfedge_normals() + { + if (!refcount_henormals_++) + this->add_property( halfedge_normals_, "h:normals" ); + } + + void request_halfedge_colors() + { + if (!refcount_hecolors_++) + this->add_property( halfedge_colors_, "h:colors" ); + } + + void request_face_normals() + { + if (!refcount_fnormals_++) + this->add_property( face_normals_, "f:normals" ); + } + + void request_face_colors() + { + if (!refcount_fcolors_++) + this->add_property( face_colors_, "f:colors" ); + } + + void request_face_texture_index() + { + if (!refcount_ftextureIndex_++) + this->add_property( face_texture_index_, "f:textureindex" ); + } + + //------------------------------------------------- release / free properties + + void release_vertex_normals() + { + if ((refcount_vnormals_ > 0) && (! --refcount_vnormals_)) + this->remove_property(vertex_normals_); + } + + void release_vertex_colors() + { + if ((refcount_vcolors_ > 0) && (! --refcount_vcolors_)) + this->remove_property(vertex_colors_); + } + + void release_vertex_texcoords1D() { + if ((refcount_vtexcoords1D_ > 0) && (! --refcount_vtexcoords1D_)) + this->remove_property(vertex_texcoords1D_); + } + + void release_vertex_texcoords2D() { + if ((refcount_vtexcoords2D_ > 0) && (! --refcount_vtexcoords2D_)) + this->remove_property(vertex_texcoords2D_); + } + + void release_vertex_texcoords3D() { + if ((refcount_vtexcoords3D_ > 0) && (! --refcount_vtexcoords3D_)) + this->remove_property(vertex_texcoords3D_); + } + + void release_halfedge_texcoords1D() { + if ((refcount_htexcoords1D_ > 0) && (! --refcount_htexcoords1D_)) + this->remove_property(halfedge_texcoords1D_); + } + + void release_halfedge_texcoords2D() { + if ((refcount_htexcoords2D_ > 0) && (! --refcount_htexcoords2D_)) + this->remove_property(halfedge_texcoords2D_); + } + + void release_halfedge_texcoords3D() { + if ((refcount_htexcoords3D_ > 0) && (! --refcount_htexcoords3D_)) + this->remove_property(halfedge_texcoords3D_); + } + + void release_edge_colors() + { + if ((refcount_ecolors_ > 0) && (! --refcount_ecolors_)) + this->remove_property(edge_colors_); + } + + void release_halfedge_normals() + { + if ((refcount_henormals_ > 0) && (! --refcount_henormals_)) + this->remove_property(halfedge_normals_); + } + + void release_halfedge_colors() + { + if ((refcount_hecolors_ > 0) && (! --refcount_hecolors_)) + this->remove_property(halfedge_colors_); + } + + void release_face_normals() + { + if ((refcount_fnormals_ > 0) && (! --refcount_fnormals_)) + this->remove_property(face_normals_); + } + + void release_face_colors() + { + if ((refcount_fcolors_ > 0) && (! --refcount_fcolors_)) + this->remove_property(face_colors_); + } + + void release_face_texture_index() + { + if ((refcount_ftextureIndex_ > 0) && (! --refcount_ftextureIndex_)) + this->remove_property(face_texture_index_); + } + + //---------------------------------------------- dynamic check for properties + + bool has_vertex_normals() const { return vertex_normals_.is_valid(); } + bool has_vertex_colors() const { return vertex_colors_.is_valid(); } + bool has_vertex_texcoords1D() const { return vertex_texcoords1D_.is_valid(); } + bool has_vertex_texcoords2D() const { return vertex_texcoords2D_.is_valid(); } + bool has_vertex_texcoords3D() const { return vertex_texcoords3D_.is_valid(); } + bool has_halfedge_texcoords1D() const { return halfedge_texcoords1D_.is_valid();} + bool has_halfedge_texcoords2D() const { return halfedge_texcoords2D_.is_valid();} + bool has_halfedge_texcoords3D() const { return halfedge_texcoords3D_.is_valid();} + bool has_edge_colors() const { return edge_colors_.is_valid(); } + bool has_halfedge_normals() const { return halfedge_normals_.is_valid(); } + bool has_halfedge_colors() const { return halfedge_colors_.is_valid(); } + bool has_face_normals() const { return face_normals_.is_valid(); } + bool has_face_colors() const { return face_colors_.is_valid(); } + bool has_face_texture_index() const { return face_texture_index_.is_valid(); } + +public: + + typedef VPropHandleT PointsPropertyHandle; + typedef VPropHandleT VertexNormalsPropertyHandle; + typedef VPropHandleT VertexColorsPropertyHandle; + typedef VPropHandleT VertexTexCoords1DPropertyHandle; + typedef VPropHandleT VertexTexCoords2DPropertyHandle; + typedef VPropHandleT VertexTexCoords3DPropertyHandle; + typedef HPropHandleT HalfedgeTexCoords1DPropertyHandle; + typedef HPropHandleT HalfedgeTexCoords2DPropertyHandle; + typedef HPropHandleT HalfedgeTexCoords3DPropertyHandle; + typedef EPropHandleT EdgeColorsPropertyHandle; + typedef HPropHandleT HalfedgeNormalsPropertyHandle; + typedef HPropHandleT HalfedgeColorsPropertyHandle; + typedef FPropHandleT FaceNormalsPropertyHandle; + typedef FPropHandleT FaceColorsPropertyHandle; + typedef FPropHandleT FaceTextureIndexPropertyHandle; + +public: + //standard vertex properties + PointsPropertyHandle points_pph() const + { return points_; } + + VertexNormalsPropertyHandle vertex_normals_pph() const + { return vertex_normals_; } + + VertexColorsPropertyHandle vertex_colors_pph() const + { return vertex_colors_; } + + VertexTexCoords1DPropertyHandle vertex_texcoords1D_pph() const + { return vertex_texcoords1D_; } + + VertexTexCoords2DPropertyHandle vertex_texcoords2D_pph() const + { return vertex_texcoords2D_; } + + VertexTexCoords3DPropertyHandle vertex_texcoords3D_pph() const + { return vertex_texcoords3D_; } + + //standard halfedge properties + HalfedgeTexCoords1DPropertyHandle halfedge_texcoords1D_pph() const + { return halfedge_texcoords1D_; } + + HalfedgeTexCoords2DPropertyHandle halfedge_texcoords2D_pph() const + { return halfedge_texcoords2D_; } + + HalfedgeTexCoords3DPropertyHandle halfedge_texcoords3D_pph() const + { return halfedge_texcoords3D_; } + + // standard edge properties + HalfedgeNormalsPropertyHandle halfedge_normals_pph() const + { return halfedge_normals_; } + + + // standard edge properties + HalfedgeColorsPropertyHandle halfedge_colors_pph() const + { return halfedge_colors_; } + + // standard edge properties + EdgeColorsPropertyHandle edge_colors_pph() const + { return edge_colors_; } + + //standard face properties + FaceNormalsPropertyHandle face_normals_pph() const + { return face_normals_; } + + FaceColorsPropertyHandle face_colors_pph() const + { return face_colors_; } + + FaceTextureIndexPropertyHandle face_texture_index_pph() const + { return face_texture_index_; } + + VertexData& data(VertexHandle _vh) + { return this->property(data_vpph_, _vh); } + + const VertexData& data(VertexHandle _vh) const + { return this->property(data_vpph_, _vh); } + + FaceData& data(FaceHandle _fh) + { return this->property(data_fpph_, _fh); } + + const FaceData& data(FaceHandle _fh) const + { return this->property(data_fpph_, _fh); } + + EdgeData& data(EdgeHandle _eh) + { return this->property(data_epph_, _eh); } + + const EdgeData& data(EdgeHandle _eh) const + { return this->property(data_epph_, _eh); } + + HalfedgeData& data(HalfedgeHandle _heh) + { return this->property(data_hpph_, _heh); } + + const HalfedgeData& data(HalfedgeHandle _heh) const + { return this->property(data_hpph_, _heh); } + +private: + //standard vertex properties + PointsPropertyHandle points_; + VertexNormalsPropertyHandle vertex_normals_; + VertexColorsPropertyHandle vertex_colors_; + VertexTexCoords1DPropertyHandle vertex_texcoords1D_; + VertexTexCoords2DPropertyHandle vertex_texcoords2D_; + VertexTexCoords3DPropertyHandle vertex_texcoords3D_; + //standard halfedge properties + HalfedgeTexCoords1DPropertyHandle halfedge_texcoords1D_; + HalfedgeTexCoords2DPropertyHandle halfedge_texcoords2D_; + HalfedgeTexCoords3DPropertyHandle halfedge_texcoords3D_; + HalfedgeNormalsPropertyHandle halfedge_normals_; + HalfedgeColorsPropertyHandle halfedge_colors_; + // standard edge properties + EdgeColorsPropertyHandle edge_colors_; + //standard face properties + FaceNormalsPropertyHandle face_normals_; + FaceColorsPropertyHandle face_colors_; + FaceTextureIndexPropertyHandle face_texture_index_; + //data properties handles + DataVPropHandle data_vpph_; + DataHPropHandle data_hpph_; + DataEPropHandle data_epph_; + DataFPropHandle data_fpph_; + + unsigned int refcount_vnormals_; + unsigned int refcount_vcolors_; + unsigned int refcount_vtexcoords1D_; + unsigned int refcount_vtexcoords2D_; + unsigned int refcount_vtexcoords3D_; + unsigned int refcount_htexcoords1D_; + unsigned int refcount_htexcoords2D_; + unsigned int refcount_htexcoords3D_; + unsigned int refcount_henormals_; + unsigned int refcount_hecolors_; + unsigned int refcount_ecolors_; + unsigned int refcount_fnormals_; + unsigned int refcount_fcolors_; + unsigned int refcount_ftextureIndex_; + + /** + * @brief initializeStandardProperties Initializes the standard properties + * and sets refcount to 1 if found. (e.g. when the copy constructor was used) + */ + void initializeStandardProperties() + { + if(!this->get_property_handle(points_, + "v:points")) + { + //mesh has no points? + } + refcount_vnormals_ = this->get_property_handle(vertex_normals_, + "v:normals") ? 1 : 0 ; + refcount_vcolors_ = this->get_property_handle(vertex_colors_, + "v:colors") ? 1 : 0 ; + refcount_vtexcoords1D_ = this->get_property_handle(vertex_texcoords1D_, + "v:texcoords1D") ? 1 : 0 ; + refcount_vtexcoords2D_ = this->get_property_handle(vertex_texcoords2D_, + "v:texcoords2D") ? 1 : 0 ; + refcount_vtexcoords3D_ = this->get_property_handle(vertex_texcoords3D_, + "v:texcoords3D") ? 1 : 0 ; + refcount_htexcoords1D_ = this->get_property_handle(halfedge_texcoords1D_, + "h:texcoords1D") ? 1 : 0 ; + refcount_htexcoords2D_ = this->get_property_handle(halfedge_texcoords2D_, + "h:texcoords2D") ? 1 : 0 ; + refcount_htexcoords3D_ = this->get_property_handle(halfedge_texcoords3D_, + "h:texcoords3D") ? 1 : 0 ; + refcount_henormals_ = this->get_property_handle(halfedge_normals_, + "h:normals") ? 1 : 0 ; + refcount_hecolors_ = this->get_property_handle(halfedge_colors_, + "h:colors") ? 1 : 0 ; + refcount_ecolors_ = this->get_property_handle(edge_colors_, + "e:colors") ? 1 : 0 ; + refcount_fnormals_ = this->get_property_handle(face_normals_, + "f:normals") ? 1 : 0 ; + refcount_fcolors_ = this->get_property_handle(face_colors_, + "f:colors") ? 1 : 0 ; + refcount_ftextureIndex_ = this->get_property_handle(face_texture_index_, + "f:textureindex") ? 1 : 0 ; + } +}; + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_ATTRIBKERNEL_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/Attributes.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/Attributes.hh new file mode 100644 index 0000000..e53f021 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/Attributes.hh @@ -0,0 +1,103 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +/** + \file Attributes.hh + This file provides some macros containing attribute usage. +*/ + + +#ifndef OPENMESH_ATTRIBUTES_HH +#define OPENMESH_ATTRIBUTES_HH + + +//== INCLUDES ================================================================= + + +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { +namespace Attributes { + + +//== CLASS DEFINITION ======================================================== + +/** Attribute bits + * + * Use the bits to define a standard property at compile time using traits. + * + * \include traits5.cc + * + * \see \ref mesh_type + */ +enum AttributeBits +{ + None = 0, ///< Clear all attribute bits + Normal = 1, ///< Add normals to mesh item (vertices/faces) + Color = 2, ///< Add colors to mesh item (vertices/faces/edges) + PrevHalfedge = 4, ///< Add storage for previous halfedge (halfedges). The bit is set by default in the DefaultTraits. + Status = 8, ///< Add status to mesh item (all items) + TexCoord1D = 16, ///< Add 1D texture coordinates (vertices, halfedges) + TexCoord2D = 32, ///< Add 2D texture coordinates (vertices, halfedges) + TexCoord3D = 64, ///< Add 3D texture coordinates (vertices, halfedges) + TextureIndex = 128 ///< Add texture index (faces) +}; + + +//============================================================================= +} // namespace Attributes +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_ATTRIBUTES_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/BaseKernel.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/BaseKernel.hh new file mode 100644 index 0000000..6bca014 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/BaseKernel.hh @@ -0,0 +1,826 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// CLASS BaseKernel +// +//============================================================================= + + +#ifndef OPENMESH_BASE_KERNEL_HH +#define OPENMESH_BASE_KERNEL_HH + + +//== INCLUDES ================================================================= + + +#include +// -------------------- +#include +#include +#include +#include +// -------------------- +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + + +//== CLASS DEFINITION ========================================================= + +/// This class provides low-level property management like adding/removing +/// properties and access to properties. Under most circumstances, it is +/// advisable to use the high-level property management provided by +/// PropertyManager, instead. +/// +/// All operations provided by %BaseKernel need at least a property handle +/// (VPropHandleT, EPropHandleT, HPropHandleT, FPropHandleT, MPropHandleT). +/// which keeps the data type of the property, too. +/// +/// There are two types of properties: +/// -# Standard properties - mesh data (e.g. vertex normal or face color) +/// -# Custom properties - user defined data +/// +/// The differentiation is only semantically, technically both are +/// equally handled. Therefore the methods provided by the %BaseKernel +/// are applicable to both property types. +/// +/// \attention Since the class PolyMeshT derives from a kernel, hence all public +/// elements of %BaseKernel are usable. + +class OPENMESHDLLEXPORT BaseKernel +{ +public: //-------------------------------------------- constructor / destructor + + BaseKernel() {} + virtual ~BaseKernel() { + vprops_.clear(); + eprops_.clear(); + hprops_.clear(); + fprops_.clear(); + } + + +public: //-------------------------------------------------- add new properties + + /// \name Add a property to a mesh item + + //@{ + + /** You should not use this function directly. Instead, use the convenient + * PropertyManager wrapper and/or one of its helper functions such as + * makePropertyManagerFromNew, makePropertyManagerFromExisting, or + * makePropertyManagerFromExistingOrNew. + * + * Adds a property + * + * Depending on the property handle type a vertex, (half-)edge, face or + * mesh property is added to the mesh. If the action fails the handle + * is invalid. + * On success the handle must be used to access the property data with + * property(). + * + * \param _ph A property handle defining the data type to bind to mesh. + * On success the handle is valid else invalid. + * \param _name Optional name of property. Following restrictions apply + * to the name: + * -# Maximum length of name is 256 characters + * -# The prefixes matching "^[vhefm]:" are reserved for + * internal usage. + * -# The expression "^<.*>$" is reserved for internal usage. + * + */ + + template + void add_property( VPropHandleT& _ph, const std::string& _name="") + { + _ph = VPropHandleT( vprops_.add(T(), _name) ); + vprops_.resize(n_vertices()); + } + + template + void add_property( HPropHandleT& _ph, const std::string& _name="") + { + _ph = HPropHandleT( hprops_.add(T(), _name) ); + hprops_.resize(n_halfedges()); + } + + template + void add_property( EPropHandleT& _ph, const std::string& _name="") + { + _ph = EPropHandleT( eprops_.add(T(), _name) ); + eprops_.resize(n_edges()); + } + + template + void add_property( FPropHandleT& _ph, const std::string& _name="") + { + _ph = FPropHandleT( fprops_.add(T(), _name) ); + fprops_.resize(n_faces()); + } + + template + void add_property( MPropHandleT& _ph, const std::string& _name="") + { + _ph = MPropHandleT( mprops_.add(T(), _name) ); + mprops_.resize(1); + } + + //@} + + +public: //--------------------------------------------------- remove properties + + /// \name Removing a property from a mesh tiem + //@{ + + /** You should not use this function directly. Instead, use the convenient + * PropertyManager wrapper to manage (and remove) properties. + * + * Remove a property. + * + * Removes the property represented by the handle from the apropriate + * mesh item. + * \param _ph Property to be removed. The handle is invalid afterwords. + */ + + template + void remove_property(VPropHandleT& _ph) + { + if (_ph.is_valid()) + vprops_.remove(_ph); + _ph.reset(); + } + + template + void remove_property(HPropHandleT& _ph) + { + if (_ph.is_valid()) + hprops_.remove(_ph); + _ph.reset(); + } + + template + void remove_property(EPropHandleT& _ph) + { + if (_ph.is_valid()) + eprops_.remove(_ph); + _ph.reset(); + } + + template + void remove_property(FPropHandleT& _ph) + { + if (_ph.is_valid()) + fprops_.remove(_ph); + _ph.reset(); + } + + template + void remove_property(MPropHandleT& _ph) + { + if (_ph.is_valid()) + mprops_.remove(_ph); + _ph.reset(); + } + + //@} + +public: //------------------------------------------------ get handle from name + + /// \name Get property handle by name + //@{ + + /** You should not use this function directly. Instead, use the convenient + * PropertyManager wrapper (e.g. PropertyManager::propertyExists) or one of + * its higher level helper functions such as + * makePropertyManagerFromExisting, or makePropertyManagerFromExistingOrNew. + * + * Retrieves the handle to a named property by it's name. + * + * \param _ph A property handle. On success the handle is valid else + * invalid. + * \param _name Name of wanted property. + * \return \c true if such a named property is available, else \c false. + */ + + template + bool get_property_handle(VPropHandleT& _ph, + const std::string& _name) const + { + return (_ph = VPropHandleT(vprops_.handle(T(), _name))).is_valid(); + } + + template + bool get_property_handle(HPropHandleT& _ph, + const std::string& _name) const + { + return (_ph = HPropHandleT(hprops_.handle(T(), _name))).is_valid(); + } + + template + bool get_property_handle(EPropHandleT& _ph, + const std::string& _name) const + { + return (_ph = EPropHandleT(eprops_.handle(T(), _name))).is_valid(); + } + + template + bool get_property_handle(FPropHandleT& _ph, + const std::string& _name) const + { + return (_ph = FPropHandleT(fprops_.handle(T(), _name))).is_valid(); + } + + template + bool get_property_handle(MPropHandleT& _ph, + const std::string& _name) const + { + return (_ph = MPropHandleT(mprops_.handle(T(), _name))).is_valid(); + } + + //@} + +public: //--------------------------------------------------- access properties + + /// \name Access a property + //@{ + + /** In most cases you should use the convenient PropertyManager wrapper + * and use of this function should not be necessary. Under some + * circumstances, however (i.e. making a property persistent), it might be + * necessary to use this function. + * + * Access a property + * + * This method returns a reference to property. The property handle + * must be valid! The result is unpredictable if the handle is invalid! + * + * \param _ph A \em valid (!) property handle. + * \return The wanted property if the handle is valid. + */ + + template + PropertyT& property(VPropHandleT _ph) { + return vprops_.property(_ph); + } + template + const PropertyT& property(VPropHandleT _ph) const { + return vprops_.property(_ph); + } + + template + PropertyT& property(HPropHandleT _ph) { + return hprops_.property(_ph); + } + template + const PropertyT& property(HPropHandleT _ph) const { + return hprops_.property(_ph); + } + + template + PropertyT& property(EPropHandleT _ph) { + return eprops_.property(_ph); + } + template + const PropertyT& property(EPropHandleT _ph) const { + return eprops_.property(_ph); + } + + template + PropertyT& property(FPropHandleT _ph) { + return fprops_.property(_ph); + } + template + const PropertyT& property(FPropHandleT _ph) const { + return fprops_.property(_ph); + } + + template + PropertyT& mproperty(MPropHandleT _ph) { + return mprops_.property(_ph); + } + template + const PropertyT& mproperty(MPropHandleT _ph) const { + return mprops_.property(_ph); + } + + //@} + +public: //-------------------------------------------- access property elements + + /// \name Access a property element using a handle to a mesh item + //@{ + + /** You should not use this function directly. Instead, use the convenient + * PropertyManager wrapper. + * + * Return value of property for an item + */ + + template + typename VPropHandleT::reference + property(VPropHandleT _ph, VertexHandle _vh) { + return vprops_.property(_ph)[_vh.idx()]; + } + + template + typename VPropHandleT::const_reference + property(VPropHandleT _ph, VertexHandle _vh) const { + return vprops_.property(_ph)[_vh.idx()]; + } + + + template + typename HPropHandleT::reference + property(HPropHandleT _ph, HalfedgeHandle _hh) { + return hprops_.property(_ph)[_hh.idx()]; + } + + template + typename HPropHandleT::const_reference + property(HPropHandleT _ph, HalfedgeHandle _hh) const { + return hprops_.property(_ph)[_hh.idx()]; + } + + + template + typename EPropHandleT::reference + property(EPropHandleT _ph, EdgeHandle _eh) { + return eprops_.property(_ph)[_eh.idx()]; + } + + template + typename EPropHandleT::const_reference + property(EPropHandleT _ph, EdgeHandle _eh) const { + return eprops_.property(_ph)[_eh.idx()]; + } + + + template + typename FPropHandleT::reference + property(FPropHandleT _ph, FaceHandle _fh) { + return fprops_.property(_ph)[_fh.idx()]; + } + + template + typename FPropHandleT::const_reference + property(FPropHandleT _ph, FaceHandle _fh) const { + return fprops_.property(_ph)[_fh.idx()]; + } + + + template + typename MPropHandleT::reference + property(MPropHandleT _ph) { + return mprops_.property(_ph)[0]; + } + + template + typename MPropHandleT::const_reference + property(MPropHandleT _ph) const { + return mprops_.property(_ph)[0]; + } + + //@} + + +public: //------------------------------------------------ copy property + + /** You should not use this function directly. Instead, use the convenient + * PropertyManager wrapper (e.g. PropertyManager::copy_to or + * PropertyManager::copy). + * + * Copies a single property from one mesh element to another (of the same type) + * + * @param _ph A vertex property handle + * @param _vh_from From vertex handle + * @param _vh_to To vertex handle + */ + template + void copy_property(VPropHandleT& _ph, VertexHandle _vh_from, VertexHandle _vh_to) { + if(_vh_from.is_valid() && _vh_to.is_valid()) + vprops_.property(_ph)[_vh_to.idx()] = vprops_.property(_ph)[_vh_from.idx()]; + } + + /** You should not use this function directly. Instead, use the convenient + * PropertyManager wrapper (e.g. PropertyManager::copy_to or + * PropertyManager::copy). + * + * Copies a single property from one mesh element to another (of the same type) + * + * @param _ph A halfedge property handle + * @param _hh_from From halfedge handle + * @param _hh_to To halfedge handle + */ + template + void copy_property(HPropHandleT _ph, HalfedgeHandle _hh_from, HalfedgeHandle _hh_to) { + if(_hh_from.is_valid() && _hh_to.is_valid()) + hprops_.property(_ph)[_hh_to.idx()] = hprops_.property(_ph)[_hh_from.idx()]; + } + + /** You should not use this function directly. Instead, use the convenient + * PropertyManager wrapper (e.g. PropertyManager::copy_to or + * PropertyManager::copy). + * + * Copies a single property from one mesh element to another (of the same type) + * + * @param _ph An edge property handle + * @param _eh_from From edge handle + * @param _eh_to To edge handle + */ + template + void copy_property(EPropHandleT _ph, EdgeHandle _eh_from, EdgeHandle _eh_to) { + if(_eh_from.is_valid() && _eh_to.is_valid()) + eprops_.property(_ph)[_eh_to.idx()] = eprops_.property(_ph)[_eh_from.idx()]; + } + + /** You should not use this function directly. Instead, use the convenient + * PropertyManager wrapper (e.g. PropertyManager::copy_to or + * PropertyManager::copy). + * + * Copies a single property from one mesh element to another (of the same type) + * + * @param _ph A face property handle + * @param _fh_from From face handle + * @param _fh_to To face handle + */ + template + void copy_property(FPropHandleT _ph, FaceHandle _fh_from, FaceHandle _fh_to) { + if(_fh_from.is_valid() && _fh_to.is_valid()) + fprops_.property(_ph)[_fh_to.idx()] = fprops_.property(_ph)[_fh_from.idx()]; + } + + +public: + //------------------------------------------------ copy all properties + + /** Copies all properties from one mesh element to another (of the same type) + * + * + * @param _vh_from A vertex handle - source + * @param _vh_to A vertex handle - target + * @param _copyBuildIn Should the internal properties (position, normal, texture coordinate,..) be copied? + */ + void copy_all_properties(VertexHandle _vh_from, VertexHandle _vh_to, bool _copyBuildIn = false) { + + for( PropertyContainer::iterator p_it = vprops_.begin(); + p_it != vprops_.end(); ++p_it) { + + // Copy all properties, if build in is true + // Otherwise, copy only properties without build in specifier + if ( *p_it && ( _copyBuildIn || (*p_it)->name().substr(0,2) != "v:" ) ) + (*p_it)->copy(_vh_from.idx(), _vh_to.idx()); + + } + } + + /** Copies all properties from one mesh element to another (of the same type) + * + * @param _hh_from A halfedge handle - source + * @param _hh_to A halfedge handle - target + * @param _copyBuildIn Should the internal properties (position, normal, texture coordinate,..) be copied? + */ + void copy_all_properties(HalfedgeHandle _hh_from, HalfedgeHandle _hh_to, bool _copyBuildIn = false) { + + for( PropertyContainer::iterator p_it = hprops_.begin(); + p_it != hprops_.end(); ++p_it) { + + // Copy all properties, if build in is true + // Otherwise, copy only properties without build in specifier + if ( *p_it && ( _copyBuildIn || (*p_it)->name().substr(0,2) != "h:") ) + (*p_it)->copy(_hh_from.idx(), _hh_to.idx()); + + } + } + + /** Copies all properties from one mesh element to another (of the same type) + * + * @param _eh_from An edge handle - source + * @param _eh_to An edge handle - target + * @param _copyBuildIn Should the internal properties (position, normal, texture coordinate,..) be copied? + */ + void copy_all_properties(EdgeHandle _eh_from, EdgeHandle _eh_to, bool _copyBuildIn = false) { + for( PropertyContainer::iterator p_it = eprops_.begin(); + p_it != eprops_.end(); ++p_it) { + + // Copy all properties, if build in is true + // Otherwise, copy only properties without build in specifier + if ( *p_it && ( _copyBuildIn || (*p_it)->name().substr(0,2) != "e:") ) + (*p_it)->copy(_eh_from.idx(), _eh_to.idx()); + + } + } + + /** Copies all properties from one mesh element to another (of the same type) + * + * @param _fh_from A face handle - source + * @param _fh_to A face handle - target + * @param _copyBuildIn Should the internal properties (position, normal, texture coordinate,..) be copied? + * + */ + void copy_all_properties(FaceHandle _fh_from, FaceHandle _fh_to, bool _copyBuildIn = false) { + + for( PropertyContainer::iterator p_it = fprops_.begin(); + p_it != fprops_.end(); ++p_it) { + + // Copy all properties, if build in is true + // Otherwise, copy only properties without build in specifier + if ( *p_it && ( _copyBuildIn || (*p_it)->name().substr(0,2) != "f:") ) + (*p_it)->copy(_fh_from.idx(), _fh_to.idx()); + } + + } + + /** + * @brief copy_all_kernel_properties uses the = operator to copy all properties from a given other BaseKernel. + * @param _other Another BaseKernel, to copy the properties from. + */ + void copy_all_kernel_properties(const BaseKernel & _other) + { + this->vprops_ = _other.vprops_; + this->eprops_ = _other.eprops_; + this->hprops_ = _other.hprops_; + this->fprops_ = _other.fprops_; + } + +protected: //------------------------------------------------- low-level access + +public: // used by non-native kernel and MeshIO, should be protected + + size_t n_vprops(void) const { return vprops_.size(); } + + size_t n_eprops(void) const { return eprops_.size(); } + + size_t n_hprops(void) const { return hprops_.size(); } + + size_t n_fprops(void) const { return fprops_.size(); } + + size_t n_mprops(void) const { return mprops_.size(); } + + BaseProperty* _get_vprop( const std::string& _name) + { return vprops_.property(_name); } + + BaseProperty* _get_eprop( const std::string& _name) + { return eprops_.property(_name); } + + BaseProperty* _get_hprop( const std::string& _name) + { return hprops_.property(_name); } + + BaseProperty* _get_fprop( const std::string& _name) + { return fprops_.property(_name); } + + BaseProperty* _get_mprop( const std::string& _name) + { return mprops_.property(_name); } + + const BaseProperty* _get_vprop( const std::string& _name) const + { return vprops_.property(_name); } + + const BaseProperty* _get_eprop( const std::string& _name) const + { return eprops_.property(_name); } + + const BaseProperty* _get_hprop( const std::string& _name) const + { return hprops_.property(_name); } + + const BaseProperty* _get_fprop( const std::string& _name) const + { return fprops_.property(_name); } + + const BaseProperty* _get_mprop( const std::string& _name) const + { return mprops_.property(_name); } + + BaseProperty& _vprop( size_t _idx ) { return vprops_._property( _idx ); } + BaseProperty& _eprop( size_t _idx ) { return eprops_._property( _idx ); } + BaseProperty& _hprop( size_t _idx ) { return hprops_._property( _idx ); } + BaseProperty& _fprop( size_t _idx ) { return fprops_._property( _idx ); } + BaseProperty& _mprop( size_t _idx ) { return mprops_._property( _idx ); } + + const BaseProperty& _vprop( size_t _idx ) const + { return vprops_._property( _idx ); } + const BaseProperty& _eprop( size_t _idx ) const + { return eprops_._property( _idx ); } + const BaseProperty& _hprop( size_t _idx ) const + { return hprops_._property( _idx ); } + const BaseProperty& _fprop( size_t _idx ) const + { return fprops_._property( _idx ); } + const BaseProperty& _mprop( size_t _idx ) const + { return mprops_._property( _idx ); } + + size_t _add_vprop( BaseProperty* _bp ) { return vprops_._add( _bp ); } + size_t _add_eprop( BaseProperty* _bp ) { return eprops_._add( _bp ); } + size_t _add_hprop( BaseProperty* _bp ) { return hprops_._add( _bp ); } + size_t _add_fprop( BaseProperty* _bp ) { return fprops_._add( _bp ); } + size_t _add_mprop( BaseProperty* _bp ) { return mprops_._add( _bp ); } + +protected: // low-level access non-public + + BaseProperty& _vprop( BaseHandle _h ) + { return vprops_._property( _h.idx() ); } + BaseProperty& _eprop( BaseHandle _h ) + { return eprops_._property( _h.idx() ); } + BaseProperty& _hprop( BaseHandle _h ) + { return hprops_._property( _h.idx() ); } + BaseProperty& _fprop( BaseHandle _h ) + { return fprops_._property( _h.idx() ); } + BaseProperty& _mprop( BaseHandle _h ) + { return mprops_._property( _h.idx() ); } + + const BaseProperty& _vprop( BaseHandle _h ) const + { return vprops_._property( _h.idx() ); } + const BaseProperty& _eprop( BaseHandle _h ) const + { return eprops_._property( _h.idx() ); } + const BaseProperty& _hprop( BaseHandle _h ) const + { return hprops_._property( _h.idx() ); } + const BaseProperty& _fprop( BaseHandle _h ) const + { return fprops_._property( _h.idx() ); } + const BaseProperty& _mprop( BaseHandle _h ) const + { return mprops_._property( _h.idx() ); } + + +public: //----------------------------------------------------- element numbers + + + virtual size_t n_vertices() const { return 0; } + virtual size_t n_halfedges() const { return 0; } + virtual size_t n_edges() const { return 0; } + virtual size_t n_faces() const { return 0; } + + +protected: //------------------------------------------- synchronize properties + + /// Reserves space for \p _n elements in all vertex property vectors. + void vprops_reserve(size_t _n) const { vprops_.reserve(_n); } + + /// Resizes all vertex property vectors to the specified size. + void vprops_resize(size_t _n) const { vprops_.resize(_n); } + + /** + * Same as vprops_resize() but ignores vertex property vectors that have + * a size larger than \p _n. + * + * Use this method instead of vprops_resize() if you plan to frequently reduce + * and enlarge the property container and you don't want to waste time + * reallocating the property vectors every time. + */ + void vprops_resize_if_smaller(size_t _n) const { vprops_.resize_if_smaller(_n); } + + void vprops_clear() { + vprops_.clear(); + } + + void vprops_swap(unsigned int _i0, unsigned int _i1) const { + vprops_.swap(_i0, _i1); + } + + void hprops_reserve(size_t _n) const { hprops_.reserve(_n); } + void hprops_resize(size_t _n) const { hprops_.resize(_n); } + void hprops_clear() { + hprops_.clear(); + } + void hprops_swap(unsigned int _i0, unsigned int _i1) const { + hprops_.swap(_i0, _i1); + } + + void eprops_reserve(size_t _n) const { eprops_.reserve(_n); } + void eprops_resize(size_t _n) const { eprops_.resize(_n); } + void eprops_clear() { + eprops_.clear(); + } + void eprops_swap(unsigned int _i0, unsigned int _i1) const { + eprops_.swap(_i0, _i1); + } + + void fprops_reserve(size_t _n) const { fprops_.reserve(_n); } + void fprops_resize(size_t _n) const { fprops_.resize(_n); } + void fprops_clear() { + fprops_.clear(); + } + void fprops_swap(unsigned int _i0, unsigned int _i1) const { + fprops_.swap(_i0, _i1); + } + + void mprops_resize(size_t _n) const { mprops_.resize(_n); } + void mprops_clear() { + mprops_.clear(); + } + +public: + + // uses std::clog as output stream + void property_stats() const; + void property_stats(std::ostream& _ostr) const; + + void vprop_stats( std::string& _string ) const; + void hprop_stats( std::string& _string ) const; + void eprop_stats( std::string& _string ) const; + void fprop_stats( std::string& _string ) const; + void mprop_stats( std::string& _string ) const; + + // uses std::clog as output stream + void vprop_stats() const; + void hprop_stats() const; + void eprop_stats() const; + void fprop_stats() const; + void mprop_stats() const; + + void vprop_stats(std::ostream& _ostr) const; + void hprop_stats(std::ostream& _ostr) const; + void eprop_stats(std::ostream& _ostr) const; + void fprop_stats(std::ostream& _ostr) const; + void mprop_stats(std::ostream& _ostr) const; + +public: + + typedef PropertyContainer::iterator prop_iterator; + typedef PropertyContainer::const_iterator const_prop_iterator; + + prop_iterator vprops_begin() { return vprops_.begin(); } + prop_iterator vprops_end() { return vprops_.end(); } + const_prop_iterator vprops_begin() const { return vprops_.begin(); } + const_prop_iterator vprops_end() const { return vprops_.end(); } + + prop_iterator eprops_begin() { return eprops_.begin(); } + prop_iterator eprops_end() { return eprops_.end(); } + const_prop_iterator eprops_begin() const { return eprops_.begin(); } + const_prop_iterator eprops_end() const { return eprops_.end(); } + + prop_iterator hprops_begin() { return hprops_.begin(); } + prop_iterator hprops_end() { return hprops_.end(); } + const_prop_iterator hprops_begin() const { return hprops_.begin(); } + const_prop_iterator hprops_end() const { return hprops_.end(); } + + prop_iterator fprops_begin() { return fprops_.begin(); } + prop_iterator fprops_end() { return fprops_.end(); } + const_prop_iterator fprops_begin() const { return fprops_.begin(); } + const_prop_iterator fprops_end() const { return fprops_.end(); } + + prop_iterator mprops_begin() { return mprops_.begin(); } + prop_iterator mprops_end() { return mprops_.end(); } + const_prop_iterator mprops_begin() const { return mprops_.begin(); } + const_prop_iterator mprops_end() const { return mprops_.end(); } + +private: + + PropertyContainer vprops_; + PropertyContainer hprops_; + PropertyContainer eprops_; + PropertyContainer fprops_; + PropertyContainer mprops_; +}; + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_BASE_KERNEL_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/BaseMesh.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/BaseMesh.hh new file mode 100644 index 0000000..bcf75eb --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/BaseMesh.hh @@ -0,0 +1,97 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// CLASS BaseMesh +// +//============================================================================= + + +#ifndef OPENMESH_BASEMESH_HH +#define OPENMESH_BASEMESH_HH + + +//== INCLUDES ================================================================= + + +#include +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + + +//== CLASS DEFINITION ========================================================= + + +/** \class BaseMesh BaseMesh.hh + + Base class for all meshes. +*/ + +class BaseMesh { +public: + virtual ~BaseMesh(void) {;} +}; + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= + +//============================================================================= +#endif // OPENMESH_BASEMESH_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/Casts.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/Casts.hh new file mode 100644 index 0000000..136c16f --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/Casts.hh @@ -0,0 +1,77 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef OPENMESH_CASTS_HH +#define OPENMESH_CASTS_HH +//== INCLUDES ================================================================= + +#include +#include + +//== NAMESPACES =============================================================== +namespace OpenMesh +{ + +template +inline TriMesh_ArrayKernelT& TRIMESH_CAST(PolyMesh_ArrayKernelT& _poly_mesh) +{ return reinterpret_cast< TriMesh_ArrayKernelT& >(_poly_mesh); } + +template +inline const TriMesh_ArrayKernelT& TRIMESH_CAST(const PolyMesh_ArrayKernelT& _poly_mesh) +{ return reinterpret_cast< const TriMesh_ArrayKernelT& >(_poly_mesh); } + +template +inline PolyMesh_ArrayKernelT& POLYMESH_CAST(TriMesh_ArrayKernelT& _tri_mesh) +{ return reinterpret_cast< PolyMesh_ArrayKernelT& >(_tri_mesh); } + +template +inline const PolyMesh_ArrayKernelT& POLYMESH_CAST(const TriMesh_ArrayKernelT& _tri_mesh) +{ return reinterpret_cast< const PolyMesh_ArrayKernelT& >(_tri_mesh); } + +}; +#endif//OPENMESH_CASTS_HH diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/CirculatorsT.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/CirculatorsT.hh new file mode 100644 index 0000000..0656059 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/CirculatorsT.hh @@ -0,0 +1,598 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef OPENMESH_CIRCULATORS_HH +#define OPENMESH_CIRCULATORS_HH +//============================================================================= +// +// Vertex and Face circulators for PolyMesh/TriMesh +// +//============================================================================= + + + +//== INCLUDES ================================================================= + +#include +#include +#include +#include + +//== NAMESPACES =============================================================== + +namespace OpenMesh { +namespace Iterators { + +template +class GenericCirculator_CenterEntityFnsT { + public: + static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter); + static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter); +}; + +template +class GenericCirculator_CenterEntityFnsT { + public: + inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + heh = mesh->cw_rotated_halfedge_handle(heh); + if (heh == start) ++lap_counter; + } + inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + if (heh == start) --lap_counter; + heh = mesh->ccw_rotated_halfedge_handle(heh); + } +}; + +template +class GenericCirculator_CenterEntityFnsT { + public: + inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + heh = mesh->next_halfedge_handle(heh); + if (heh == start) ++lap_counter; + } + inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + if (heh == start) --lap_counter; + heh = mesh->prev_halfedge_handle(heh); + } +}; + +///////////////////////////////////////////////////////////// +// CCW + +template +class GenericCirculator_CenterEntityFnsT { + public: + inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + heh = mesh->ccw_rotated_halfedge_handle(heh); + if (heh == start) ++lap_counter; + } + inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + if (heh == start) --lap_counter; + heh = mesh->cw_rotated_halfedge_handle(heh); + } +}; + +template +class GenericCirculator_CenterEntityFnsT { + public: + inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + heh = mesh->prev_halfedge_handle(heh); + if (heh == start) ++lap_counter; + } + inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + if (heh == start) --lap_counter; + heh = mesh->next_halfedge_handle(heh); + } +}; +///////////////////////////////////////////////////////////// + +template +class GenericCirculator_DereferenciabilityCheckT { + public: + //inline static bool isDereferenciable(const Mesh *mesh, const typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, const int &lap_counter); +}; + +template +class GenericCirculator_DereferenciabilityCheckT { + public: + inline static bool isDereferenciable(const Mesh *mesh, const typename Mesh::HalfedgeHandle &heh) { + return mesh->face_handle(mesh->opposite_halfedge_handle(heh)).is_valid(); + } +}; + +template +class GenericCirculator_DereferenciabilityCheckT { + public: + inline static bool isDereferenciable(const Mesh *mesh, const typename Mesh::HalfedgeHandle &heh) { + return mesh->face_handle(heh).is_valid(); + } +}; + +template +class GenericCirculator_ValueHandleFnsT { + public: + inline static bool is_valid(const typename Mesh::HalfedgeHandle &heh, const int lap_counter) { + return ( heh.is_valid() && (lap_counter == 0 ) ); + } + inline static void init(const Mesh*, typename Mesh::HalfedgeHandle&, typename Mesh::HalfedgeHandle&, int&) {}; + inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + GenericCirculator_CenterEntityFnsT::increment(mesh, heh, start, lap_counter); + } + inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + GenericCirculator_CenterEntityFnsT::decrement(mesh, heh, start, lap_counter); + } +}; + +template +class GenericCirculator_ValueHandleFnsT { + public: + typedef GenericCirculator_DereferenciabilityCheckT GenericCirculator_DereferenciabilityCheck; + + inline static bool is_valid(const typename Mesh::HalfedgeHandle &heh, const int lap_counter) { + return ( heh.is_valid() && (lap_counter == 0)); + } + inline static void init(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + if (heh.is_valid() && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh) && lap_counter == 0 ) + increment(mesh, heh, start, lap_counter); + }; + inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + do { + GenericCirculator_CenterEntityFnsT::increment(mesh, heh, start, lap_counter); + } while (is_valid(heh, lap_counter) && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh)); + } + inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + do { + GenericCirculator_CenterEntityFnsT::decrement(mesh, heh, start, lap_counter); + } while (is_valid(heh, lap_counter) && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh)); + } +}; + +template +class GenericCirculatorBaseT { + public: + typedef const Mesh* mesh_ptr; + typedef const Mesh& mesh_ref; + + public: + GenericCirculatorBaseT() : mesh_(0), lap_counter_(0) {} + + GenericCirculatorBaseT(mesh_ref mesh, HalfedgeHandle heh, bool end = false) : + mesh_(&mesh), start_(heh), heh_(heh), lap_counter_(static_cast(end && heh.is_valid())) {} + + GenericCirculatorBaseT(const GenericCirculatorBaseT &rhs) : + mesh_(rhs.mesh_), start_(rhs.start_), heh_(rhs.heh_), lap_counter_(rhs.lap_counter_) {} + + inline typename Mesh::FaceHandle toFaceHandle() const { + return mesh_->face_handle(heh_); + } + + inline typename Mesh::FaceHandle toOppositeFaceHandle() const { + return mesh_->face_handle(toOppositeHalfedgeHandle()); + } + + inline typename Mesh::EdgeHandle toEdgeHandle() const { + return mesh_->edge_handle(heh_); + } + + inline typename Mesh::HalfedgeHandle toHalfedgeHandle() const { + return heh_; + } + + inline typename Mesh::HalfedgeHandle toOppositeHalfedgeHandle() const { + return mesh_->opposite_halfedge_handle(heh_); + } + + inline typename Mesh::VertexHandle toVertexHandle() const { + return mesh_->to_vertex_handle(heh_); + } + + inline GenericCirculatorBaseT &operator=(const GenericCirculatorBaseT &rhs) { + mesh_ = rhs.mesh_; + start_ = rhs.start_; + heh_ = rhs.heh_; + lap_counter_ = rhs.lap_counter_; + return *this; + } + + inline bool operator==(const GenericCirculatorBaseT &rhs) const { + return mesh_ == rhs.mesh_ && start_ == rhs.start_ && heh_ == rhs.heh_ && lap_counter_ == rhs.lap_counter_; + } + + inline bool operator!=(const GenericCirculatorBaseT &rhs) const { + return !operator==(rhs); + } + + protected: + mesh_ptr mesh_; + typename Mesh::HalfedgeHandle start_, heh_; + int lap_counter_; +}; + +template::*Handle2Value)() const, bool CW = true > +class GenericCirculatorT : protected GenericCirculatorBaseT { + public: + typedef std::ptrdiff_t difference_type; + typedef ValueHandle value_type; + typedef const value_type& reference; + typedef const value_type* pointer; + typedef std::bidirectional_iterator_tag iterator_category; + + typedef typename GenericCirculatorBaseT::mesh_ptr mesh_ptr; + typedef typename GenericCirculatorBaseT::mesh_ref mesh_ref; + typedef GenericCirculator_ValueHandleFnsT GenericCirculator_ValueHandleFns; + + public: + GenericCirculatorT() {} + GenericCirculatorT(mesh_ref mesh, CenterEntityHandle start, bool end = false) : + GenericCirculatorBaseT(mesh, mesh.halfedge_handle(start), end) { + + GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this->start_, this->lap_counter_); + } + GenericCirculatorT(mesh_ref mesh, HalfedgeHandle heh, bool end = false) : + GenericCirculatorBaseT(mesh, heh, end) { + + GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this->start_, this->lap_counter_); + } + GenericCirculatorT(const GenericCirculatorT &rhs) : GenericCirculatorBaseT(rhs) {} + + friend class GenericCirculatorT; + explicit GenericCirculatorT( const GenericCirculatorT& rhs ) + :GenericCirculatorBaseT(rhs){} + + GenericCirculatorT& operator++() { + assert(this->mesh_); + GenericCirculator_ValueHandleFns::increment(this->mesh_, this->heh_, this->start_, this->lap_counter_); + return *this; + } + GenericCirculatorT& operator--() { + assert(this->mesh_); + GenericCirculator_ValueHandleFns::decrement(this->mesh_, this->heh_, this->start_, this->lap_counter_); + return *this; + } + + /// Post-increment + GenericCirculatorT operator++(int) { + assert(this->mesh_); + GenericCirculatorT cpy(*this); + ++(*this); + return cpy; + } + + /// Post-decrement + GenericCirculatorT operator--(int) { + assert(this->mesh_); + GenericCirculatorT cpy(*this); + --(*this); + return cpy; + } + + /// Standard dereferencing operator. + value_type operator*() const { + // We can't use this due to a GCC6 compiler bug + const GenericCirculatorBaseT* self = this; +#ifndef NDEBUG + assert(this->heh_.is_valid()); + value_type res = (self->*Handle2Value)(); + assert(res.is_valid()); + return res; +#else + return (self->*Handle2Value)(); +#endif + } + + /** + * @brief Pointer dereferentiation. + * + * This returns a pointer which points to a handle + * that loses its validity once this dereferentiation is + * invoked again. Thus, do not store the result of + * this operation. + */ + pointer operator->() const { + pointer_deref_value = **this; + return &pointer_deref_value; + } + + GenericCirculatorT &operator=(const GenericCirculatorT &rhs) { + GenericCirculatorBaseT::operator=(rhs); + return *this; + }; + + bool operator==(const GenericCirculatorT &rhs) const { + return GenericCirculatorBaseT::operator==(rhs); + } + + bool operator!=(const GenericCirculatorT &rhs) const { + return GenericCirculatorBaseT::operator!=(rhs); + } + + bool is_valid() const { + return GenericCirculator_ValueHandleFns::is_valid(this->heh_, this->lap_counter_); + } + + template + friend STREAM &operator<< (STREAM &s, const GenericCirculatorT &self) { + return s << self.mesh_ << ", " << self.start_.idx() << ", " << self.heh_.idx() << ", " << self.lap_counter_; + } + + private: + mutable value_type pointer_deref_value; +}; + +////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////// OLD /////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// OLD CIRCULATORS +// deprecated circulators, will be removed soon +// if you remove these circulators and go to the old ones, PLEASE ENABLE FOLLOWING UNITTESTS: +// +// OpenMeshTrimeshCirculatorVertexIHalfEdge.VertexIHalfEdgeIterCheckInvalidationAtEnds +// OpenMeshTrimeshCirculatorVertexEdge.VertexEdgeIterCheckInvalidationAtEnds +// OpenMeshTrimeshCirculatorVertexVertex.VertexVertexIterCheckInvalidationAtEnds +// OpenMeshTrimeshCirculatorVertexOHalfEdge.VertexOHalfEdgeIterCheckInvalidationAtEnds +// OpenMeshTrimeshCirculatorVertexFace.VertexFaceIterCheckInvalidationAtEnds +// OpenMeshTrimeshCirculatorVertexFace.VertexFaceIterWithoutHolesDecrement +// OpenMeshTrimeshCirculatorFaceEdge.FaceEdgeIterCheckInvalidationAtEnds +// OpenMeshTrimeshCirculatorFaceFace.FaceFaceIterCheckInvalidationAtEnds +// OpenMeshTrimeshCirculatorFaceHalfEdge.FaceHalfedgeIterWithoutHolesIncrement +// OpenMeshTrimeshCirculatorFaceVertex.FaceVertexIterCheckInvalidationAtEnds +// OpenMeshTrimeshCirculatorFaceHalfEdge.FaceHalfedgeIterCheckInvalidationAtEnds +// + +template +class GenericCirculator_ValueHandleFnsT_DEPRECATED { + public: + inline static bool is_valid(const typename Mesh::HalfedgeHandle &heh,const typename Mesh::HalfedgeHandle &start, const int lap_counter) { + return ( heh.is_valid() && ((start != heh) || (lap_counter == 0 )) ); + } + inline static void init(const Mesh*, typename Mesh::HalfedgeHandle&, typename Mesh::HalfedgeHandle&, int&) {}; + inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + GenericCirculator_CenterEntityFnsT::increment(mesh, heh, start, lap_counter); + } + inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + GenericCirculator_CenterEntityFnsT::decrement(mesh, heh, start, lap_counter); + } +}; + +template +class GenericCirculator_ValueHandleFnsT_DEPRECATED { + public: + typedef GenericCirculator_DereferenciabilityCheckT GenericCirculator_DereferenciabilityCheck; + + inline static bool is_valid(const typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, const int lap_counter) { + return ( heh.is_valid() && ((start != heh) || (lap_counter == 0 ))); + } + inline static void init(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + if (heh.is_valid() && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh) && lap_counter == 0 ) + increment(mesh, heh, start, lap_counter); + }; + inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + do { + GenericCirculator_CenterEntityFnsT::increment(mesh, heh, start, lap_counter); + } while (is_valid(heh, start, lap_counter) && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh)); + } + inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) { + do { + GenericCirculator_CenterEntityFnsT::decrement(mesh, heh, start, lap_counter); + } while (is_valid(heh, start, lap_counter) && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh)); + } +}; + +template::*Handle2Value)() const> +class GenericCirculatorT_DEPRECATED : protected GenericCirculatorBaseT { + public: + typedef std::ptrdiff_t difference_type; + typedef ValueHandle value_type; + typedef const value_type& reference; + typedef const value_type* pointer; + typedef std::bidirectional_iterator_tag iterator_category; + + typedef typename GenericCirculatorBaseT::mesh_ptr mesh_ptr; + typedef typename GenericCirculatorBaseT::mesh_ref mesh_ref; + typedef GenericCirculator_ValueHandleFnsT_DEPRECATED GenericCirculator_ValueHandleFns; + + public: + GenericCirculatorT_DEPRECATED() {} + GenericCirculatorT_DEPRECATED(mesh_ref mesh, CenterEntityHandle start, bool end = false) : + GenericCirculatorBaseT(mesh, mesh.halfedge_handle(start), end) { + + GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this->start_, this->lap_counter_); + } + GenericCirculatorT_DEPRECATED(mesh_ref mesh, HalfedgeHandle heh, bool end = false) : + GenericCirculatorBaseT(mesh, heh, end) { + + GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this->start_, this->lap_counter_); + } + GenericCirculatorT_DEPRECATED(const GenericCirculatorT_DEPRECATED &rhs) : GenericCirculatorBaseT(rhs) {} + + GenericCirculatorT_DEPRECATED& operator++() { + assert(this->mesh_); + GenericCirculator_ValueHandleFns::increment(this->mesh_, this->heh_, this->start_, this->lap_counter_); + return *this; + } +#ifndef NO_DECREMENT_DEPRECATED_WARNINGS +#define DECREMENT_DEPRECATED_WARNINGS_TEXT "The current decrement operator has the unintended behavior that it stays\ + valid when iterating below the start and will visit the first entity\ + twice before getting invalid. Furthermore it gets valid again, if you\ + increment at the end.\ + When you are sure that you don't iterate below the start anywhere in\ + your code or rely on this behaviour, you can disable this warning by\ + setting the define NO_DECREMENT_DEPRECATED_WARNINGS at the command line (or enable it via the\ + cmake flags).\ + To be save, you can use the CW/CCW circulator definitions, which behave\ + the same as the original ones, without the previously mentioned issues." + + DEPRECATED( DECREMENT_DEPRECATED_WARNINGS_TEXT ) +#endif // NO_DECREMENT_DEPRECATED_WARNINGS + GenericCirculatorT_DEPRECATED& operator--() { + assert(this->mesh_); + GenericCirculator_ValueHandleFns::decrement(this->mesh_, this->heh_, this->start_, this->lap_counter_); + return *this; + } + + /// Post-increment + GenericCirculatorT_DEPRECATED operator++(int) { + assert(this->mesh_); + GenericCirculatorT_DEPRECATED cpy(*this); + ++(*this); + return cpy; + } + + /// Post-decrement +#ifndef NO_DECREMENT_DEPRECATED_WARNINGS + DEPRECATED( DECREMENT_DEPRECATED_WARNINGS_TEXT ) +#undef DECREMENT_DEPRECATED_WARNINGS_TEXT +#endif //NO_DECREMENT_DEPRECATED_WARNINGS + GenericCirculatorT_DEPRECATED operator--(int) { + assert(this->mesh_); + GenericCirculatorT_DEPRECATED cpy(*this); + --(*this); + return cpy; + } + + /// Standard dereferencing operator. + value_type operator*() const { + // We can't use this due to a GCC6 compiler bug + const GenericCirculatorBaseT* self = this; +#ifndef NDEBUG + assert(this->heh_.is_valid()); + value_type res = (self->*Handle2Value)(); + assert(res.is_valid()); + return res; +#else + return (self->*Handle2Value)(); +#endif + } + + /** + * @brief Pointer dereferentiation. + * + * This returns a pointer which points to a handle + * that loses its validity once this dereferentiation is + * invoked again. Thus, do not store the result of + * this operation. + */ + pointer operator->() const { + pointer_deref_value = **this; + return &pointer_deref_value; + } + + GenericCirculatorT_DEPRECATED &operator=(const GenericCirculatorT_DEPRECATED &rhs) { + GenericCirculatorBaseT::operator=(rhs); + return *this; + }; + + bool operator==(const GenericCirculatorT_DEPRECATED &rhs) const { + return GenericCirculatorBaseT::operator==(rhs); + } + + bool operator!=(const GenericCirculatorT_DEPRECATED &rhs) const { + return GenericCirculatorBaseT::operator!=(rhs); + } + + bool is_valid() const { + return GenericCirculator_ValueHandleFns::is_valid(this->heh_,this->start_, this->lap_counter_); + } + + DEPRECATED("current_halfedge_handle() is an implementation detail and should not be accessed from outside the iterator class.") + /** + * \deprecated + * current_halfedge_handle() is an implementation detail and should not + * be accessed from outside the iterator class. + */ + const HalfedgeHandle ¤t_halfedge_handle() const { + return this->heh_; + } + + DEPRECATED("Do not use this error prone implicit cast. Compare to end-iterator or use is_valid(), instead.") + /** + * \deprecated + * Do not use this error prone implicit cast. Compare to the + * end-iterator or use is_valid() instead. + */ + operator bool() const { + return is_valid(); + } + + /** + * \brief Return the handle of the current target. + * \deprecated + * This function clutters your code. Use dereferencing operators -> and * instead. + */ + DEPRECATED("This function clutters your code. Use dereferencing operators -> and * instead.") + value_type handle() const { + return **this; + } + + /** + * \brief Cast to the handle of the current target. + * \deprecated + * Implicit casts of iterators are unsafe. Use dereferencing operators + * -> and * instead. + */ + DEPRECATED("Implicit casts of iterators are unsafe. Use dereferencing operators -> and * instead.") + operator value_type() const { + return **this; + } + + template + friend STREAM &operator<< (STREAM &s, const GenericCirculatorT_DEPRECATED &self) { + return s << self.mesh_ << ", " << self.start_.idx() << ", " << self.heh_.idx() << ", " << self.lap_counter_; + } + + private: + mutable value_type pointer_deref_value; +}; + +} // namespace Iterators +} // namespace OpenMesh + +#endif diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/FinalMeshItemsT.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/FinalMeshItemsT.hh new file mode 100644 index 0000000..cbed2e5 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/FinalMeshItemsT.hh @@ -0,0 +1,227 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef OPENMESH_MESH_ITEMS_HH +#define OPENMESH_MESH_ITEMS_HH + + +//== INCLUDES ================================================================= + + +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + + +//== CLASS DEFINITION ========================================================= + +/// Definition of the mesh entities (items). +template +struct FinalMeshItemsT +{ + //--- build Refs structure --- +#ifndef DOXY_IGNORE_THIS + struct Refs + { + typedef typename Traits::Point Point; + typedef typename vector_traits::value_type Scalar; + + typedef typename Traits::Normal Normal; + typedef typename Traits::Color Color; + typedef typename Traits::TexCoord1D TexCoord1D; + typedef typename Traits::TexCoord2D TexCoord2D; + typedef typename Traits::TexCoord3D TexCoord3D; + typedef typename Traits::TextureIndex TextureIndex; + typedef OpenMesh::VertexHandle VertexHandle; + typedef OpenMesh::FaceHandle FaceHandle; + typedef OpenMesh::EdgeHandle EdgeHandle; + typedef OpenMesh::HalfedgeHandle HalfedgeHandle; + }; +#endif + //--- export Refs types --- + typedef typename Refs::Point Point; + typedef typename Refs::Scalar Scalar; + typedef typename Refs::Normal Normal; + typedef typename Refs::Color Color; + typedef typename Refs::TexCoord1D TexCoord1D; + typedef typename Refs::TexCoord2D TexCoord2D; + typedef typename Refs::TexCoord3D TexCoord3D; + typedef typename Refs::TextureIndex TextureIndex; + + //--- get attribute bits from Traits --- + enum Attribs + { + VAttribs = Traits::VertexAttributes, + HAttribs = Traits::HalfedgeAttributes, + EAttribs = Traits::EdgeAttributes, + FAttribs = Traits::FaceAttributes + }; + //--- merge internal items with traits items --- + + +/* + typedef typename GenProg::IF< + (bool)(HAttribs & Attributes::PrevHalfedge), + typename InternalItems::Halfedge_with_prev, + typename InternalItems::Halfedge_without_prev + >::Result InternalHalfedge; +*/ + //typedef typename InternalItems::Vertex InternalVertex; + //typedef typename InternalItems::template Edge InternalEdge; + //typedef typename InternalItems::template Face InternalFace; + class ITraits + {}; + + typedef typename Traits::template VertexT VertexData; + typedef typename Traits::template HalfedgeT HalfedgeData; + typedef typename Traits::template EdgeT EdgeData; + typedef typename Traits::template FaceT FaceData; +}; + + +#ifndef DOXY_IGNORE_THIS +namespace { +namespace TM { +template struct TypeEquality; +template struct TypeEquality {}; + +template struct ItemsEquality { + TypeEquality te1; + TypeEquality te2; + TypeEquality te3; + TypeEquality te4; + TypeEquality te5; + TypeEquality te6; + TypeEquality te7; + TypeEquality te8; +}; + +} /* namespace TM */ +} /* anonymous namespace */ +#endif + +/** + * @brief Cast a mesh with different but identical traits into each other. + * + * Note that there exists a syntactically more convenient global method + * mesh_cast(). + * + * Example: + * @code{.cpp} + * struct TriTraits1 : public OpenMesh::DefaultTraits { + * typedef Vec3d Point; + * }; + * struct TriTraits2 : public OpenMesh::DefaultTraits { + * typedef Vec3d Point; + * }; + * struct TriTraits3 : public OpenMesh::DefaultTraits { + * typedef Vec3f Point; + * }; + * + * TriMesh_ArrayKernelT a; + * TriMesh_ArrayKernelT &b = MeshCast&, TriMesh_ArrayKernelT&>::cast(a); // OK + * TriMesh_ArrayKernelT &c = MeshCast&, TriMesh_ArrayKernelT&>::cast(a); // ERROR + * @endcode + * + * @see mesh_cast() + * + * @param rhs + * @return + */ +template struct MeshCast; + +template +struct MeshCast { + static LhsMeshT &cast(RhsMeshT &rhs) { + (void)sizeof(TM::ItemsEquality); + (void)sizeof(TM::TypeEquality); + return reinterpret_cast(rhs); + } +}; + +template +struct MeshCast { + static const LhsMeshT &cast(const RhsMeshT &rhs) { + (void)sizeof(TM::ItemsEquality); + (void)sizeof(TM::TypeEquality); + return reinterpret_cast(rhs); + } +}; + +template +struct MeshCast { + static LhsMeshT *cast(RhsMeshT *rhs) { + (void)sizeof(TM::ItemsEquality); + (void)sizeof(TM::TypeEquality); + return reinterpret_cast(rhs); + } +}; + +template +struct MeshCast { + static const LhsMeshT *cast(const RhsMeshT *rhs) { + (void)sizeof(TM::ItemsEquality); + (void)sizeof(TM::TypeEquality); + return reinterpret_cast(rhs); + } +}; + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_MESH_ITEMS_HH defined +//============================================================================= + diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/Handles.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/Handles.hh new file mode 100644 index 0000000..68ac1d7 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/Handles.hh @@ -0,0 +1,238 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef OPENMESH_HANDLES_HH +#define OPENMESH_HANDLES_HH + + +//== INCLUDES ================================================================= + +#include +#include + + +//== NAMESPACES =============================================================== + +namespace OpenMesh { + +//== CLASS DEFINITION ========================================================= + + +/// Base class for all handle types +class BaseHandle +{ +public: + + explicit BaseHandle(int _idx=-1) : idx_(_idx) {} + + /// Get the underlying index of this handle + int idx() const { return idx_; } + + /// The handle is valid iff the index is not negative. + bool is_valid() const { return idx_ >= 0; } + + /// reset handle to be invalid + void reset() { idx_=-1; } + /// reset handle to be invalid + void invalidate() { idx_ = -1; } + + bool operator==(const BaseHandle& _rhs) const { + return (this->idx_ == _rhs.idx_); + } + + bool operator!=(const BaseHandle& _rhs) const { + return (this->idx_ != _rhs.idx_); + } + + bool operator<(const BaseHandle& _rhs) const { + return (this->idx_ < _rhs.idx_); + } + + + // this is to be used only by the iterators + void __increment() { ++idx_; } + void __decrement() { --idx_; } + + void __increment(int amount) { idx_ += amount; } + void __decrement(int amount) { idx_ -= amount; } + +private: + + int idx_; +}; + +// this is used by boost::unordered_set/map +inline size_t hash_value(const BaseHandle& h) { return h.idx(); } + +//----------------------------------------------------------------------------- + +/// Write handle \c _hnd to stream \c _os +inline std::ostream& operator<<(std::ostream& _os, const BaseHandle& _hnd) +{ + return (_os << _hnd.idx()); +} + + +//----------------------------------------------------------------------------- + + +/// Handle for a vertex entity +struct VertexHandle : public BaseHandle +{ + explicit VertexHandle(int _idx=-1) : BaseHandle(_idx) {} +}; + + +/// Handle for a halfedge entity +struct HalfedgeHandle : public BaseHandle +{ + explicit HalfedgeHandle(int _idx=-1) : BaseHandle(_idx) {} +}; + + +/// Handle for a edge entity +struct EdgeHandle : public BaseHandle +{ + explicit EdgeHandle(int _idx=-1) : BaseHandle(_idx) {} +}; + + +/// Handle for a face entity +struct FaceHandle : public BaseHandle +{ + explicit FaceHandle(int _idx=-1) : BaseHandle(_idx) {} +}; + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= + +#ifdef OM_HAS_HASH +#include +namespace std { + +#if defined(_MSVC_VER) +# pragma warning(push) +# pragma warning(disable:4099) // For VC++ it is class hash +#endif + + +template <> +struct hash +{ + typedef OpenMesh::BaseHandle argument_type; + typedef std::size_t result_type; + + std::size_t operator()(const OpenMesh::BaseHandle& h) const + { + return h.idx(); + } +}; + +template <> +struct hash +{ + typedef OpenMesh::VertexHandle argument_type; + typedef std::size_t result_type; + + std::size_t operator()(const OpenMesh::VertexHandle& h) const + { + return h.idx(); + } +}; + +template <> +struct hash +{ + + typedef OpenMesh::HalfedgeHandle argument_type; + typedef std::size_t result_type; + + std::size_t operator()(const OpenMesh::HalfedgeHandle& h) const + { + return h.idx(); + } +}; + +template <> +struct hash +{ + + typedef OpenMesh::EdgeHandle argument_type; + typedef std::size_t result_type; + + std::size_t operator()(const OpenMesh::EdgeHandle& h) const + { + return h.idx(); + } +}; + +template <> +struct hash +{ + + typedef OpenMesh::FaceHandle argument_type; + typedef std::size_t result_type; + + std::size_t operator()(const OpenMesh::FaceHandle& h) const + { + return h.idx(); + } +}; + +#if defined(_MSVC_VER) +# pragma warning(pop) +#endif + +} +#endif // OM_HAS_HASH + + +#endif // OPENMESH_HANDLES_HH +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/IteratorsT.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/IteratorsT.hh new file mode 100644 index 0000000..6d2c92b --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/IteratorsT.hh @@ -0,0 +1,259 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef OPENMESH_ITERATORS_HH +#define OPENMESH_ITERATORS_HH + +//============================================================================= +// +// Iterators for PolyMesh/TriMesh +// +//============================================================================= + + + +//== INCLUDES ================================================================= + +#include +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + +namespace OpenMesh { +namespace Iterators { + + +//== FORWARD DECLARATIONS ===================================================== + + +template class ConstVertexIterT; +template class VertexIterT; +template class ConstHalfedgeIterT; +template class HalfedgeIterT; +template class ConstEdgeIterT; +template class EdgeIterT; +template class ConstFaceIterT; +template class FaceIterT; + + +template +class GenericIteratorT { + public: + //--- Typedefs --- + + typedef ValueHandle value_handle; + typedef value_handle value_type; + typedef std::bidirectional_iterator_tag iterator_category; + typedef std::ptrdiff_t difference_type; + typedef const value_type& reference; + typedef const value_type* pointer; + typedef const Mesh* mesh_ptr; + typedef const Mesh& mesh_ref; + + /// Default constructor. + GenericIteratorT() + : mesh_(0), skip_bits_(0) + {} + + /// Construct with mesh and a target handle. + GenericIteratorT(mesh_ref _mesh, value_handle _hnd, bool _skip=false) + : mesh_(&_mesh), hnd_(_hnd), skip_bits_(0) + { + if (_skip) enable_skipping(); + } + + /// Standard dereferencing operator. + reference operator*() const { + return hnd_; + } + + /// Standard pointer operator. + pointer operator->() const { + return &hnd_; + } + + /** + * \brief Get the handle of the item the iterator refers to. + * \deprecated + * This function clutters your code. Use dereferencing operators -> and * instead. + */ + DEPRECATED("This function clutters your code. Use dereferencing operators -> and * instead.") + value_handle handle() const { + return hnd_; + } + + /** + * \brief Cast to the handle of the item the iterator refers to. + * \deprecated + * Implicit casts of iterators are unsafe. Use dereferencing operators + * -> and * instead. + */ + DEPRECATED("Implicit casts of iterators are unsafe. Use dereferencing operators -> and * instead.") + operator value_handle() const { + return hnd_; + } + + /// Are two iterators equal? Only valid if they refer to the same mesh! + bool operator==(const GenericIteratorT& _rhs) const { + return ((mesh_ == _rhs.mesh_) && (hnd_ == _rhs.hnd_)); + } + + /// Not equal? + bool operator!=(const GenericIteratorT& _rhs) const { + return !operator==(_rhs); + } + + /// Standard pre-increment operator + GenericIteratorT& operator++() { + hnd_.__increment(); + if (skip_bits_) + skip_fwd(); + return *this; + } + + /// Standard post-increment operator + GenericIteratorT operator++(int) { + GenericIteratorT cpy(*this); + ++(*this); + return cpy; + } + +#if ((defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENMESH_VECTOR_LEGACY) + template + auto operator+=(int amount) -> + typename std::enable_if< + sizeof(decltype(std::declval().__increment(amount))) >= 0, + GenericIteratorT&>::type { + static_assert(std::is_same::value, + "Template parameter must not deviate from default."); + if (skip_bits_) + throw std::logic_error("Skipping iterators do not support " + "random access."); + hnd_.__increment(amount); + return *this; + } + + template + auto operator+(int rhs) -> + typename std::enable_if< + sizeof(decltype(std::declval().__increment(rhs), void (), int {})) >= 0, + GenericIteratorT>::type { + static_assert(std::is_same::value, + "Template parameter must not deviate from default."); + if (skip_bits_) + throw std::logic_error("Skipping iterators do not support " + "random access."); + GenericIteratorT result = *this; + result.hnd_.__increment(rhs); + return result; + } +#endif + + /// Standard pre-decrement operator + GenericIteratorT& operator--() { + hnd_.__decrement(); + if (skip_bits_) + skip_bwd(); + return *this; + } + + /// Standard post-decrement operator + GenericIteratorT operator--(int) { + GenericIteratorT cpy(*this); + --(*this); + return cpy; + } + + /// Turn on skipping: automatically skip deleted/hidden elements + void enable_skipping() { + if (mesh_ && (mesh_->*PrimitiveStatusMember)()) { + Attributes::StatusInfo status; + status.set_deleted(true); + status.set_hidden(true); + skip_bits_ = status.bits(); + skip_fwd(); + } else + skip_bits_ = 0; + } + + /// Turn on skipping: automatically skip deleted/hidden elements + void disable_skipping() { + skip_bits_ = 0; + } + + private: + + void skip_fwd() { + assert(mesh_ && skip_bits_); + while ((hnd_.idx() < (signed) (mesh_->*PrimitiveCountMember)()) + && (mesh_->status(hnd_).bits() & skip_bits_)) + hnd_.__increment(); + } + + void skip_bwd() { + assert(mesh_ && skip_bits_); + while ((hnd_.idx() >= 0) && (mesh_->status(hnd_).bits() & skip_bits_)) + hnd_.__decrement(); + } + + protected: + mesh_ptr mesh_; + value_handle hnd_; + unsigned int skip_bits_; +}; + +//============================================================================= +} // namespace Iterators +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/PolyConnectivity.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/PolyConnectivity.hh new file mode 100644 index 0000000..d2ce667 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/PolyConnectivity.hh @@ -0,0 +1,1635 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef OPENMESH_POLYCONNECTIVITY_HH +#define OPENMESH_POLYCONNECTIVITY_HH + +#include +#include +#include + +namespace OpenMesh +{ + +/** \brief Connectivity Class for polygonal meshes +*/ +class OPENMESHDLLEXPORT PolyConnectivity : public ArrayKernel +{ +public: + /// \name Mesh Handles + //@{ + /// Invalid handle + static const VertexHandle InvalidVertexHandle; + /// Invalid handle + static const HalfedgeHandle InvalidHalfedgeHandle; + /// Invalid handle + static const EdgeHandle InvalidEdgeHandle; + /// Invalid handle + static const FaceHandle InvalidFaceHandle; + //@} + + typedef PolyConnectivity This; + + //--- iterators --- + + /** \name Mesh Iterators + Refer to OpenMesh::Mesh::Iterators or \ref mesh_iterators for + documentation. + */ + //@{ + /// Linear iterator + typedef Iterators::GenericIteratorT VertexIter; + typedef Iterators::GenericIteratorT HalfedgeIter; + typedef Iterators::GenericIteratorT EdgeIter; + typedef Iterators::GenericIteratorT FaceIter; + + typedef VertexIter ConstVertexIter; + typedef HalfedgeIter ConstHalfedgeIter; + typedef EdgeIter ConstEdgeIter; + typedef FaceIter ConstFaceIter; + //@} + + //--- circulators --- + + /** \name Mesh Circulators + Refer to OpenMesh::Mesh::Iterators or \ref mesh_iterators + for documentation. + */ + //@{ + + /* + * Vertex-centered circulators + */ + + /** + * Enumerates 1-ring vertices in a clockwise fashion. + */ + typedef Iterators::GenericCirculatorT_DEPRECATED::toVertexHandle> + VertexVertexIter; + typedef Iterators::GenericCirculatorT::toVertexHandle> VertexVertexCWIter; + + /** + * Enumerates 1-ring vertices in a counter clockwise fashion. + */ + typedef Iterators::GenericCirculatorT::toVertexHandle, false> + VertexVertexCCWIter; + + /** + * Enumerates outgoing half edges in a clockwise fashion. + */ + typedef Iterators::GenericCirculatorT_DEPRECATED::toHalfedgeHandle> + VertexOHalfedgeIter; + typedef Iterators::GenericCirculatorT::toHalfedgeHandle> VertexOHalfedgeCWIter; + + /** + * Enumerates outgoing half edges in a counter clockwise fashion. + */ + typedef Iterators::GenericCirculatorT::toHalfedgeHandle, false> + VertexOHalfedgeCCWIter; + + /** + * Enumerates incoming half edges in a clockwise fashion. + */ + typedef Iterators::GenericCirculatorT_DEPRECATED::toOppositeHalfedgeHandle> + VertexIHalfedgeIter; + typedef Iterators::GenericCirculatorT::toOppositeHalfedgeHandle> VertexIHalfedgeCWIter; + + /** + * Enumerates incoming half edges in a counter clockwise fashion. + */ + typedef Iterators::GenericCirculatorT::toOppositeHalfedgeHandle, false> + VertexIHalfedgeCCWIter; + + /** + * Enumerates incident faces in a clockwise fashion. + */ + typedef Iterators::GenericCirculatorT_DEPRECATED::toFaceHandle> + VertexFaceIter; + typedef Iterators::GenericCirculatorT::toFaceHandle> VertexFaceCWIter; + + /** + * Enumerates incident faces in a counter clockwise fashion. + */ + typedef Iterators::GenericCirculatorT::toFaceHandle, false> + VertexFaceCCWIter; + + /** + * Enumerates incident edges in a clockwise fashion. + */ + typedef Iterators::GenericCirculatorT_DEPRECATED::toEdgeHandle> + VertexEdgeIter; + typedef Iterators::GenericCirculatorT::toEdgeHandle> VertexEdgeCWIter; + /** + * Enumerates incident edges in a counter clockwise fashion. + */ + typedef Iterators::GenericCirculatorT::toEdgeHandle, false> + VertexEdgeCCWIter; + + /** + * Identical to #FaceHalfedgeIter. God knows why this typedef exists. + */ + typedef Iterators::GenericCirculatorT_DEPRECATED::toHalfedgeHandle> + HalfedgeLoopIter; + typedef Iterators::GenericCirculatorT::toHalfedgeHandle, false> HalfedgeLoopCWIter; + /** + * Identical to #FaceHalfedgeIter. God knows why this typedef exists. + */ + typedef Iterators::GenericCirculatorT::toHalfedgeHandle> + HalfedgeLoopCCWIter; + + typedef VertexVertexIter ConstVertexVertexIter; + typedef VertexVertexCWIter ConstVertexVertexCWIter; + typedef VertexVertexCCWIter ConstVertexVertexCCWIter; + typedef VertexOHalfedgeIter ConstVertexOHalfedgeIter; + typedef VertexOHalfedgeCWIter ConstVertexOHalfedgeCWIter; + typedef VertexOHalfedgeCCWIter ConstVertexOHalfedgeCCWIter; + typedef VertexIHalfedgeIter ConstVertexIHalfedgeIter; + typedef VertexIHalfedgeCWIter ConstVertexIHalfedgeCWIter; + typedef VertexIHalfedgeCCWIter ConstVertexIHalfedgeCCWIter; + typedef VertexFaceIter ConstVertexFaceIter; + typedef VertexFaceCWIter ConstVertexFaceCWIter; + typedef VertexFaceCCWIter ConstVertexFaceCCWIter; + typedef VertexEdgeIter ConstVertexEdgeIter; + typedef VertexEdgeCWIter ConstVertexEdgeCWIter; + typedef VertexEdgeCCWIter ConstVertexEdgeCCWIter; + + /* + * Face-centered circulators + */ + + /** + * Enumerate incident vertices in a counter clockwise fashion. + */ + typedef Iterators::GenericCirculatorT_DEPRECATED::toVertexHandle> + FaceVertexIter; + typedef Iterators::GenericCirculatorT::toVertexHandle> FaceVertexCCWIter; + + /** + * Enumerate incident vertices in a clockwise fashion. + */ + typedef Iterators::GenericCirculatorT::toVertexHandle, false> + FaceVertexCWIter; + + /** + * Enumerate incident half edges in a counter clockwise fashion. + */ + typedef Iterators::GenericCirculatorT_DEPRECATED::toHalfedgeHandle> + FaceHalfedgeIter; + typedef Iterators::GenericCirculatorT::toHalfedgeHandle> FaceHalfedgeCCWIter; + + /** + * Enumerate incident half edges in a clockwise fashion. + */ + typedef Iterators::GenericCirculatorT::toHalfedgeHandle, false> + FaceHalfedgeCWIter; + + /** + * Enumerate incident edges in a counter clockwise fashion. + */ + typedef Iterators::GenericCirculatorT_DEPRECATED::toEdgeHandle> + FaceEdgeIter; + typedef Iterators::GenericCirculatorT::toEdgeHandle> FaceEdgeCCWIter; + + /** + * Enumerate incident edges in a clockwise fashion. + */ + typedef Iterators::GenericCirculatorT::toEdgeHandle, false> + FaceEdgeCWIter; + + /** + * Enumerate adjacent faces in a counter clockwise fashion. + */ + typedef Iterators::GenericCirculatorT_DEPRECATED::toOppositeFaceHandle> + FaceFaceIter; + typedef Iterators::GenericCirculatorT::toOppositeFaceHandle> FaceFaceCCWIter; + + /** + * Enumerate adjacent faces in a clockwise fashion. + */ + typedef Iterators::GenericCirculatorT::toOppositeFaceHandle, false> + FaceFaceCWIter; + + typedef FaceVertexIter ConstFaceVertexIter; + typedef FaceVertexCWIter ConstFaceVertexCWIter; + typedef FaceVertexCCWIter ConstFaceVertexCCWIter; + typedef FaceHalfedgeIter ConstFaceHalfedgeIter; + typedef FaceHalfedgeCWIter ConstFaceHalfedgeCWIter; + typedef FaceHalfedgeCCWIter ConstFaceHalfedgeCCWIter; + typedef FaceEdgeIter ConstFaceEdgeIter; + typedef FaceEdgeCWIter ConstFaceEdgeCWIter; + typedef FaceEdgeCCWIter ConstFaceEdgeCCWIter; + typedef FaceFaceIter ConstFaceFaceIter; + typedef FaceFaceCWIter ConstFaceFaceCWIter; + typedef FaceFaceCCWIter ConstFaceFaceCCWIter; + + /* + * Halfedge circulator + */ + typedef HalfedgeLoopIter ConstHalfedgeLoopIter; + typedef HalfedgeLoopCWIter ConstHalfedgeLoopCWIter; + typedef HalfedgeLoopCCWIter ConstHalfedgeLoopCCWIter; + + //@} + + // --- shortcuts + + /** \name Typedef Shortcuts + Provided for convenience only + */ + //@{ + /// Alias typedef + typedef VertexHandle VHandle; + typedef HalfedgeHandle HHandle; + typedef EdgeHandle EHandle; + typedef FaceHandle FHandle; + + typedef VertexIter VIter; + typedef HalfedgeIter HIter; + typedef EdgeIter EIter; + typedef FaceIter FIter; + + typedef ConstVertexIter CVIter; + typedef ConstHalfedgeIter CHIter; + typedef ConstEdgeIter CEIter; + typedef ConstFaceIter CFIter; + + typedef VertexVertexIter VVIter; + typedef VertexVertexCWIter VVCWIter; + typedef VertexVertexCCWIter VVCCWIter; + typedef VertexOHalfedgeIter VOHIter; + typedef VertexOHalfedgeCWIter VOHCWIter; + typedef VertexOHalfedgeCCWIter VOHCCWIter; + typedef VertexIHalfedgeIter VIHIter; + typedef VertexIHalfedgeCWIter VIHICWter; + typedef VertexIHalfedgeCCWIter VIHICCWter; + typedef VertexEdgeIter VEIter; + typedef VertexEdgeCWIter VECWIter; + typedef VertexEdgeCCWIter VECCWIter; + typedef VertexFaceIter VFIter; + typedef VertexFaceCWIter VFCWIter; + typedef VertexFaceCCWIter VFCCWIter; + typedef FaceVertexIter FVIter; + typedef FaceVertexCWIter FVCWIter; + typedef FaceVertexCCWIter FVCCWIter; + typedef FaceHalfedgeIter FHIter; + typedef FaceHalfedgeCWIter FHCWIter; + typedef FaceHalfedgeCCWIter FHCWWIter; + typedef FaceEdgeIter FEIter; + typedef FaceEdgeCWIter FECWIter; + typedef FaceEdgeCCWIter FECWWIter; + typedef FaceFaceIter FFIter; + + typedef ConstVertexVertexIter CVVIter; + typedef ConstVertexVertexCWIter CVVCWIter; + typedef ConstVertexVertexCCWIter CVVCCWIter; + typedef ConstVertexOHalfedgeIter CVOHIter; + typedef ConstVertexOHalfedgeCWIter CVOHCWIter; + typedef ConstVertexOHalfedgeCCWIter CVOHCCWIter; + typedef ConstVertexIHalfedgeIter CVIHIter; + typedef ConstVertexIHalfedgeCWIter CVIHCWIter; + typedef ConstVertexIHalfedgeCCWIter CVIHCCWIter; + typedef ConstVertexEdgeIter CVEIter; + typedef ConstVertexEdgeCWIter CVECWIter; + typedef ConstVertexEdgeCCWIter CVECCWIter; + typedef ConstVertexFaceIter CVFIter; + typedef ConstVertexFaceCWIter CVFCWIter; + typedef ConstVertexFaceCCWIter CVFCCWIter; + typedef ConstFaceVertexIter CFVIter; + typedef ConstFaceVertexCWIter CFVCWIter; + typedef ConstFaceVertexCCWIter CFVCCWIter; + typedef ConstFaceHalfedgeIter CFHIter; + typedef ConstFaceHalfedgeCWIter CFHCWIter; + typedef ConstFaceHalfedgeCCWIter CFHCCWIter; + typedef ConstFaceEdgeIter CFEIter; + typedef ConstFaceEdgeCWIter CFECWIter; + typedef ConstFaceEdgeCCWIter CFECCWIter; + typedef ConstFaceFaceIter CFFIter; + typedef ConstFaceFaceCWIter CFFCWIter; + typedef ConstFaceFaceCCWIter CFFCCWIter; + //@} + +public: + + PolyConnectivity() {} + virtual ~PolyConnectivity() {} + + inline static bool is_triangles() + { return false; } + + /** assign_connectivity() method. See ArrayKernel::assign_connectivity() + for more details. */ + inline void assign_connectivity(const PolyConnectivity& _other) + { ArrayKernel::assign_connectivity(_other); } + + /** \name Adding items to a mesh + */ + //@{ + + /// Add a new vertex + inline VertexHandle add_vertex() + { return new_vertex(); } + + /** \brief Add and connect a new face + * + * Create a new face consisting of the vertices provided by the vertex handle vector. + * (The vertices have to be already added to the mesh by add_vertex) + * + * @param _vhandles sorted list of vertex handles (also defines order in which the vertices are added to the face) + */ + FaceHandle add_face(const std::vector& _vhandles); + + + /** \brief Add and connect a new face + * + * Create a new face consisting of three vertices provided by the handles. + * (The vertices have to be already added to the mesh by add_vertex) + * + * @param _vh0 First vertex handle + * @param _vh1 Second vertex handle + * @param _vh2 Third vertex handle + */ + FaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2); + + /** \brief Add and connect a new face + * + * Create a new face consisting of four vertices provided by the handles. + * (The vertices have to be already added to the mesh by add_vertex) + * + * @param _vh0 First vertex handle + * @param _vh1 Second vertex handle + * @param _vh2 Third vertex handle + * @param _vh3 Fourth vertex handle + */ + FaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2, VertexHandle _vh3); + + /** \brief Add and connect a new face + * + * Create a new face consisting of vertices provided by a handle array. + * (The vertices have to be already added to the mesh by add_vertex) + * + * @param _vhandles pointer to a sorted list of vertex handles (also defines order in which the vertices are added to the face) + * @param _vhs_size number of vertex handles in the array + */ + FaceHandle add_face(const VertexHandle* _vhandles, size_t _vhs_size); + + //@} + + /// \name Deleting mesh items and other connectivity/topology modifications + //@{ + + /** Returns whether collapsing halfedge _heh is ok or would lead to + topological inconsistencies. + \attention This method need the Attributes::Status attribute and + changes the \em tagged bit. */ + bool is_collapse_ok(HalfedgeHandle _he); + + + /** Mark vertex and all incident edges and faces deleted. + Items marked deleted will be removed by garbageCollection(). + \attention Needs the Attributes::Status attribute for vertices, + edges and faces. + */ + void delete_vertex(VertexHandle _vh, bool _delete_isolated_vertices = true); + + /** Mark edge (two opposite halfedges) and incident faces deleted. + Resulting isolated vertices are marked deleted if + _delete_isolated_vertices is true. Items marked deleted will be + removed by garbageCollection(). + + \attention Needs the Attributes::Status attribute for vertices, + edges and faces. + */ + void delete_edge(EdgeHandle _eh, bool _delete_isolated_vertices=true); + + /** Delete face _fh and resulting degenerated empty halfedges as + well. Resulting isolated vertices will be deleted if + _delete_isolated_vertices is true. + + \attention All item will only be marked to be deleted. They will + actually be removed by calling garbage_collection(). + + \attention Needs the Attributes::Status attribute for vertices, + edges and faces. + */ + void delete_face(FaceHandle _fh, bool _delete_isolated_vertices=true); + + //@} + + /** \name Begin and end iterators + */ + //@{ + + /// Begin iterator for vertices + VertexIter vertices_begin(); + /// Const begin iterator for vertices + ConstVertexIter vertices_begin() const; + /// End iterator for vertices + VertexIter vertices_end(); + /// Const end iterator for vertices + ConstVertexIter vertices_end() const; + + /// Begin iterator for halfedges + HalfedgeIter halfedges_begin(); + /// Const begin iterator for halfedges + ConstHalfedgeIter halfedges_begin() const; + /// End iterator for halfedges + HalfedgeIter halfedges_end(); + /// Const end iterator for halfedges + ConstHalfedgeIter halfedges_end() const; + + /// Begin iterator for edges + EdgeIter edges_begin(); + /// Const begin iterator for edges + ConstEdgeIter edges_begin() const; + /// End iterator for edges + EdgeIter edges_end(); + /// Const end iterator for edges + ConstEdgeIter edges_end() const; + + /// Begin iterator for faces + FaceIter faces_begin(); + /// Const begin iterator for faces + ConstFaceIter faces_begin() const; + /// End iterator for faces + FaceIter faces_end(); + /// Const end iterator for faces + ConstFaceIter faces_end() const; + //@} + + + /** \name Begin for skipping iterators + */ + //@{ + + /// Begin iterator for vertices + VertexIter vertices_sbegin() + { return VertexIter(*this, VertexHandle(0), true); } + /// Const begin iterator for vertices + ConstVertexIter vertices_sbegin() const + { return ConstVertexIter(*this, VertexHandle(0), true); } + + /// Begin iterator for halfedges + HalfedgeIter halfedges_sbegin() + { return HalfedgeIter(*this, HalfedgeHandle(0), true); } + /// Const begin iterator for halfedges + ConstHalfedgeIter halfedges_sbegin() const + { return ConstHalfedgeIter(*this, HalfedgeHandle(0), true); } + + /// Begin iterator for edges + EdgeIter edges_sbegin() + { return EdgeIter(*this, EdgeHandle(0), true); } + /// Const begin iterator for edges + ConstEdgeIter edges_sbegin() const + { return ConstEdgeIter(*this, EdgeHandle(0), true); } + + /// Begin iterator for faces + FaceIter faces_sbegin() + { return FaceIter(*this, FaceHandle(0), true); } + /// Const begin iterator for faces + ConstFaceIter faces_sbegin() const + { return ConstFaceIter(*this, FaceHandle(0), true); } + + //@} + + //--- circulators --- + + /** \name Vertex and Face circulators + */ + //@{ + + /// vertex - vertex circulator + VertexVertexIter vv_iter(VertexHandle _vh) + { return VertexVertexIter(*this, _vh); } + /// vertex - vertex circulator cw + VertexVertexCWIter vv_cwiter(VertexHandle _vh) + { return VertexVertexCWIter(*this, _vh); } + /// vertex - vertex circulator ccw + VertexVertexCCWIter vv_ccwiter(VertexHandle _vh) + { return VertexVertexCCWIter(*this, _vh); } + /// vertex - incoming halfedge circulator + VertexIHalfedgeIter vih_iter(VertexHandle _vh) + { return VertexIHalfedgeIter(*this, _vh); } + /// vertex - incoming halfedge circulator cw + VertexIHalfedgeCWIter vih_cwiter(VertexHandle _vh) + { return VertexIHalfedgeCWIter(*this, _vh); } + /// vertex - incoming halfedge circulator ccw + VertexIHalfedgeCCWIter vih_ccwiter(VertexHandle _vh) + { return VertexIHalfedgeCCWIter(*this, _vh); } + /// vertex - outgoing halfedge circulator + VertexOHalfedgeIter voh_iter(VertexHandle _vh) + { return VertexOHalfedgeIter(*this, _vh); } + /// vertex - outgoing halfedge circulator cw + VertexOHalfedgeCWIter voh_cwiter(VertexHandle _vh) + { return VertexOHalfedgeCWIter(*this, _vh); } + /// vertex - outgoing halfedge circulator ccw + VertexOHalfedgeCCWIter voh_ccwiter(VertexHandle _vh) + { return VertexOHalfedgeCCWIter(*this, _vh); } + /// vertex - edge circulator + VertexEdgeIter ve_iter(VertexHandle _vh) + { return VertexEdgeIter(*this, _vh); } + /// vertex - edge circulator cw + VertexEdgeCWIter ve_cwiter(VertexHandle _vh) + { return VertexEdgeCWIter(*this, _vh); } + /// vertex - edge circulator ccw + VertexEdgeCCWIter ve_ccwiter(VertexHandle _vh) + { return VertexEdgeCCWIter(*this, _vh); } + /// vertex - face circulator + VertexFaceIter vf_iter(VertexHandle _vh) + { return VertexFaceIter(*this, _vh); } + /// vertex - face circulator cw + VertexFaceCWIter vf_cwiter(VertexHandle _vh) + { return VertexFaceCWIter(*this, _vh); } + /// vertex - face circulator ccw + VertexFaceCCWIter vf_ccwiter(VertexHandle _vh) + { return VertexFaceCCWIter(*this, _vh); } + + /// const vertex circulator + ConstVertexVertexIter cvv_iter(VertexHandle _vh) const + { return ConstVertexVertexIter(*this, _vh); } + /// const vertex circulator cw + ConstVertexVertexCWIter cvv_cwiter(VertexHandle _vh) const + { return ConstVertexVertexCWIter(*this, _vh); } + /// const vertex circulator ccw + ConstVertexVertexCCWIter cvv_ccwiter(VertexHandle _vh) const + { return ConstVertexVertexCCWIter(*this, _vh); } + /// const vertex - incoming halfedge circulator + ConstVertexIHalfedgeIter cvih_iter(VertexHandle _vh) const + { return ConstVertexIHalfedgeIter(*this, _vh); } + /// const vertex - incoming halfedge circulator cw + ConstVertexIHalfedgeCWIter cvih_cwiter(VertexHandle _vh) const + { return ConstVertexIHalfedgeCWIter(*this, _vh); } + /// const vertex - incoming halfedge circulator ccw + ConstVertexIHalfedgeCCWIter cvih_ccwiter(VertexHandle _vh) const + { return ConstVertexIHalfedgeCCWIter(*this, _vh); } + /// const vertex - outgoing halfedge circulator + ConstVertexOHalfedgeIter cvoh_iter(VertexHandle _vh) const + { return ConstVertexOHalfedgeIter(*this, _vh); } + /// const vertex - outgoing halfedge circulator cw + ConstVertexOHalfedgeCWIter cvoh_cwiter(VertexHandle _vh) const + { return ConstVertexOHalfedgeCWIter(*this, _vh); } + /// const vertex - outgoing halfedge circulator ccw + ConstVertexOHalfedgeCCWIter cvoh_ccwiter(VertexHandle _vh) const + { return ConstVertexOHalfedgeCCWIter(*this, _vh); } + /// const vertex - edge circulator + ConstVertexEdgeIter cve_iter(VertexHandle _vh) const + { return ConstVertexEdgeIter(*this, _vh); } + /// const vertex - edge circulator cw + ConstVertexEdgeCWIter cve_cwiter(VertexHandle _vh) const + { return ConstVertexEdgeCWIter(*this, _vh); } + /// const vertex - edge circulator ccw + ConstVertexEdgeCCWIter cve_ccwiter(VertexHandle _vh) const + { return ConstVertexEdgeCCWIter(*this, _vh); } + /// const vertex - face circulator + ConstVertexFaceIter cvf_iter(VertexHandle _vh) const + { return ConstVertexFaceIter(*this, _vh); } + /// const vertex - face circulator cw + ConstVertexFaceCWIter cvf_cwiter(VertexHandle _vh) const + { return ConstVertexFaceCWIter(*this, _vh); } + /// const vertex - face circulator ccw + ConstVertexFaceCCWIter cvf_ccwiter(VertexHandle _vh) const + { return ConstVertexFaceCCWIter(*this, _vh); } + + /// face - vertex circulator + FaceVertexIter fv_iter(FaceHandle _fh) + { return FaceVertexIter(*this, _fh); } + /// face - vertex circulator cw + FaceVertexCWIter fv_cwiter(FaceHandle _fh) + { return FaceVertexCWIter(*this, _fh); } + /// face - vertex circulator ccw + FaceVertexCCWIter fv_ccwiter(FaceHandle _fh) + { return FaceVertexCCWIter(*this, _fh); } + /// face - halfedge circulator + FaceHalfedgeIter fh_iter(FaceHandle _fh) + { return FaceHalfedgeIter(*this, _fh); } + /// face - halfedge circulator cw + FaceHalfedgeCWIter fh_cwiter(FaceHandle _fh) + { return FaceHalfedgeCWIter(*this, _fh); } + /// face - halfedge circulator ccw + FaceHalfedgeCCWIter fh_ccwiter(FaceHandle _fh) + { return FaceHalfedgeCCWIter(*this, _fh); } + /// face - edge circulator + FaceEdgeIter fe_iter(FaceHandle _fh) + { return FaceEdgeIter(*this, _fh); } + /// face - edge circulator cw + FaceEdgeCWIter fe_cwiter(FaceHandle _fh) + { return FaceEdgeCWIter(*this, _fh); } + /// face - edge circulator ccw + FaceEdgeCCWIter fe_ccwiter(FaceHandle _fh) + { return FaceEdgeCCWIter(*this, _fh); } + /// face - face circulator + FaceFaceIter ff_iter(FaceHandle _fh) + { return FaceFaceIter(*this, _fh); } + /// face - face circulator cw + FaceFaceCWIter ff_cwiter(FaceHandle _fh) + { return FaceFaceCWIter(*this, _fh); } + /// face - face circulator ccw + FaceFaceCCWIter ff_ccwiter(FaceHandle _fh) + { return FaceFaceCCWIter(*this, _fh); } + + /// const face - vertex circulator + ConstFaceVertexIter cfv_iter(FaceHandle _fh) const + { return ConstFaceVertexIter(*this, _fh); } + /// const face - vertex circulator cw + ConstFaceVertexCWIter cfv_cwiter(FaceHandle _fh) const + { return ConstFaceVertexCWIter(*this, _fh); } + /// const face - vertex circulator ccw + ConstFaceVertexCCWIter cfv_ccwiter(FaceHandle _fh) const + { return ConstFaceVertexCCWIter(*this, _fh); } + /// const face - halfedge circulator + ConstFaceHalfedgeIter cfh_iter(FaceHandle _fh) const + { return ConstFaceHalfedgeIter(*this, _fh); } + /// const face - halfedge circulator cw + ConstFaceHalfedgeCWIter cfh_cwiter(FaceHandle _fh) const + { return ConstFaceHalfedgeCWIter(*this, _fh); } + /// const face - halfedge circulator ccw + ConstFaceHalfedgeCCWIter cfh_ccwiter(FaceHandle _fh) const + { return ConstFaceHalfedgeCCWIter(*this, _fh); } + /// const face - edge circulator + ConstFaceEdgeIter cfe_iter(FaceHandle _fh) const + { return ConstFaceEdgeIter(*this, _fh); } + /// const face - edge circulator cw + ConstFaceEdgeCWIter cfe_cwiter(FaceHandle _fh) const + { return ConstFaceEdgeCWIter(*this, _fh); } + /// const face - edge circulator ccw + ConstFaceEdgeCCWIter cfe_ccwiter(FaceHandle _fh) const + { return ConstFaceEdgeCCWIter(*this, _fh); } + /// const face - face circulator + ConstFaceFaceIter cff_iter(FaceHandle _fh) const + { return ConstFaceFaceIter(*this, _fh); } + /// const face - face circulator cw + ConstFaceFaceCWIter cff_cwiter(FaceHandle _fh) const + { return ConstFaceFaceCWIter(*this, _fh); } + /// const face - face circulator + ConstFaceFaceCCWIter cff_ccwiter(FaceHandle _fh) const + { return ConstFaceFaceCCWIter(*this, _fh); } + + // 'begin' circulators + + /// vertex - vertex circulator + VertexVertexIter vv_begin(VertexHandle _vh) + { return VertexVertexIter(*this, _vh); } + /// vertex - vertex circulator cw + VertexVertexCWIter vv_cwbegin(VertexHandle _vh) + { return VertexVertexCWIter(*this, _vh); } + /// vertex - vertex circulator ccw + VertexVertexCCWIter vv_ccwbegin(VertexHandle _vh) + { return VertexVertexCCWIter(*this, _vh); } + /// vertex - incoming halfedge circulator + VertexIHalfedgeIter vih_begin(VertexHandle _vh) + { return VertexIHalfedgeIter(*this, _vh); } + /// vertex - incoming halfedge circulator cw + VertexIHalfedgeCWIter vih_cwbegin(VertexHandle _vh) + { return VertexIHalfedgeCWIter(*this, _vh); } + /// vertex - incoming halfedge circulator ccw + VertexIHalfedgeCCWIter vih_ccwbegin(VertexHandle _vh) + { return VertexIHalfedgeCCWIter(*this, _vh); } + /// vertex - outgoing halfedge circulator + VertexOHalfedgeIter voh_begin(VertexHandle _vh) + { return VertexOHalfedgeIter(*this, _vh); } + /// vertex - outgoing halfedge circulator cw + VertexOHalfedgeCWIter voh_cwbegin(VertexHandle _vh) + { return VertexOHalfedgeCWIter(*this, _vh); } + /// vertex - outgoing halfedge circulator ccw + VertexOHalfedgeCCWIter voh_ccwbegin(VertexHandle _vh) + { return VertexOHalfedgeCCWIter(*this, _vh); } + /// vertex - edge circulator + VertexEdgeIter ve_begin(VertexHandle _vh) + { return VertexEdgeIter(*this, _vh); } + /// vertex - edge circulator cw + VertexEdgeCWIter ve_cwbegin(VertexHandle _vh) + { return VertexEdgeCWIter(*this, _vh); } + /// vertex - edge circulator ccw + VertexEdgeCCWIter ve_ccwbegin(VertexHandle _vh) + { return VertexEdgeCCWIter(*this, _vh); } + /// vertex - face circulator + VertexFaceIter vf_begin(VertexHandle _vh) + { return VertexFaceIter(*this, _vh); } + /// vertex - face circulator cw + VertexFaceCWIter vf_cwbegin(VertexHandle _vh) + { return VertexFaceCWIter(*this, _vh); } + /// vertex - face circulator ccw + VertexFaceCCWIter vf_ccwbegin(VertexHandle _vh) + { return VertexFaceCCWIter(*this, _vh); } + + + /// const vertex circulator + ConstVertexVertexIter cvv_begin(VertexHandle _vh) const + { return ConstVertexVertexIter(*this, _vh); } + /// const vertex circulator cw + ConstVertexVertexCWIter cvv_cwbegin(VertexHandle _vh) const + { return ConstVertexVertexCWIter(*this, _vh); } + /// const vertex circulator ccw + ConstVertexVertexCCWIter cvv_ccwbegin(VertexHandle _vh) const + { return ConstVertexVertexCCWIter(*this, _vh); } + /// const vertex - incoming halfedge circulator + ConstVertexIHalfedgeIter cvih_begin(VertexHandle _vh) const + { return ConstVertexIHalfedgeIter(*this, _vh); } + /// const vertex - incoming halfedge circulator cw + ConstVertexIHalfedgeCWIter cvih_cwbegin(VertexHandle _vh) const + { return ConstVertexIHalfedgeCWIter(*this, _vh); } + /// const vertex - incoming halfedge circulator ccw + ConstVertexIHalfedgeCCWIter cvih_ccwbegin(VertexHandle _vh) const + { return ConstVertexIHalfedgeCCWIter(*this, _vh); } + /// const vertex - outgoing halfedge circulator + ConstVertexOHalfedgeIter cvoh_begin(VertexHandle _vh) const + { return ConstVertexOHalfedgeIter(*this, _vh); } + /// const vertex - outgoing halfedge circulator cw + ConstVertexOHalfedgeCWIter cvoh_cwbegin(VertexHandle _vh) const + { return ConstVertexOHalfedgeCWIter(*this, _vh); } + /// const vertex - outgoing halfedge circulator ccw + ConstVertexOHalfedgeCCWIter cvoh_ccwbegin(VertexHandle _vh) const + { return ConstVertexOHalfedgeCCWIter(*this, _vh); } + /// const vertex - edge circulator + ConstVertexEdgeIter cve_begin(VertexHandle _vh) const + { return ConstVertexEdgeIter(*this, _vh); } + /// const vertex - edge circulator cw + ConstVertexEdgeCWIter cve_cwbegin(VertexHandle _vh) const + { return ConstVertexEdgeCWIter(*this, _vh); } + /// const vertex - edge circulator ccw + ConstVertexEdgeCCWIter cve_ccwbegin(VertexHandle _vh) const + { return ConstVertexEdgeCCWIter(*this, _vh); } + /// const vertex - face circulator + ConstVertexFaceIter cvf_begin(VertexHandle _vh) const + { return ConstVertexFaceIter(*this, _vh); } + /// const vertex - face circulator cw + ConstVertexFaceCWIter cvf_cwbegin(VertexHandle _vh) const + { return ConstVertexFaceCWIter(*this, _vh); } + /// const vertex - face circulator ccw + ConstVertexFaceCCWIter cvf_ccwbegin(VertexHandle _vh) const + { return ConstVertexFaceCCWIter(*this, _vh); } + + /// face - vertex circulator + FaceVertexIter fv_begin(FaceHandle _fh) + { return FaceVertexIter(*this, _fh); } + /// face - vertex circulator cw + FaceVertexCWIter fv_cwbegin(FaceHandle _fh) + { return FaceVertexCWIter(*this, _fh); } + /// face - vertex circulator ccw + FaceVertexCCWIter fv_ccwbegin(FaceHandle _fh) + { return FaceVertexCCWIter(*this, _fh); } + /// face - halfedge circulator + FaceHalfedgeIter fh_begin(FaceHandle _fh) + { return FaceHalfedgeIter(*this, _fh); } + /// face - halfedge circulator cw + FaceHalfedgeCWIter fh_cwbegin(FaceHandle _fh) + { return FaceHalfedgeCWIter(*this, _fh); } + /// face - halfedge circulator ccw + FaceHalfedgeCCWIter fh_ccwbegin(FaceHandle _fh) + { return FaceHalfedgeCCWIter(*this, _fh); } + /// face - edge circulator + FaceEdgeIter fe_begin(FaceHandle _fh) + { return FaceEdgeIter(*this, _fh); } + /// face - edge circulator cw + FaceEdgeCWIter fe_cwbegin(FaceHandle _fh) + { return FaceEdgeCWIter(*this, _fh); } + /// face - edge circulator ccw + FaceEdgeCCWIter fe_ccwbegin(FaceHandle _fh) + { return FaceEdgeCCWIter(*this, _fh); } + /// face - face circulator + FaceFaceIter ff_begin(FaceHandle _fh) + { return FaceFaceIter(*this, _fh); } + /// face - face circulator cw + FaceFaceCWIter ff_cwbegin(FaceHandle _fh) + { return FaceFaceCWIter(*this, _fh); } + /// face - face circulator ccw + FaceFaceCCWIter ff_ccwbegin(FaceHandle _fh) + { return FaceFaceCCWIter(*this, _fh); } + /// halfedge circulator + HalfedgeLoopIter hl_begin(HalfedgeHandle _heh) + { return HalfedgeLoopIter(*this, _heh); } + /// halfedge circulator + HalfedgeLoopCWIter hl_cwbegin(HalfedgeHandle _heh) + { return HalfedgeLoopCWIter(*this, _heh); } + /// halfedge circulator ccw + HalfedgeLoopCCWIter hl_ccwbegin(HalfedgeHandle _heh) + { return HalfedgeLoopCCWIter(*this, _heh); } + + /// const face - vertex circulator + ConstFaceVertexIter cfv_begin(FaceHandle _fh) const + { return ConstFaceVertexIter(*this, _fh); } + /// const face - vertex circulator cw + ConstFaceVertexCWIter cfv_cwbegin(FaceHandle _fh) const + { return ConstFaceVertexCWIter(*this, _fh); } + /// const face - vertex circulator ccw + ConstFaceVertexCCWIter cfv_ccwbegin(FaceHandle _fh) const + { return ConstFaceVertexCCWIter(*this, _fh); } + /// const face - halfedge circulator + ConstFaceHalfedgeIter cfh_begin(FaceHandle _fh) const + { return ConstFaceHalfedgeIter(*this, _fh); } + /// const face - halfedge circulator cw + ConstFaceHalfedgeCWIter cfh_cwbegin(FaceHandle _fh) const + { return ConstFaceHalfedgeCWIter(*this, _fh); } + /// const face - halfedge circulator ccw + ConstFaceHalfedgeCCWIter cfh_ccwbegin(FaceHandle _fh) const + { return ConstFaceHalfedgeCCWIter(*this, _fh); } + /// const face - edge circulator + ConstFaceEdgeIter cfe_begin(FaceHandle _fh) const + { return ConstFaceEdgeIter(*this, _fh); } + /// const face - edge circulator cw + ConstFaceEdgeCWIter cfe_cwbegin(FaceHandle _fh) const + { return ConstFaceEdgeCWIter(*this, _fh); } + /// const face - edge circulator ccw + ConstFaceEdgeCCWIter cfe_ccwbegin(FaceHandle _fh) const + { return ConstFaceEdgeCCWIter(*this, _fh); } + /// const face - face circulator + ConstFaceFaceIter cff_begin(FaceHandle _fh) const + { return ConstFaceFaceIter(*this, _fh); } + /// const face - face circulator cw + ConstFaceFaceCWIter cff_cwbegin(FaceHandle _fh) const + { return ConstFaceFaceCWIter(*this, _fh); } + /// const face - face circulator ccw + ConstFaceFaceCCWIter cff_ccwbegin(FaceHandle _fh) const + { return ConstFaceFaceCCWIter(*this, _fh); } + /// const halfedge circulator + ConstHalfedgeLoopIter chl_begin(HalfedgeHandle _heh) const + { return ConstHalfedgeLoopIter(*this, _heh); } + /// const halfedge circulator cw + ConstHalfedgeLoopCWIter chl_cwbegin(HalfedgeHandle _heh) const + { return ConstHalfedgeLoopCWIter(*this, _heh); } + /// const halfedge circulator ccw + ConstHalfedgeLoopCCWIter chl_ccwbegin(HalfedgeHandle _heh) const + { return ConstHalfedgeLoopCCWIter(*this, _heh); } + + // 'end' circulators + + /// vertex - vertex circulator + VertexVertexIter vv_end(VertexHandle _vh) + { return VertexVertexIter(*this, _vh, true); } + /// vertex - vertex circulator cw + VertexVertexCWIter vv_cwend(VertexHandle _vh) + { return VertexVertexCWIter(*this, _vh, true); } + /// vertex - vertex circulator ccw + VertexVertexCCWIter vv_ccwend(VertexHandle _vh) + { return VertexVertexCCWIter(*this, _vh, true); } + /// vertex - incoming halfedge circulator + VertexIHalfedgeIter vih_end(VertexHandle _vh) + { return VertexIHalfedgeIter(*this, _vh, true); } + /// vertex - incoming halfedge circulator cw + VertexIHalfedgeCWIter vih_cwend(VertexHandle _vh) + { return VertexIHalfedgeCWIter(*this, _vh, true); } + /// vertex - incoming halfedge circulator ccw + VertexIHalfedgeCCWIter vih_ccwend(VertexHandle _vh) + { return VertexIHalfedgeCCWIter(*this, _vh, true); } + /// vertex - outgoing halfedge circulator + VertexOHalfedgeIter voh_end(VertexHandle _vh) + { return VertexOHalfedgeIter(*this, _vh, true); } + /// vertex - outgoing halfedge circulator cw + VertexOHalfedgeCWIter voh_cwend(VertexHandle _vh) + { return VertexOHalfedgeCWIter(*this, _vh, true); } + /// vertex - outgoing halfedge circulator ccw + VertexOHalfedgeCCWIter voh_ccwend(VertexHandle _vh) + { return VertexOHalfedgeCCWIter(*this, _vh, true); } + /// vertex - edge circulator + VertexEdgeIter ve_end(VertexHandle _vh) + { return VertexEdgeIter(*this, _vh, true); } + /// vertex - edge circulator cw + VertexEdgeCWIter ve_cwend(VertexHandle _vh) + { return VertexEdgeCWIter(*this, _vh, true); } + /// vertex - edge circulator ccw + VertexEdgeCCWIter ve_ccwend(VertexHandle _vh) + { return VertexEdgeCCWIter(*this, _vh, true); } + /// vertex - face circulator + VertexFaceIter vf_end(VertexHandle _vh) + { return VertexFaceIter(*this, _vh, true); } + /// vertex - face circulator cw + VertexFaceCWIter vf_cwend(VertexHandle _vh) + { return VertexFaceCWIter(*this, _vh, true); } + /// vertex - face circulator ccw + VertexFaceCCWIter vf_ccwend(VertexHandle _vh) + { return VertexFaceCCWIter(*this, _vh, true); } + + /// const vertex circulator + ConstVertexVertexIter cvv_end(VertexHandle _vh) const + { return ConstVertexVertexIter(*this, _vh, true); } + /// const vertex circulator cw + ConstVertexVertexCWIter cvv_cwend(VertexHandle _vh) const + { return ConstVertexVertexCWIter(*this, _vh, true); } + /// const vertex circulator ccw + ConstVertexVertexCCWIter cvv_ccwend(VertexHandle _vh) const + { return ConstVertexVertexCCWIter(*this, _vh, true); } + /// const vertex - incoming halfedge circulator + ConstVertexIHalfedgeIter cvih_end(VertexHandle _vh) const + { return ConstVertexIHalfedgeIter(*this, _vh, true); } + /// const vertex - incoming halfedge circulator cw + ConstVertexIHalfedgeCWIter cvih_cwend(VertexHandle _vh) const + { return ConstVertexIHalfedgeCWIter(*this, _vh, true); } + /// const vertex - incoming halfedge circulator ccw + ConstVertexIHalfedgeCCWIter cvih_ccwend(VertexHandle _vh) const + { return ConstVertexIHalfedgeCCWIter(*this, _vh, true); } + /// const vertex - outgoing halfedge circulator + ConstVertexOHalfedgeIter cvoh_end(VertexHandle _vh) const + { return ConstVertexOHalfedgeIter(*this, _vh, true); } + /// const vertex - outgoing halfedge circulator cw + ConstVertexOHalfedgeCWIter cvoh_cwend(VertexHandle _vh) const + { return ConstVertexOHalfedgeCWIter(*this, _vh, true); } + /// const vertex - outgoing halfedge circulator ccw + ConstVertexOHalfedgeCCWIter cvoh_ccwend(VertexHandle _vh) const + { return ConstVertexOHalfedgeCCWIter(*this, _vh, true); } + /// const vertex - edge circulator + ConstVertexEdgeIter cve_end(VertexHandle _vh) const + { return ConstVertexEdgeIter(*this, _vh, true); } + /// const vertex - edge circulator cw + ConstVertexEdgeCWIter cve_cwend(VertexHandle _vh) const + { return ConstVertexEdgeCWIter(*this, _vh, true); } + /// const vertex - edge circulator ccw + ConstVertexEdgeCCWIter cve_ccwend(VertexHandle _vh) const + { return ConstVertexEdgeCCWIter(*this, _vh, true); } + /// const vertex - face circulator + ConstVertexFaceIter cvf_end(VertexHandle _vh) const + { return ConstVertexFaceIter(*this, _vh, true); } + /// const vertex - face circulator cw + ConstVertexFaceCWIter cvf_cwend(VertexHandle _vh) const + { return ConstVertexFaceCWIter(*this, _vh, true); } + /// const vertex - face circulator ccw + ConstVertexFaceCCWIter cvf_ccwend(VertexHandle _vh) const + { return ConstVertexFaceCCWIter(*this, _vh, true); } + + /// face - vertex circulator + FaceVertexIter fv_end(FaceHandle _fh) + { return FaceVertexIter(*this, _fh, true); } + /// face - vertex circulator cw + FaceVertexCWIter fv_cwend(FaceHandle _fh) + { return FaceVertexCWIter(*this, _fh, true); } + /// face - vertex circulator ccw + FaceVertexCCWIter fv_ccwend(FaceHandle _fh) + { return FaceVertexCCWIter(*this, _fh, true); } + /// face - halfedge circulator + FaceHalfedgeIter fh_end(FaceHandle _fh) + { return FaceHalfedgeIter(*this, _fh, true); } + /// face - halfedge circulator cw + FaceHalfedgeCWIter fh_cwend(FaceHandle _fh) + { return FaceHalfedgeCWIter(*this, _fh, true); } + /// face - halfedge circulator ccw + FaceHalfedgeCCWIter fh_ccwend(FaceHandle _fh) + { return FaceHalfedgeCCWIter(*this, _fh, true); } + /// face - edge circulator + FaceEdgeIter fe_end(FaceHandle _fh) + { return FaceEdgeIter(*this, _fh, true); } + /// face - edge circulator cw + FaceEdgeCWIter fe_cwend(FaceHandle _fh) + { return FaceEdgeCWIter(*this, _fh, true); } + /// face - edge circulator ccw + FaceEdgeCCWIter fe_ccwend(FaceHandle _fh) + { return FaceEdgeCCWIter(*this, _fh, true); } + /// face - face circulator + FaceFaceIter ff_end(FaceHandle _fh) + { return FaceFaceIter(*this, _fh, true); } + /// face - face circulator cw + FaceFaceCWIter ff_cwend(FaceHandle _fh) + { return FaceFaceCWIter(*this, _fh, true); } + /// face - face circulator ccw + FaceFaceCCWIter ff_ccwend(FaceHandle _fh) + { return FaceFaceCCWIter(*this, _fh, true); } + /// face - face circulator + HalfedgeLoopIter hl_end(HalfedgeHandle _heh) + { return HalfedgeLoopIter(*this, _heh, true); } + /// face - face circulator cw + HalfedgeLoopCWIter hl_cwend(HalfedgeHandle _heh) + { return HalfedgeLoopCWIter(*this, _heh, true); } + /// face - face circulator ccw + HalfedgeLoopCCWIter hl_ccwend(HalfedgeHandle _heh) + { return HalfedgeLoopCCWIter(*this, _heh, true); } + + /// const face - vertex circulator + ConstFaceVertexIter cfv_end(FaceHandle _fh) const + { return ConstFaceVertexIter(*this, _fh, true); } + /// const face - vertex circulator cw + ConstFaceVertexCWIter cfv_cwend(FaceHandle _fh) const + { return ConstFaceVertexCWIter(*this, _fh, true); } + /// const face - vertex circulator ccw + ConstFaceVertexCCWIter cfv_ccwend(FaceHandle _fh) const + { return ConstFaceVertexCCWIter(*this, _fh, true); } + /// const face - halfedge circulator + ConstFaceHalfedgeIter cfh_end(FaceHandle _fh) const + { return ConstFaceHalfedgeIter(*this, _fh, true); } + /// const face - halfedge circulator cw + ConstFaceHalfedgeCWIter cfh_cwend(FaceHandle _fh) const + { return ConstFaceHalfedgeCWIter(*this, _fh, true); } + /// const face - halfedge circulator ccw + ConstFaceHalfedgeCCWIter cfh_ccwend(FaceHandle _fh) const + { return ConstFaceHalfedgeCCWIter(*this, _fh, true); } + /// const face - edge circulator + ConstFaceEdgeIter cfe_end(FaceHandle _fh) const + { return ConstFaceEdgeIter(*this, _fh, true); } + /// const face - edge circulator cw + ConstFaceEdgeCWIter cfe_cwend(FaceHandle _fh) const + { return ConstFaceEdgeCWIter(*this, _fh, true); } + /// const face - edge circulator ccw + ConstFaceEdgeCCWIter cfe_ccwend(FaceHandle _fh) const + { return ConstFaceEdgeCCWIter(*this, _fh, true); } + /// const face - face circulator + ConstFaceFaceIter cff_end(FaceHandle _fh) const + { return ConstFaceFaceIter(*this, _fh, true); } + /// const face - face circulator + ConstFaceFaceCWIter cff_cwend(FaceHandle _fh) const + { return ConstFaceFaceCWIter(*this, _fh, true); } + /// const face - face circulator + ConstFaceFaceCCWIter cff_ccwend(FaceHandle _fh) const + { return ConstFaceFaceCCWIter(*this, _fh, true); } + /// const face - face circulator + ConstHalfedgeLoopIter chl_end(HalfedgeHandle _heh) const + { return ConstHalfedgeLoopIter(*this, _heh, true); } + /// const face - face circulator cw + ConstHalfedgeLoopCWIter chl_cwend(HalfedgeHandle _heh) const + { return ConstHalfedgeLoopCWIter(*this, _heh, true); } + /// const face - face circulator ccw + ConstHalfedgeLoopCCWIter chl_ccwend(HalfedgeHandle _heh) const + { return ConstHalfedgeLoopCCWIter(*this, _heh, true); } + //@} + + /** @name Range based iterators and circulators */ + //@{ + + /// Generic class for vertex/halfedge/edge/face ranges. + template< + typename CONTAINER_TYPE, + typename ITER_TYPE, + ITER_TYPE (CONTAINER_TYPE::*begin_fn)() const, + ITER_TYPE (CONTAINER_TYPE::*end_fn)() const> + class EntityRange { + public: + typedef ITER_TYPE iterator; + typedef ITER_TYPE const_iterator; + + EntityRange(CONTAINER_TYPE &container) : container_(container) {} + ITER_TYPE begin() const { return (container_.*begin_fn)(); } + ITER_TYPE end() const { return (container_.*end_fn)(); } + + private: + CONTAINER_TYPE &container_; + }; + typedef EntityRange< + const PolyConnectivity, + PolyConnectivity::ConstVertexIter, + &PolyConnectivity::vertices_begin, + &PolyConnectivity::vertices_end> ConstVertexRange; + typedef EntityRange< + const PolyConnectivity, + PolyConnectivity::ConstVertexIter, + &PolyConnectivity::vertices_sbegin, + &PolyConnectivity::vertices_end> ConstVertexRangeSkipping; + typedef EntityRange< + const PolyConnectivity, + PolyConnectivity::ConstHalfedgeIter, + &PolyConnectivity::halfedges_begin, + &PolyConnectivity::halfedges_end> ConstHalfedgeRange; + typedef EntityRange< + const PolyConnectivity, + PolyConnectivity::ConstHalfedgeIter, + &PolyConnectivity::halfedges_sbegin, + &PolyConnectivity::halfedges_end> ConstHalfedgeRangeSkipping; + typedef EntityRange< + const PolyConnectivity, + PolyConnectivity::ConstEdgeIter, + &PolyConnectivity::edges_begin, + &PolyConnectivity::edges_end> ConstEdgeRange; + typedef EntityRange< + const PolyConnectivity, + PolyConnectivity::ConstEdgeIter, + &PolyConnectivity::edges_sbegin, + &PolyConnectivity::edges_end> ConstEdgeRangeSkipping; + typedef EntityRange< + const PolyConnectivity, + PolyConnectivity::ConstFaceIter, + &PolyConnectivity::faces_begin, + &PolyConnectivity::faces_end> ConstFaceRange; + typedef EntityRange< + const PolyConnectivity, + PolyConnectivity::ConstFaceIter, + &PolyConnectivity::faces_sbegin, + &PolyConnectivity::faces_end> ConstFaceRangeSkipping; + + /** + * @return The vertices as a range object suitable + * for C++11 range based for loops. Will skip deleted vertices. + */ + ConstVertexRangeSkipping vertices() const { return ConstVertexRangeSkipping(*this); } + + /** + * @return The vertices as a range object suitable + * for C++11 range based for loops. Will include deleted vertices. + */ + ConstVertexRange all_vertices() const { return ConstVertexRange(*this); } + + /** + * @return The halfedges as a range object suitable + * for C++11 range based for loops. Will skip deleted halfedges. + */ + ConstHalfedgeRangeSkipping halfedges() const { return ConstHalfedgeRangeSkipping(*this); } + + /** + * @return The halfedges as a range object suitable + * for C++11 range based for loops. Will include deleted halfedges. + */ + ConstHalfedgeRange all_halfedges() const { return ConstHalfedgeRange(*this); } + + /** + * @return The edges as a range object suitable + * for C++11 range based for loops. Will skip deleted edges. + */ + ConstEdgeRangeSkipping edges() const { return ConstEdgeRangeSkipping(*this); } + + /** + * @return The edges as a range object suitable + * for C++11 range based for loops. Will include deleted edges. + */ + ConstEdgeRange all_edges() const { return ConstEdgeRange(*this); } + + /** + * @return The faces as a range object suitable + * for C++11 range based for loops. Will skip deleted faces. + */ + ConstFaceRangeSkipping faces() const { return ConstFaceRangeSkipping(*this); } + + /** + * @return The faces as a range object suitable + * for C++11 range based for loops. Will include deleted faces. + */ + ConstFaceRange all_faces() const { return ConstFaceRange(*this); } + + /// Generic class for iterator ranges. + template< + typename CONTAINER_TYPE, + typename ITER_TYPE, + typename CENTER_ENTITY_TYPE, + ITER_TYPE (CONTAINER_TYPE::*begin_fn)(CENTER_ENTITY_TYPE) const, + ITER_TYPE (CONTAINER_TYPE::*end_fn)(CENTER_ENTITY_TYPE) const> + class CirculatorRange { + public: + typedef ITER_TYPE iterator; + typedef ITER_TYPE const_iterator; + + CirculatorRange( + const CONTAINER_TYPE &container, + CENTER_ENTITY_TYPE center) : + container_(container), center_(center) {} + ITER_TYPE begin() const { return (container_.*begin_fn)(center_); } + ITER_TYPE end() const { return (container_.*end_fn)(center_); } + + private: + const CONTAINER_TYPE &container_; + CENTER_ENTITY_TYPE center_; + }; + + typedef CirculatorRange< + PolyConnectivity, + ConstVertexVertexCWIter, + VertexHandle, + &PolyConnectivity::cvv_cwbegin, + &PolyConnectivity::cvv_cwend> ConstVertexVertexRange; + typedef CirculatorRange< + PolyConnectivity, + ConstVertexIHalfedgeIter, + VertexHandle, + &PolyConnectivity::cvih_begin, + &PolyConnectivity::cvih_end> ConstVertexIHalfedgeRange; + typedef CirculatorRange< + PolyConnectivity, + ConstVertexOHalfedgeIter, VertexHandle, + &PolyConnectivity::cvoh_begin, + &PolyConnectivity::cvoh_end> ConstVertexOHalfedgeRange; + typedef CirculatorRange< + PolyConnectivity, + ConstVertexEdgeIter, + VertexHandle, + &PolyConnectivity::cve_begin, + &PolyConnectivity::cve_end> ConstVertexEdgeRange; + typedef CirculatorRange< + PolyConnectivity, + ConstVertexFaceIter, + VertexHandle, + &PolyConnectivity::cvf_begin, + &PolyConnectivity::cvf_end> ConstVertexFaceRange; + typedef CirculatorRange< + PolyConnectivity, + ConstFaceVertexIter, + FaceHandle, + &PolyConnectivity::cfv_begin, + &PolyConnectivity::cfv_end> ConstFaceVertexRange; + typedef CirculatorRange< + PolyConnectivity, + ConstFaceHalfedgeIter, + FaceHandle, + &PolyConnectivity::cfh_begin, + &PolyConnectivity::cfh_end> ConstFaceHalfedgeRange; + typedef CirculatorRange< + PolyConnectivity, + ConstFaceEdgeIter, + FaceHandle, + &PolyConnectivity::cfe_begin, + &PolyConnectivity::cfe_end> ConstFaceEdgeRange; + typedef CirculatorRange< + PolyConnectivity, + ConstFaceFaceIter, + FaceHandle, + &PolyConnectivity::cff_begin, + &PolyConnectivity::cff_end> ConstFaceFaceRange; + + /** + * @return The vertices adjacent to the specified vertex + * as a range object suitable for C++11 range based for loops. + */ + ConstVertexVertexRange vv_range(VertexHandle _vh) const { + return ConstVertexVertexRange(*this, _vh); + } + + /** + * @return The incoming halfedges incident to the specified vertex + * as a range object suitable for C++11 range based for loops. + */ + ConstVertexIHalfedgeRange vih_range(VertexHandle _vh) const { + return ConstVertexIHalfedgeRange(*this, _vh); + } + + /** + * @return The outgoing halfedges incident to the specified vertex + * as a range object suitable for C++11 range based for loops. + */ + ConstVertexOHalfedgeRange voh_range(VertexHandle _vh) const { + return ConstVertexOHalfedgeRange(*this, _vh); + } + + /** + * @return The edges incident to the specified vertex + * as a range object suitable for C++11 range based for loops. + */ + ConstVertexEdgeRange ve_range(VertexHandle _vh) const { + return ConstVertexEdgeRange(*this, _vh); + } + + /** + * @return The faces incident to the specified vertex + * as a range object suitable for C++11 range based for loops. + */ + ConstVertexFaceRange vf_range(VertexHandle _vh) const { + return ConstVertexFaceRange(*this, _vh); + } + + /** + * @return The vertices incident to the specified face + * as a range object suitable for C++11 range based for loops. + */ + ConstFaceVertexRange fv_range(FaceHandle _fh) const { + return ConstFaceVertexRange(*this, _fh); + } + + /** + * @return The halfedges incident to the specified face + * as a range object suitable for C++11 range based for loops. + */ + ConstFaceHalfedgeRange fh_range(FaceHandle _fh) const { + return ConstFaceHalfedgeRange(*this, _fh); + } + + /** + * @return The edges incident to the specified face + * as a range object suitable for C++11 range based for loops. + */ + ConstFaceEdgeRange fe_range(FaceHandle _fh) const { + return ConstFaceEdgeRange(*this, _fh); + } + + /** + * @return The faces adjacent to the specified face + * as a range object suitable for C++11 range based for loops. + */ + ConstFaceFaceRange ff_range(FaceHandle _fh) const { + return ConstFaceFaceRange(*this, _fh); + } + + //@} + + //=========================================================================== + /** @name Boundary and manifold tests + * @{ */ + //=========================================================================== + + /** \brief Check if the halfedge is at the boundary + * + * The halfedge is at the boundary, if no face is incident to it. + * + * @param _heh HalfedgeHandle to test + * @return boundary? + */ + bool is_boundary(HalfedgeHandle _heh) const + { return ArrayKernel::is_boundary(_heh); } + + /** \brief Is the edge a boundary edge? + * + * Checks it the edge _eh is a boundary edge, i.e. is one of its halfedges + * a boundary halfedge. + * + * @param _eh Edge handle to test + * @return boundary? + */ + bool is_boundary(EdgeHandle _eh) const + { + return (is_boundary(halfedge_handle(_eh, 0)) || + is_boundary(halfedge_handle(_eh, 1))); + } + + /** \brief Is vertex _vh a boundary vertex ? + * + * Checks if the associated halfedge (which would on a boundary be the outside + * halfedge), is connected to a face. Which is equivalent, if the vertex is + * at the boundary of the mesh, as OpenMesh will make sure, that if there is a + * boundary halfedge at the vertex, the halfedge will be the one which is associated + * to the vertex. + * + * @param _vh VertexHandle to test + * @return boundary? + */ + bool is_boundary(VertexHandle _vh) const + { + HalfedgeHandle heh(halfedge_handle(_vh)); + return (!(heh.is_valid() && face_handle(heh).is_valid())); + } + + /** \brief Check if face is at the boundary + * + * Is face _fh at boundary, i.e. is one of its edges (or vertices) + * a boundary edge? + * + * @param _fh Check this face + * @param _check_vertex If \c true, check the corner vertices of the face, too. + * @return boundary? + */ + bool is_boundary(FaceHandle _fh, bool _check_vertex=false) const; + + /** \brief Is (the mesh at) vertex _vh two-manifold ? + * + * The vertex is non-manifold if more than one gap exists, i.e. + * more than one outgoing boundary halfedge. If (at least) one + * boundary halfedge exists, the vertex' halfedge must be a + * boundary halfedge. + * + * @param _vh VertexHandle to test + * @return manifold? + */ + bool is_manifold(VertexHandle _vh) const; + + /** @} */ + + // --- shortcuts --- + + /// returns the face handle of the opposite halfedge + inline FaceHandle opposite_face_handle(HalfedgeHandle _heh) const + { return face_handle(opposite_halfedge_handle(_heh)); } + + // --- misc --- + + /** Adjust outgoing halfedge handle for vertices, so that it is a + boundary halfedge whenever possible. + */ + void adjust_outgoing_halfedge(VertexHandle _vh); + + /// Find halfedge from _vh0 to _vh1. Returns invalid handle if not found. + HalfedgeHandle find_halfedge(VertexHandle _start_vh, VertexHandle _end_vh) const; + /// Vertex valence + uint valence(VertexHandle _vh) const; + /// Face valence + uint valence(FaceHandle _fh) const; + + // --- connectivity operattions + + /** Halfedge collapse: collapse the from-vertex of halfedge _heh + into its to-vertex. + + \attention Needs vertex/edge/face status attribute in order to + delete the items that degenerate. + + \note The from vertex is marked as deleted while the to vertex will still exist. + + \note This function does not perform a garbage collection. It + only marks degenerate items as deleted. + + \attention A halfedge collapse may lead to topological inconsistencies. + Therefore you should check this using is_collapse_ok(). + */ + void collapse(HalfedgeHandle _heh); + /** return true if the this the only link between the faces adjacent to _eh. + _eh is allowed to be boundary, in which case true is returned iff _eh is + the only boundary edge of its ajdacent face. + */ + bool is_simple_link(EdgeHandle _eh) const; + /** return true if _fh shares only one edge with all of its adjacent faces. + Boundary is treated as one face, i.e., the function false if _fh has more + than one boundary edge. + */ + bool is_simply_connected(FaceHandle _fh) const; + /** Removes the edge _eh. Its adjacent faces are merged. _eh and one of the + adjacent faces are set deleted. The handle of the remaining face is + returned (InvalidFaceHandle is returned if _eh is a boundary edge). + + \pre is_simple_link(_eh). This ensures that there are no hole faces + or isolated vertices appearing in result of the operation. + + \attention Needs the Attributes::Status attribute for edges and faces. + + \note This function does not perform a garbage collection. It + only marks items as deleted. + */ + FaceHandle remove_edge(EdgeHandle _eh); + /** Inverse of remove_edge. _eh should be the handle of the edge and the + vertex and halfedge handles pointed by edge(_eh) should be valid. + */ + void reinsert_edge(EdgeHandle _eh); + /** Inserts an edge between to_vh(_prev_heh) and from_vh(_next_heh). + A new face is created started at heh0 of the inserted edge and + its halfedges loop includes both _prev_heh and _next_heh. If an + old face existed which includes the argument halfedges, it is + split at the new edge. heh0 is returned. + + \note assumes _prev_heh and _next_heh are either boundary or pointed + to the same face + */ + HalfedgeHandle insert_edge(HalfedgeHandle _prev_heh, HalfedgeHandle _next_heh); + + /** \brief Face split (= 1-to-n split). + * + * Split an arbitrary face into triangles by connecting each vertex of fh to vh. + * + * \note fh will remain valid (it will become one of the triangles) + * \note the halfedge handles of the new triangles will point to the old halfeges + * + * \note The properties of the new faces and all other new primitives will be undefined! + * + * @param _fh Face handle that should be splitted + * @param _vh Vertex handle of the new vertex that will be inserted in the face + */ + void split(FaceHandle _fh, VertexHandle _vh); + + /** \brief Face split (= 1-to-n split). + * + * Split an arbitrary face into triangles by connecting each vertex of fh to vh. + * + * \note fh will remain valid (it will become one of the triangles) + * \note the halfedge handles of the new triangles will point to the old halfeges + * + * \note The properties of the new faces will be adjusted to the properties of the original faces + * \note Properties of the new edges and halfedges will be undefined + * + * @param _fh Face handle that should be splitted + * @param _vh Vertex handle of the new vertex that will be inserted in the face + */ + void split_copy(FaceHandle _fh, VertexHandle _vh); + + /** \brief Triangulate the face _fh + + Split an arbitrary face into triangles by connecting + each vertex of fh after its second to vh. + + \note _fh will remain valid (it will become one of the + triangles) + + \note The halfedge handles of the new triangles will + point to the old halfedges + + @param _fh Handle of the face that should be triangulated + */ + void triangulate(FaceHandle _fh); + + /** \brief triangulate the entire mesh + */ + void triangulate(); + + /** Edge split (inserts a vertex on the edge only) + * + * This edge split only splits the edge without introducing new faces! + * As this is for polygonal meshes, we can have valence 2 vertices here. + * + * \note The properties of the new edges and halfedges will be undefined! + * + * @param _eh Handle of the edge, that will be splitted + * @param _vh Handle of the vertex that will be inserted at the edge + */ + void split_edge(EdgeHandle _eh, VertexHandle _vh); + + /** Edge split (inserts a vertex on the edge only) + * + * This edge split only splits the edge without introducing new faces! + * As this is for polygonal meshes, we can have valence 2 vertices here. + * + * \note The properties of the new edge will be copied from the splitted edge + * \note Properties of the new halfedges will be undefined + * + * @param _eh Handle of the edge, that will be splitted + * @param _vh Handle of the vertex that will be inserted at the edge + */ + void split_edge_copy(EdgeHandle _eh, VertexHandle _vh); + + + /** \name Generic handle derefertiation. + Calls the respective vertex(), halfedge(), edge(), face() + method of the mesh kernel. + */ + //@{ + /// Get item from handle + const Vertex& deref(VertexHandle _h) const { return vertex(_h); } + Vertex& deref(VertexHandle _h) { return vertex(_h); } + const Halfedge& deref(HalfedgeHandle _h) const { return halfedge(_h); } + Halfedge& deref(HalfedgeHandle _h) { return halfedge(_h); } + const Edge& deref(EdgeHandle _h) const { return edge(_h); } + Edge& deref(EdgeHandle _h) { return edge(_h); } + const Face& deref(FaceHandle _h) const { return face(_h); } + Face& deref(FaceHandle _h) { return face(_h); } + //@} + +protected: + /// Helper for halfedge collapse + void collapse_edge(HalfedgeHandle _hh); + /// Helper for halfedge collapse + void collapse_loop(HalfedgeHandle _hh); + + + +private: // Working storage for add_face() + struct AddFaceEdgeInfo + { + HalfedgeHandle halfedge_handle; + bool is_new; + bool needs_adjust; + }; + std::vector edgeData_; // + std::vector > next_cache_; // cache for set_next_halfedge and vertex' set_halfedge + +}; + +}//namespace OpenMesh + +#endif//OPENMESH_POLYCONNECTIVITY_HH diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/PolyMeshT.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/PolyMeshT.hh new file mode 100644 index 0000000..31796fb --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/PolyMeshT.hh @@ -0,0 +1,638 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// CLASS PolyMeshT +// +//============================================================================= + + +#ifndef OPENMESH_POLYMESHT_HH +#define OPENMESH_POLYMESHT_HH + + +//== INCLUDES ================================================================= + + +#include +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + +//== CLASS DEFINITION ========================================================= + + +/** \class PolyMeshT PolyMeshT.hh + + Base type for a polygonal mesh. + + This is the base class for a polygonal mesh. It is parameterized + by a mesh kernel that is given as a template argument. This class + inherits all methods from its mesh kernel. + + \param Kernel: template argument for the mesh kernel + \note You should use the predefined mesh-kernel combinations in + \ref mesh_types_group + \see \ref mesh_type +*/ + +template +class PolyMeshT : public Kernel +{ +public: + + /// Self type. Used to specify iterators/circulators. + typedef PolyMeshT This; + //--- item types --- + + //@{ + /// Determine whether this is a PolyMeshT or TriMeshT ( This function does not check the per face vertex count! It only checks if the datatype is PolyMeshT or TriMeshT ) + enum { IsPolyMesh = 1 }; + enum { IsTriMesh = 0 }; + static bool is_polymesh() { return true; } + static bool is_trimesh() { return false; } + //@} + + /// \name Mesh Items + //@{ + /// Scalar type + typedef typename Kernel::Scalar Scalar; + /// Coordinate type + typedef typename Kernel::Point Point; + /// Normal type + typedef typename Kernel::Normal Normal; + /// Color type + typedef typename Kernel::Color Color; + /// TexCoord1D type + typedef typename Kernel::TexCoord1D TexCoord1D; + /// TexCoord2D type + typedef typename Kernel::TexCoord2D TexCoord2D; + /// TexCoord3D type + typedef typename Kernel::TexCoord3D TexCoord3D; + /// Vertex type + typedef typename Kernel::Vertex Vertex; + /// Halfedge type + typedef typename Kernel::Halfedge Halfedge; + /// Edge type + typedef typename Kernel::Edge Edge; + /// Face type + typedef typename Kernel::Face Face; + //@} + + //--- handle types --- + + /// Handle for referencing the corresponding item + typedef typename Kernel::VertexHandle VertexHandle; + typedef typename Kernel::HalfedgeHandle HalfedgeHandle; + typedef typename Kernel::EdgeHandle EdgeHandle; + typedef typename Kernel::FaceHandle FaceHandle; + + + + typedef typename Kernel::VertexIter VertexIter; + typedef typename Kernel::HalfedgeIter HalfedgeIter; + typedef typename Kernel::EdgeIter EdgeIter; + typedef typename Kernel::FaceIter FaceIter; + + typedef typename Kernel::ConstVertexIter ConstVertexIter; + typedef typename Kernel::ConstHalfedgeIter ConstHalfedgeIter; + typedef typename Kernel::ConstEdgeIter ConstEdgeIter; + typedef typename Kernel::ConstFaceIter ConstFaceIter; + //@} + + //--- circulators --- + + /** \name Mesh Circulators + Refer to OpenMesh::Mesh::Iterators or \ref mesh_iterators + for documentation. + */ + //@{ + /// Circulator + typedef typename Kernel::VertexVertexIter VertexVertexIter; + typedef typename Kernel::VertexOHalfedgeIter VertexOHalfedgeIter; + typedef typename Kernel::VertexIHalfedgeIter VertexIHalfedgeIter; + typedef typename Kernel::VertexEdgeIter VertexEdgeIter; + typedef typename Kernel::VertexFaceIter VertexFaceIter; + typedef typename Kernel::FaceVertexIter FaceVertexIter; + typedef typename Kernel::FaceHalfedgeIter FaceHalfedgeIter; + typedef typename Kernel::FaceEdgeIter FaceEdgeIter; + typedef typename Kernel::FaceFaceIter FaceFaceIter; + + typedef typename Kernel::ConstVertexVertexIter ConstVertexVertexIter; + typedef typename Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter; + typedef typename Kernel::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter; + typedef typename Kernel::ConstVertexEdgeIter ConstVertexEdgeIter; + typedef typename Kernel::ConstVertexFaceIter ConstVertexFaceIter; + typedef typename Kernel::ConstFaceVertexIter ConstFaceVertexIter; + typedef typename Kernel::ConstFaceHalfedgeIter ConstFaceHalfedgeIter; + typedef typename Kernel::ConstFaceEdgeIter ConstFaceEdgeIter; + typedef typename Kernel::ConstFaceFaceIter ConstFaceFaceIter; + //@} + + + // --- constructor/destructor + PolyMeshT() {} + template + explicit PolyMeshT(const T& t) : Kernel(t) {} + virtual ~PolyMeshT() {} + + /** Uses default copy and assignment operator. + Use them to assign two meshes of \b equal type. + If the mesh types vary, use PolyMeshT::assign() instead. */ + + // --- creation --- + + /** + * \brief Adds a new default-initialized vertex. + * + * \sa new_vertex(const Point&), new_vertex_dirty() + */ + inline VertexHandle new_vertex() + { return Kernel::new_vertex(); } + + /** + * \brief Adds a new vertex initialized to a custom position. + * + * \sa new_vertex(), new_vertex_dirty() + */ + inline VertexHandle new_vertex(const Point& _p) + { + VertexHandle vh(Kernel::new_vertex()); + this->set_point(vh, _p); + return vh; + } + + /** + * Same as new_vertex(const Point&) but never shrinks, only enlarges the + * vertex property vectors. + * + * If you are rebuilding a mesh that you erased with ArrayKernel::clean() or + * ArrayKernel::clean_keep_reservation() using this method instead of + * new_vertex(const Point &) saves reallocation and reinitialization of + * property memory. + * + * \sa new_vertex(const Point &) + */ + inline VertexHandle new_vertex_dirty(const Point& _p) + { + VertexHandle vh(Kernel::new_vertex_dirty()); + this->set_point(vh, _p); + return vh; + } + + /// Alias for new_vertex(const Point&). + inline VertexHandle add_vertex(const Point& _p) + { return new_vertex(_p); } + + /// Alias for new_vertex_dirty(). + inline VertexHandle add_vertex_dirty(const Point& _p) + { return new_vertex_dirty(_p); } + + // --- normal vectors --- + + /** \name Normal vector computation + */ + //@{ + + /** \brief Compute normals for all primitives + * + * Calls update_face_normals() , update_halfedge_normals() and update_vertex_normals() if + * the normals (i.e. the properties) exist. + * + * \note Face normals are required to compute vertex and halfedge normals! + */ + void update_normals(); + + /// Update normal for face _fh + void update_normal(FaceHandle _fh) + { this->set_normal(_fh, calc_face_normal(_fh)); } + + /** \brief Update normal vectors for all faces. + * + * \attention Needs the Attributes::Normal attribute for faces. + * Call request_face_normals() before using it! + */ + void update_face_normals(); + + /** Calculate normal vector for face _fh. */ + virtual Normal calc_face_normal(FaceHandle _fh) const; + + /** Calculate normal vector for face (_p0, _p1, _p2). */ + Normal calc_face_normal(const Point& _p0, const Point& _p1, + const Point& _p2) const; + /// calculates the average of the vertices defining _fh + void calc_face_centroid(FaceHandle _fh, Point& _pt) const { + _pt = calc_face_centroid(_fh); + } + + /// Computes and returns the average of the vertices defining _gh + Point calc_face_centroid(FaceHandle _fh) const; + + /// Update normal for halfedge _heh + void update_normal(HalfedgeHandle _heh, const double _feature_angle = 0.8) + { this->set_normal(_heh, calc_halfedge_normal(_heh,_feature_angle)); } + + /** \brief Update normal vectors for all halfedges. + * + * Uses the existing face normals to compute halfedge normals + * + * \note Face normals have to be computed first! + * + * \attention Needs the Attributes::Normal attribute for faces and halfedges. + * Call request_face_normals() and request_halfedge_normals() before using it! + */ + void update_halfedge_normals(const double _feature_angle = 0.8); + + /** \brief Calculate halfedge normal for one specific halfedge + * + * Calculate normal vector for halfedge _heh. + * + * \note Face normals have to be computed first! + * + * \attention Needs the Attributes::Normal attribute for faces and vertices. + * Call request_face_normals() and request_halfedge_normals() before using it! + * + * @param _heh Handle of the halfedge + * @param _feature_angle If the dihedral angle across this edge is greater than this value, the edge is considered as a feature edge (angle in radians) + */ + virtual Normal calc_halfedge_normal(HalfedgeHandle _heh, const double _feature_angle = 0.8) const; + + + /** identifies feature edges w.r.t. the minimal dihedral angle for feature edges (in radians) */ + /** and the status feature tag */ + bool is_estimated_feature_edge(HalfedgeHandle _heh, const double _feature_angle) const; + + /// Update normal for vertex _vh + void update_normal(VertexHandle _vh) + { this->set_normal(_vh, calc_vertex_normal(_vh)); } + + /** \brief Update normal vectors for all vertices. + * + * Uses existing face normals to calculate new vertex normals. + * + * \note Face normals have to be computed first! + * + * \attention Needs the Attributes::Normal attribute for faces and vertices. + * Call request_face_normals() and request_vertex_normals() before using it! + */ + void update_vertex_normals(); + + /** \brief Calculate vertex normal for one specific vertex + * + * Calculate normal vector for vertex _vh by averaging normals + * of adjacent faces. + * + * \note Face normals have to be computed first! + * + * \attention Needs the Attributes::Normal attribute for faces and vertices. + * Call request_face_normals() and request_vertex_normals() before using it! + * + * @param _vh Handle of the vertex + */ + Normal calc_vertex_normal(VertexHandle _vh) const; + + /** Different methods for calculation of the normal at _vh: + - ..._fast - the default one - the same as calc vertex_normal() + - needs the Attributes::Normal attribute for faces + - ..._correct - works properly for non-triangular meshes + - does not need any attributes + - ..._loop - calculates loop surface normals + - does not need any attributes */ + void calc_vertex_normal_fast(VertexHandle _vh, Normal& _n) const; + void calc_vertex_normal_correct(VertexHandle _vh, Normal& _n) const; + void calc_vertex_normal_loop(VertexHandle _vh, Normal& _n) const; + + + //@} + + // --- Geometry API - still in development --- + + /** Calculates the edge vector as the vector defined by + the halfedge with id #0 (see below) */ + void calc_edge_vector(EdgeHandle _eh, Normal& _edge_vec) const + { + _edge_vec = calc_edge_vector(_eh); + } + + /** Calculates the edge vector as the vector defined by + the halfedge with id #0 (see below) */ + Normal calc_edge_vector(EdgeHandle _eh) const + { + return calc_edge_vector(this->halfedge_handle(_eh,0)); + } + + /** Calculates the edge vector as the difference of the + the points defined by to_vertex_handle() and from_vertex_handle() */ + void calc_edge_vector(HalfedgeHandle _heh, Normal& _edge_vec) const + { + _edge_vec = calc_edge_vector(_heh); + } + + /** Calculates the edge vector as the difference of the + the points defined by to_vertex_handle() and from_vertex_handle() */ + Normal calc_edge_vector(HalfedgeHandle _heh) const + { + return this->point(this->to_vertex_handle(_heh)) - + this->point(this->from_vertex_handle(_heh)); + } + + // Calculates the length of the edge _eh + Scalar calc_edge_length(EdgeHandle _eh) const + { return calc_edge_length(this->halfedge_handle(_eh,0)); } + + /** Calculates the length of the edge _heh + */ + Scalar calc_edge_length(HalfedgeHandle _heh) const + { return (Scalar)sqrt(calc_edge_sqr_length(_heh)); } + + Scalar calc_edge_sqr_length(EdgeHandle _eh) const + { return calc_edge_sqr_length(this->halfedge_handle(_eh,0)); } + + Scalar calc_edge_sqr_length(HalfedgeHandle _heh) const + { + Normal edge_vec; + calc_edge_vector(_heh, edge_vec); + return sqrnorm(edge_vec); + } + + /** Calculates the midpoint of the halfedge _heh, defined by the positions of + the two incident vertices */ + Point calc_edge_midpoint(HalfedgeHandle _heh) const + { + VertexHandle vh0 = this->from_vertex_handle(_heh); + VertexHandle vh1 = this->to_vertex_handle(_heh); + return 0.5 * (this->point(vh0) + this->point(vh1)); + } + + /** Calculates the midpoint of the edge _eh, defined by the positions of the + two incident vertices */ + Point calc_edge_midpoint(EdgeHandle _eh) const + { + return calc_edge_midpoint(this->halfedge_handle(_eh, 0)); + } + + /** defines a consistent representation of a sector geometry: + the halfedge _in_heh defines the sector orientation + the vertex pointed by _in_heh defines the sector center + _vec0 and _vec1 are resp. the first and the second vectors defining the sector */ + void calc_sector_vectors(HalfedgeHandle _in_heh, Normal& _vec0, Normal& _vec1) const + { + calc_edge_vector(this->next_halfedge_handle(_in_heh), _vec0);//p2 - p1 + calc_edge_vector(this->opposite_halfedge_handle(_in_heh), _vec1);//p0 - p1 + } + + /** calculates the sector angle.\n + * The vertex pointed by _in_heh defines the sector center + * The angle will be calculated between the given halfedge and the next halfedge.\n + * Seen from the center vertex this will be the next halfedge in clockwise direction.\n + NOTE: only boundary concave sectors are treated correctly */ + Scalar calc_sector_angle(HalfedgeHandle _in_heh) const + { + Normal v0, v1; + calc_sector_vectors(_in_heh, v0, v1); + Scalar denom = norm(v0)*norm(v1); + if ( denom == Scalar(0)) + { + return 0; + } + Scalar cos_a = dot(v0 , v1) / denom; + if (this->is_boundary(_in_heh)) + {//determine if the boundary sector is concave or convex + FaceHandle fh(this->face_handle(this->opposite_halfedge_handle(_in_heh))); + Normal f_n(calc_face_normal(fh));//this normal is (for convex fh) OK + Scalar sign_a = dot(cross(v0, v1), f_n); + return angle(cos_a, sign_a); + } + else + { + return acos(sane_aarg(cos_a)); + } + } + + // calculate the cos and the sin of angle <(_in_heh,next_halfedge(_in_heh)) + /* + void calc_sector_angle_cos_sin(HalfedgeHandle _in_heh, Scalar& _cos_a, Scalar& _sin_a) const + { + Normal in_vec, out_vec; + calc_edge_vector(_in_heh, in_vec); + calc_edge_vector(next_halfedge_handle(_in_heh), out_vec); + Scalar denom = norm(in_vec)*norm(out_vec); + if (is_zero(denom)) + { + _cos_a = 1; + _sin_a = 0; + } + else + { + _cos_a = dot(in_vec, out_vec)/denom; + _sin_a = norm(cross(in_vec, out_vec))/denom; + } + } + */ + /** calculates the normal (non-normalized) of the face sector defined by + the angle <(_in_heh,next_halfedge(_in_heh)) */ + void calc_sector_normal(HalfedgeHandle _in_heh, Normal& _sector_normal) const + { + Normal vec0, vec1; + calc_sector_vectors(_in_heh, vec0, vec1); + _sector_normal = cross(vec0, vec1);//(p2-p1)^(p0-p1) + } + + /** calculates the area of the face sector defined by + the angle <(_in_heh,next_halfedge(_in_heh)) + NOTE: special cases (e.g. concave sectors) are not handled correctly */ + Scalar calc_sector_area(HalfedgeHandle _in_heh) const + { + Normal sector_normal; + calc_sector_normal(_in_heh, sector_normal); + return norm(sector_normal)/2; + } + + /** calculates the dihedral angle on the halfedge _heh + \attention Needs the Attributes::Normal attribute for faces */ + Scalar calc_dihedral_angle_fast(HalfedgeHandle _heh) const + { + // Make sure that we have face normals on the mesh + assert(Kernel::has_face_normals()); + + if (this->is_boundary(this->edge_handle(_heh))) + {//the dihedral angle at a boundary edge is 0 + return 0; + } + const Normal& n0 = this->normal(this->face_handle(_heh)); + const Normal& n1 = this->normal(this->face_handle(this->opposite_halfedge_handle(_heh))); + Normal he; + calc_edge_vector(_heh, he); + Scalar da_cos = dot(n0, n1); + //should be normalized, but we need only the sign + Scalar da_sin_sign = dot(cross(n0, n1), he); + return angle(da_cos, da_sin_sign); + } + + /** calculates the dihedral angle on the edge _eh + \attention Needs the Attributes::Normal attribute for faces */ + Scalar calc_dihedral_angle_fast(EdgeHandle _eh) const + { return calc_dihedral_angle_fast(this->halfedge_handle(_eh,0)); } + + // calculates the dihedral angle on the halfedge _heh + Scalar calc_dihedral_angle(HalfedgeHandle _heh) const + { + if (this->is_boundary(this->edge_handle(_heh))) + {//the dihedral angle at a boundary edge is 0 + return 0; + } + Normal n0, n1, he; + calc_sector_normal(_heh, n0); + calc_sector_normal(this->opposite_halfedge_handle(_heh), n1); + calc_edge_vector(_heh, he); + Scalar denom = norm(n0)*norm(n1); + if (denom == Scalar(0)) + { + return 0; + } + Scalar da_cos = dot(n0, n1)/denom; + //should be normalized, but we need only the sign + Scalar da_sin_sign = dot(cross(n0, n1), he); + return angle(da_cos, da_sin_sign); + } + + // calculates the dihedral angle on the edge _eh + Scalar calc_dihedral_angle(EdgeHandle _eh) const + { return calc_dihedral_angle(this->halfedge_handle(_eh,0)); } + + /** tags an edge as a feature if its dihedral angle is larger than _angle_tresh + returns the number of the found feature edges, requires edge_status property*/ + unsigned int find_feature_edges(Scalar _angle_tresh = OpenMesh::deg_to_rad(44.0)); + // --- misc --- + + /// Face split (= 1-to-n split) + inline void split(FaceHandle _fh, const Point& _p) + { Kernel::split(_fh, add_vertex(_p)); } + + inline void split(FaceHandle _fh, VertexHandle _vh) + { Kernel::split(_fh, _vh); } + + inline void split(EdgeHandle _eh, const Point& _p) + { Kernel::split_edge(_eh, add_vertex(_p)); } + + inline void split(EdgeHandle _eh, VertexHandle _vh) + { Kernel::split_edge(_eh, _vh); } + +private: + struct PointIs3DTag {}; + struct PointIsNot3DTag {}; + Normal calc_face_normal_impl(FaceHandle, PointIs3DTag) const; + Normal calc_face_normal_impl(FaceHandle, PointIsNot3DTag) const; + Normal calc_face_normal_impl(const Point&, const Point&, const Point&, PointIs3DTag) const; + Normal calc_face_normal_impl(const Point&, const Point&, const Point&, PointIsNot3DTag) const; +}; + +/** + * @brief Cast a mesh with different but identical traits into each other. + * + * Example: + * @code{.cpp} + * struct TriTraits1 : public OpenMesh::DefaultTraits { + * typedef Vec3d Point; + * }; + * struct TriTraits2 : public OpenMesh::DefaultTraits { + * typedef Vec3d Point; + * }; + * struct TriTraits3 : public OpenMesh::DefaultTraits { + * typedef Vec3f Point; + * }; + * + * TriMesh_ArrayKernelT a; + * TriMesh_ArrayKernelT &b = mesh_cast&>(a); // OK + * TriMesh_ArrayKernelT &c = mesh_cast&>(a); // ERROR + * @endcode + * + * @see MeshCast + * + * @param rhs + * @return + */ +template +LHS mesh_cast(PolyMeshT &rhs) { + return MeshCast&>::cast(rhs); +} + +template +LHS mesh_cast(PolyMeshT *rhs) { + return MeshCast*>::cast(rhs); +} + +template +const LHS mesh_cast(const PolyMeshT &rhs) { + return MeshCast&>::cast(rhs); +} + +template +const LHS mesh_cast(const PolyMeshT *rhs) { + return MeshCast*>::cast(rhs); +} + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_POLYMESH_C) +# define OPENMESH_POLYMESH_TEMPLATES +# include "PolyMeshT.cc" +#endif +//============================================================================= +#endif // OPENMESH_POLYMESHT_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh new file mode 100644 index 0000000..d884ae0 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh @@ -0,0 +1,118 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// CLASS PolyMesh_ArrayKernelT +// +//============================================================================= + + +#ifndef OPENMESH_POLY_MESH_ARRAY_KERNEL_HH +#define OPENMESH_POLY_MESH_ARRAY_KERNEL_HH + + +//== INCLUDES ================================================================= + + +#include +#include +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + +template +class TriMesh_ArrayKernelT; +//== CLASS DEFINITION ========================================================= + +/// Helper class to build a PolyMesh-type +template +struct PolyMesh_ArrayKernel_GeneratorT +{ + typedef FinalMeshItemsT MeshItems; + typedef AttribKernelT AttribKernel; + typedef PolyMeshT Mesh; +}; + + +/** \class PolyMesh_ArrayKernelT PolyMesh_ArrayKernelT.hh + + \ingroup mesh_types_group + Polygonal mesh based on the ArrayKernel. + \see OpenMesh::PolyMeshT + \see OpenMesh::ArrayKernel +*/ +template +class PolyMesh_ArrayKernelT + : public PolyMesh_ArrayKernel_GeneratorT::Mesh +{ +public: + PolyMesh_ArrayKernelT() {} + template + PolyMesh_ArrayKernelT( const TriMesh_ArrayKernelT & t) + { + //assign the connectivity and standard properties + this->assign(t, true); + + } +}; + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_POLY_MESH_ARRAY_KERNEL_HH +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/Status.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/Status.hh new file mode 100644 index 0000000..19e474d --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/Status.hh @@ -0,0 +1,183 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// CLASS Status +// +//============================================================================= + + +#ifndef OPENMESH_ATTRIBUTE_STATUS_HH +#define OPENMESH_ATTRIBUTE_STATUS_HH + + +//== INCLUDES ================================================================= + +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { +namespace Attributes { + + +//== CLASS DEFINITION ======================================================== + + +/** Status bits used by the Status class. + * \see OpenMesh::Attributes::StatusInfo + */ +enum StatusBits { + + DELETED = 1, ///< Item has been deleted + LOCKED = 2, ///< Item is locked. + SELECTED = 4, ///< Item is selected. + HIDDEN = 8, ///< Item is hidden. + FEATURE = 16, ///< Item is a feature or belongs to a feature. + TAGGED = 32, ///< Item is tagged. + TAGGED2 = 64, ///< Alternate bit for tagging an item. + FIXEDNONMANIFOLD = 128, ///< Item was non-two-manifold and had to be fixed + UNUSED = 256 ///< Unused +}; + + +/** \class StatusInfo Status.hh + * + * Add status information to a base class. + * + * \see StatusBits + */ +class StatusInfo +{ +public: + + typedef unsigned int value_type; + + StatusInfo() : status_(0) {} + + /// is deleted ? + bool deleted() const { return is_bit_set(DELETED); } + /// set deleted + void set_deleted(bool _b) { change_bit(DELETED, _b); } + + + /// is locked ? + bool locked() const { return is_bit_set(LOCKED); } + /// set locked + void set_locked(bool _b) { change_bit(LOCKED, _b); } + + + /// is selected ? + bool selected() const { return is_bit_set(SELECTED); } + /// set selected + void set_selected(bool _b) { change_bit(SELECTED, _b); } + + + /// is hidden ? + bool hidden() const { return is_bit_set(HIDDEN); } + /// set hidden + void set_hidden(bool _b) { change_bit(HIDDEN, _b); } + + + /// is feature ? + bool feature() const { return is_bit_set(FEATURE); } + /// set feature + void set_feature(bool _b) { change_bit(FEATURE, _b); } + + + /// is tagged ? + bool tagged() const { return is_bit_set(TAGGED); } + /// set tagged + void set_tagged(bool _b) { change_bit(TAGGED, _b); } + + + /// is tagged2 ? This is just one more tag info. + bool tagged2() const { return is_bit_set(TAGGED2); } + /// set tagged + void set_tagged2(bool _b) { change_bit(TAGGED2, _b); } + + + /// is fixed non-manifold ? + bool fixed_nonmanifold() const { return is_bit_set(FIXEDNONMANIFOLD); } + /// set fixed non-manifold + void set_fixed_nonmanifold(bool _b) { change_bit(FIXEDNONMANIFOLD, _b); } + + + /// return whole status + unsigned int bits() const { return status_; } + /// set whole status at once + void set_bits(unsigned int _bits) { status_ = _bits; } + + + /// is a certain bit set ? + bool is_bit_set(unsigned int _s) const { return (status_ & _s) > 0; } + /// set a certain bit + void set_bit(unsigned int _s) { status_ |= _s; } + /// unset a certain bit + void unset_bit(unsigned int _s) { status_ &= ~_s; } + /// set or unset a certain bit + void change_bit(unsigned int _s, bool _b) { + if (_b) status_ |= _s; else status_ &= ~_s; } + + +private: + + value_type status_; +}; + + +//============================================================================= +} // namespace Attributes +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_ATTRIBUTE_STATUS_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/Traits.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/Traits.hh new file mode 100644 index 0000000..a0fbe01 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/Traits.hh @@ -0,0 +1,245 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +/** \file Core/Mesh/Traits.hh + This file defines the default traits and some convenience macros. +*/ + + +//============================================================================= +// +// CLASS Traits +// +//============================================================================= + +#ifndef OPENMESH_TRAITS_HH +#define OPENMESH_TRAITS_HH + + +//== INCLUDES ================================================================= + + +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + + +//== CLASS DEFINITION ========================================================= + + +/// Macro for defining the vertex attributes. See \ref mesh_type. +#define VertexAttributes(_i) enum { VertexAttributes = _i } + +/// Macro for defining the halfedge attributes. See \ref mesh_type. +#define HalfedgeAttributes(_i) enum { HalfedgeAttributes = _i } + +/// Macro for defining the edge attributes. See \ref mesh_type. +#define EdgeAttributes(_i) enum { EdgeAttributes = _i } + +/// Macro for defining the face attributes. See \ref mesh_type. +#define FaceAttributes(_i) enum { FaceAttributes = _i } + +/// Macro for defining the vertex traits. See \ref mesh_type. +#define VertexTraits \ + template struct VertexT : public Base + +/// Macro for defining the halfedge traits. See \ref mesh_type. +#define HalfedgeTraits \ + template struct HalfedgeT : public Base + +/// Macro for defining the edge traits. See \ref mesh_type. +#define EdgeTraits \ + template struct EdgeT : public Base + +/// Macro for defining the face traits. See \ref mesh_type. +#define FaceTraits \ + template struct FaceT : public Base + + + +//== CLASS DEFINITION ========================================================= + + +/** \class DefaultTraits Traits.hh + + Base class for all traits. All user traits should be derived from + this class. You may enrich all basic items by additional + properties or define one or more of the types \c Point, \c Normal, + \c TexCoord, or \c Color. + + \see The Mesh docu section on \ref mesh_type. + \see Traits.hh for a list of macros for traits classes. +*/ +struct DefaultTraits +{ + /// The default coordinate type is OpenMesh::Vec3f. + typedef Vec3f Point; + + /// The default normal type is OpenMesh::Vec3f. + typedef Vec3f Normal; + + /// The default 1D texture coordinate type is float. + typedef float TexCoord1D; + /// The default 2D texture coordinate type is OpenMesh::Vec2f. + typedef Vec2f TexCoord2D; + /// The default 3D texture coordinate type is OpenMesh::Vec3f. + typedef Vec3f TexCoord3D; + + /// The default texture index type + typedef int TextureIndex; + + /// The default color type is OpenMesh::Vec3uc. + typedef Vec3uc Color; + +#ifndef DOXY_IGNORE_THIS + VertexTraits {}; + HalfedgeTraits {}; + EdgeTraits {}; + FaceTraits {}; +#endif + + VertexAttributes(0); + HalfedgeAttributes(Attributes::PrevHalfedge); + EdgeAttributes(0); + FaceAttributes(0); +}; + + +//== CLASS DEFINITION ========================================================= + + +/** Helper class to merge two mesh traits. + * \internal + * + * With the help of this class it's possible to merge two mesh traits. + * Whereby \c _Traits1 overrides equally named symbols of \c _Traits2. + * + * For your convenience use the provided defines \c OM_Merge_Traits + * and \c OM_Merge_Traits_In_Template instead. + * + * \see OM_Merge_Traits, OM_Merge_Traits_In_Template + */ +template struct MergeTraits +{ +#ifndef DOXY_IGNORE_THIS + struct Result + { + // Mipspro needs this (strange) typedef + typedef _Traits1 T1; + typedef _Traits2 T2; + + + VertexAttributes ( T1::VertexAttributes | T2::VertexAttributes ); + HalfedgeAttributes ( T1::HalfedgeAttributes | T2::HalfedgeAttributes ); + EdgeAttributes ( T1::EdgeAttributes | T2::EdgeAttributes ); + FaceAttributes ( T1::FaceAttributes | T2::FaceAttributes ); + + + typedef typename T1::Point Point; + typedef typename T1::Normal Normal; + typedef typename T1::Color Color; + typedef typename T1::TexCoord TexCoord; + + template class VertexT : + public T1::template VertexT< + typename T2::template VertexT, Refs> + {}; + + template class HalfedgeT : + public T1::template HalfedgeT< + typename T2::template HalfedgeT, Refs> + {}; + + + template class EdgeT : + public T1::template EdgeT< + typename T2::template EdgeT, Refs> + {}; + + + template class FaceT : + public T1::template FaceT< + typename T2::template FaceT, Refs> + {}; + }; +#endif +}; + + +/** + Macro for merging two traits classes _S1 and _S2 into one traits class _D. + Note that in case of ambiguities class _S1 overrides _S2, especially + the point/normal/color/texcoord type to be used is taken from _S1::Point / + _S1::Normal / _S1::Color / _S1::TexCoord +*/ +#define OM_Merge_Traits(_S1, _S2, _D) \ + typedef OpenMesh::MergeTraits<_S1, _S2>::Result _D; + + +/** + Macro for merging two traits classes _S1 and _S2 into one traits class _D. + Same as OM_Merge_Traits, but this can be used inside template classes. +*/ +#define OM_Merge_Traits_In_Template(_S1, _S2, _D) \ + typedef typename OpenMesh::MergeTraits<_S1, _S2>::Result _D; + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_TRAITS_HH defined +//============================================================================= + diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/TriConnectivity.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/TriConnectivity.hh new file mode 100644 index 0000000..197420d --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/TriConnectivity.hh @@ -0,0 +1,211 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef OPENMESH_TRICONNECTIVITY_HH +#define OPENMESH_TRICONNECTIVITY_HH + +#include + +namespace OpenMesh { + +/** \brief Connectivity Class for Triangle Meshes +*/ +class OPENMESHDLLEXPORT TriConnectivity : public PolyConnectivity +{ +public: + + TriConnectivity() {} + virtual ~TriConnectivity() {} + + inline static bool is_triangles() + { return true; } + + /** assign_connectivity() methods. See ArrayKernel::assign_connectivity() + for more details. When the source connectivity is not triangles, in + addition "fan" connectivity triangulation is performed*/ + inline void assign_connectivity(const TriConnectivity& _other) + { PolyConnectivity::assign_connectivity(_other); } + + inline void assign_connectivity(const PolyConnectivity& _other) + { + PolyConnectivity::assign_connectivity(_other); + triangulate(); + } + + /** \name Addding items to a mesh + */ + + //@{ + + /** \brief Add a face with arbitrary valence to the triangle mesh + * + * Override OpenMesh::Mesh::PolyMeshT::add_face(). Faces that aren't + * triangles will be triangulated and added. In this case an + * invalid face handle will be returned. + * + * + * */ + FaceHandle add_face(const VertexHandle* _vhandles, size_t _vhs_size); + + /** \brief Add a face with arbitrary valence to the triangle mesh + * + * Override OpenMesh::Mesh::PolyMeshT::add_face(). Faces that aren't + * triangles will be triangulated and added. In this case an + * invalid face handle will be returned. + * + * + * */ + FaceHandle add_face(const std::vector& _vhandles); + + /** \brief Add a face to the mesh (triangle) + * + * This function adds a triangle to the mesh. The triangle is passed directly + * to the underlying PolyConnectivity as we don't explicitly need to triangulate something. + * + * @param _vh0 VertexHandle 1 + * @param _vh1 VertexHandle 2 + * @param _vh2 VertexHandle 3 + * @return FaceHandle of the added face (invalid, if the operation failed) + */ + FaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2); + + //@} + + /** Returns the opposite vertex to the halfedge _heh in the face + referenced by _heh returns InvalidVertexHandle if the _heh is + boundary */ + inline VertexHandle opposite_vh(HalfedgeHandle _heh) const + { + return is_boundary(_heh) ? InvalidVertexHandle : + to_vertex_handle(next_halfedge_handle(_heh)); + } + + /** Returns the opposite vertex to the opposite halfedge of _heh in + the face referenced by it returns InvalidVertexHandle if the + opposite halfedge is boundary */ + VertexHandle opposite_he_opposite_vh(HalfedgeHandle _heh) const + { return opposite_vh(opposite_halfedge_handle(_heh)); } + + /** \name Topology modifying operators + */ + //@{ + + + /** Returns whether collapsing halfedge _heh is ok or would lead to + topological inconsistencies. + \attention This method need the Attributes::Status attribute and + changes the \em tagged bit. */ + bool is_collapse_ok(HalfedgeHandle _heh); + + /// Vertex Split: inverse operation to collapse(). + HalfedgeHandle vertex_split(VertexHandle v0, VertexHandle v1, + VertexHandle vl, VertexHandle vr); + + /// Check whether flipping _eh is topologically correct. + bool is_flip_ok(EdgeHandle _eh) const; + + /** Flip edge _eh. + Check for topological correctness first using is_flip_ok(). */ + void flip(EdgeHandle _eh); + + + /** \brief Edge split (= 2-to-4 split) + * + * + * The function will introduce two new faces ( non-boundary case) or + * one additional face (if edge is boundary) + * + * \note The properties of the new edges, halfedges, and faces will be undefined! + * + * @param _eh Edge handle that should be splitted + * @param _vh Vertex handle that will be inserted at the edge + */ + void split(EdgeHandle _eh, VertexHandle _vh); + + /** \brief Edge split (= 2-to-4 split) + * + * The function will introduce two new faces ( non-boundary case) or + * one additional face (if edge is boundary) + * + * \note The properties of the new edges will be adjusted to the properties of the original edge + * \note The properties of the new faces and halfedges will be undefined + * + * @param _eh Edge handle that should be splitted + * @param _vh Vertex handle that will be inserted at the edge + */ + void split_copy(EdgeHandle _eh, VertexHandle _vh); + + /** \brief Face split (= 1-to-3) split, calls corresponding PolyMeshT function). + * + * @param _fh Face handle that should be splitted + * @param _vh Vertex handle that will be inserted at the face + */ + inline void split(FaceHandle _fh, VertexHandle _vh) + { PolyConnectivity::split(_fh, _vh); } + + /** \brief Face split (= 1-to-3) split, calls corresponding PolyMeshT function). + * + * @param _fh Face handle that should be splitted + * @param _vh Vertex handle that will be inserted at the face + */ + inline void split_copy(FaceHandle _fh, VertexHandle _vh) + { PolyConnectivity::split_copy(_fh, _vh); } + + //@} + +private: + /// Helper for vertex split + HalfedgeHandle insert_loop(HalfedgeHandle _hh); + /// Helper for vertex split + HalfedgeHandle insert_edge(VertexHandle _vh, + HalfedgeHandle _h0, HalfedgeHandle _h1); +}; + +} + +#endif//OPENMESH_TRICONNECTIVITY_HH diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/TriMeshT.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/TriMeshT.hh new file mode 100644 index 0000000..1865f30 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/TriMeshT.hh @@ -0,0 +1,438 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// CLASS TriMeshT +// +//============================================================================= + + +#ifndef OPENMESH_TRIMESH_HH +#define OPENMESH_TRIMESH_HH + + +//== INCLUDES ================================================================= + + +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + + +//== CLASS DEFINITION ========================================================= + + +/** \class TriMeshT TriMeshT.hh + + Base type for a triangle mesh. + + Base type for a triangle mesh, parameterized by a mesh kernel. The + mesh inherits all methods from the kernel class and the + more general polygonal mesh PolyMeshT. Therefore it provides + the same types for items, handles, iterators and so on. + + \param Kernel: template argument for the mesh kernel + \note You should use the predefined mesh-kernel combinations in + \ref mesh_types_group + \see \ref mesh_type + \see OpenMesh::PolyMeshT +*/ + +template +class TriMeshT : public PolyMeshT +{ + +public: + + + // self + typedef TriMeshT This; + typedef PolyMeshT PolyMesh; + + //@{ + /// Determine whether this is a PolyMeshT or TriMeshT ( This function does not check the per face vertex count! It only checks if the datatype is PolyMeshT or TriMeshT ) + enum { IsPolyMesh = 0 }; + enum { IsTriMesh = 1 }; + static bool is_polymesh() { return false; } + static bool is_trimesh() { return true; } + //@} + + //--- items --- + + typedef typename PolyMesh::Scalar Scalar; + typedef typename PolyMesh::Point Point; + typedef typename PolyMesh::Normal Normal; + typedef typename PolyMesh::Color Color; + typedef typename PolyMesh::TexCoord1D TexCoord1D; + typedef typename PolyMesh::TexCoord2D TexCoord2D; + typedef typename PolyMesh::TexCoord3D TexCoord3D; + typedef typename PolyMesh::Vertex Vertex; + typedef typename PolyMesh::Halfedge Halfedge; + typedef typename PolyMesh::Edge Edge; + typedef typename PolyMesh::Face Face; + + + //--- handles --- + + typedef typename PolyMesh::VertexHandle VertexHandle; + typedef typename PolyMesh::HalfedgeHandle HalfedgeHandle; + typedef typename PolyMesh::EdgeHandle EdgeHandle; + typedef typename PolyMesh::FaceHandle FaceHandle; + + + //--- iterators --- + + typedef typename PolyMesh::VertexIter VertexIter; + typedef typename PolyMesh::ConstVertexIter ConstVertexIter; + typedef typename PolyMesh::EdgeIter EdgeIter; + typedef typename PolyMesh::ConstEdgeIter ConstEdgeIter; + typedef typename PolyMesh::FaceIter FaceIter; + typedef typename PolyMesh::ConstFaceIter ConstFaceIter; + + + + //--- circulators --- + + typedef typename PolyMesh::VertexVertexIter VertexVertexIter; + typedef typename PolyMesh::VertexOHalfedgeIter VertexOHalfedgeIter; + typedef typename PolyMesh::VertexIHalfedgeIter VertexIHalfedgeIter; + typedef typename PolyMesh::VertexEdgeIter VertexEdgeIter; + typedef typename PolyMesh::VertexFaceIter VertexFaceIter; + typedef typename PolyMesh::FaceVertexIter FaceVertexIter; + typedef typename PolyMesh::FaceHalfedgeIter FaceHalfedgeIter; + typedef typename PolyMesh::FaceEdgeIter FaceEdgeIter; + typedef typename PolyMesh::FaceFaceIter FaceFaceIter; + typedef typename PolyMesh::ConstVertexVertexIter ConstVertexVertexIter; + typedef typename PolyMesh::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter; + typedef typename PolyMesh::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter; + typedef typename PolyMesh::ConstVertexEdgeIter ConstVertexEdgeIter; + typedef typename PolyMesh::ConstVertexFaceIter ConstVertexFaceIter; + typedef typename PolyMesh::ConstFaceVertexIter ConstFaceVertexIter; + typedef typename PolyMesh::ConstFaceHalfedgeIter ConstFaceHalfedgeIter; + typedef typename PolyMesh::ConstFaceEdgeIter ConstFaceEdgeIter; + typedef typename PolyMesh::ConstFaceFaceIter ConstFaceFaceIter; + + // --- constructor/destructor + + /// Default constructor + TriMeshT() : PolyMesh() {} + explicit TriMeshT(PolyMesh rhs) : PolyMesh((rhs.triangulate(), rhs)) + { + } + + /// Destructor + virtual ~TriMeshT() {} + + //--- halfedge collapse / vertex split --- + + /** \brief Vertex Split: inverse operation to collapse(). + * + * Insert the new vertex at position v0. The vertex will be added + * as the inverse of the vertex split. The faces above the split + * will be correctly attached to the two new edges + * + * Before: + * v_l v0 v_r + * x x x + * \ / + * \ / + * \ / + * \ / + * \ / + * \ / + * x + * v1 + * + * After: + * v_l v0 v_r + * x------x------x + * \ | / + * \ | / + * \ | / + * \ | / + * \ | / + * \|/ + * x + * v1 + * + * @param _v0_point Point position for the new point + * @param _v1 Vertex that will be split + * @param _vl Left vertex handle + * @param _vr Right vertex handle + * @return Newly inserted halfedge + */ + inline HalfedgeHandle vertex_split(Point _v0_point, VertexHandle _v1, + VertexHandle _vl, VertexHandle _vr) + { return PolyMesh::vertex_split(this->add_vertex(_v0_point), _v1, _vl, _vr); } + + /** \brief Vertex Split: inverse operation to collapse(). + * + * Insert the new vertex at position v0. The vertex will be added + * as the inverse of the vertex split. The faces above the split + * will be correctly attached to the two new edges + * + * Before: + * v_l v0 v_r + * x x x + * \ / + * \ / + * \ / + * \ / + * \ / + * \ / + * x + * v1 + * + * After: + * v_l v0 v_r + * x------x------x + * \ | / + * \ | / + * \ | / + * \ | / + * \ | / + * \|/ + * x + * v1 + * + * @param _v0 Vertex handle for the newly inserted point (Input has to be unconnected!) + * @param _v1 Vertex that will be split + * @param _vl Left vertex handle + * @param _vr Right vertex handle + * @return Newly inserted halfedge + */ + inline HalfedgeHandle vertex_split(VertexHandle _v0, VertexHandle _v1, + VertexHandle _vl, VertexHandle _vr) + { return PolyMesh::vertex_split(_v0, _v1, _vl, _vr); } + + /** \brief Edge split (= 2-to-4 split) + * + * The properties of the new edges will be undefined! + * + * + * @param _eh Edge handle that should be splitted + * @param _p New point position that will be inserted at the edge + * @return Vertex handle of the newly added vertex + */ + inline VertexHandle split(EdgeHandle _eh, const Point& _p) + { + //Do not call PolyMeshT function below as this does the wrong operation + const VertexHandle vh = this->add_vertex(_p); Kernel::split(_eh, vh); return vh; + } + + /** \brief Edge split (= 2-to-4 split) + * + * The properties of the new edges will be adjusted to the properties of the original edge + * + * @param _eh Edge handle that should be splitted + * @param _p New point position that will be inserted at the edge + * @return Vertex handle of the newly added vertex + */ + inline VertexHandle split_copy(EdgeHandle _eh, const Point& _p) + { + //Do not call PolyMeshT function below as this does the wrong operation + const VertexHandle vh = this->add_vertex(_p); Kernel::split_copy(_eh, vh); return vh; + } + + /** \brief Edge split (= 2-to-4 split) + * + * The properties of the new edges will be undefined! + * + * @param _eh Edge handle that should be splitted + * @param _vh Vertex handle that will be inserted at the edge + */ + inline void split(EdgeHandle _eh, VertexHandle _vh) + { + //Do not call PolyMeshT function below as this does the wrong operation + Kernel::split(_eh, _vh); + } + + /** \brief Edge split (= 2-to-4 split) + * + * The properties of the new edges will be adjusted to the properties of the original edge + * + * @param _eh Edge handle that should be splitted + * @param _vh Vertex handle that will be inserted at the edge + */ + inline void split_copy(EdgeHandle _eh, VertexHandle _vh) + { + //Do not call PolyMeshT function below as this does the wrong operation + Kernel::split_copy(_eh, _vh); + } + + /** \brief Face split (= 1-to-3 split, calls corresponding PolyMeshT function). + * + * The properties of the new faces will be undefined! + * + * @param _fh Face handle that should be splitted + * @param _p New point position that will be inserted in the face + * + * @return Vertex handle of the new vertex + */ + inline VertexHandle split(FaceHandle _fh, const Point& _p) + { const VertexHandle vh = this->add_vertex(_p); PolyMesh::split(_fh, vh); return vh; } + + /** \brief Face split (= 1-to-3 split, calls corresponding PolyMeshT function). + * + * The properties of the new faces will be adjusted to the properties of the original face + * + * @param _fh Face handle that should be splitted + * @param _p New point position that will be inserted in the face + * + * @return Vertex handle of the new vertex + */ + inline VertexHandle split_copy(FaceHandle _fh, const Point& _p) + { const VertexHandle vh = this->add_vertex(_p); PolyMesh::split_copy(_fh, vh); return vh; } + + + /** \brief Face split (= 1-to-4) split, splits edges at midpoints and adds 4 new faces in the interior). + * + * @param _fh Face handle that should be splitted + */ + inline void split(FaceHandle _fh) + { + // Collect halfedges of face + HalfedgeHandle he0 = this->halfedge_handle(_fh); + HalfedgeHandle he1 = this->next_halfedge_handle(he0); + HalfedgeHandle he2 = this->next_halfedge_handle(he1); + + EdgeHandle eh0 = this->edge_handle(he0); + EdgeHandle eh1 = this->edge_handle(he1); + EdgeHandle eh2 = this->edge_handle(he2); + + // Collect points of face + VertexHandle p0 = this->to_vertex_handle(he0); + VertexHandle p1 = this->to_vertex_handle(he1); + VertexHandle p2 = this->to_vertex_handle(he2); + + // Calculate midpoint coordinates + const Point new0 = (this->point(p0) + this->point(p2)) * static_cast::value_type >(0.5); + const Point new1 = (this->point(p0) + this->point(p1)) * static_cast::value_type >(0.5); + const Point new2 = (this->point(p1) + this->point(p2)) * static_cast::value_type >(0.5); + + // Add vertices at midpoint coordinates + VertexHandle v0 = this->add_vertex(new0); + VertexHandle v1 = this->add_vertex(new1); + VertexHandle v2 = this->add_vertex(new2); + + const bool split0 = !this->is_boundary(eh0); + const bool split1 = !this->is_boundary(eh1); + const bool split2 = !this->is_boundary(eh2); + + // delete original face + this->delete_face(_fh); + + // split boundary edges of deleted face ( if not boundary ) + if ( split0 ) { + this->split(eh0,v0); + } + + if ( split1 ) { + this->split(eh1,v1); + } + + if ( split2 ) { + this->split(eh2,v2); + } + + // Retriangulate + this->add_face(v0 , p0, v1); + this->add_face(p2, v0 , v2); + this->add_face(v2,v1,p1); + this->add_face(v2 , v0, v1); + } + + /** \brief Face split (= 1-to-3 split, calls corresponding PolyMeshT function). + * + * The properties of the new faces will be undefined! + * + * @param _fh Face handle that should be splitted + * @param _vh Vertex handle that will be inserted at the face + */ + inline void split(FaceHandle _fh, VertexHandle _vh) + { PolyMesh::split(_fh, _vh); } + + /** \brief Face split (= 1-to-3 split, calls corresponding PolyMeshT function). + * + * The properties of the new faces will be adjusted to the properties of the original face + * + * @param _fh Face handle that should be splitted + * @param _vh Vertex handle that will be inserted at the face + */ + inline void split_copy(FaceHandle _fh, VertexHandle _vh) + { PolyMesh::split_copy(_fh, _vh); } + + /** \name Normal vector computation + */ + //@{ + + /** Calculate normal vector for face _fh (specialized for TriMesh). */ + Normal calc_face_normal(FaceHandle _fh) const; + + //@} +}; + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_TRIMESH_C) +#define OPENMESH_TRIMESH_TEMPLATES +#include "TriMeshT.cc" +#endif +//============================================================================= +#endif // OPENMESH_TRIMESH_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh new file mode 100644 index 0000000..0c648bf --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh @@ -0,0 +1,117 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// CLASS TriMesh_ArrayKernelT +// +//============================================================================= + + +#ifndef OPENMESH_TRIMESH_ARRAY_KERNEL_HH +#define OPENMESH_TRIMESH_ARRAY_KERNEL_HH + + +//== INCLUDES ================================================================= + + +#include +#include +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + +template +class PolyMesh_ArrayKernelT; +//== CLASS DEFINITION ========================================================= + + +/// Helper class to create a TriMesh-type based on ArrayKernelT +template +struct TriMesh_ArrayKernel_GeneratorT +{ + typedef FinalMeshItemsT MeshItems; + typedef AttribKernelT AttribKernel; + typedef TriMeshT Mesh; +}; + + + +/** \ingroup mesh_types_group + Triangle mesh based on the ArrayKernel. + \see OpenMesh::TriMeshT + \see OpenMesh::ArrayKernelT +*/ +template +class TriMesh_ArrayKernelT + : public TriMesh_ArrayKernel_GeneratorT::Mesh +{ +public: + TriMesh_ArrayKernelT() {} + template + TriMesh_ArrayKernelT( const PolyMesh_ArrayKernelT & t) + { + //assign the connectivity and standard properties + this->assign(t,true); + } +}; + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_TRIMESH_ARRAY_KERNEL_HH +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/circulators_header.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/circulators_header.hh new file mode 100644 index 0000000..72bab07 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/circulators_header.hh @@ -0,0 +1,98 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef OPENMESH_CIRCULATORS_HH +#define OPENMESH_CIRCULATORS_HH + +//============================================================================= +// +// Vertex and Face circulators for PolyMesh/TriMesh +// +//============================================================================= + + + +//== INCLUDES ================================================================= + +#include +#include + + +//== NAMESPACES =============================================================== + +namespace OpenMesh { +namespace Iterators { + + +//== FORWARD DECLARATIONS ===================================================== + + +template class VertexVertexIterT; +template class VertexIHalfedgeIterT; +template class VertexOHalfedgeIterT; +template class VertexEdgeIterT; +template class VertexFaceIterT; + +template class ConstVertexVertexIterT; +template class ConstVertexIHalfedgeIterT; +template class ConstVertexOHalfedgeIterT; +template class ConstVertexEdgeIterT; +template class ConstVertexFaceIterT; + +template class FaceVertexIterT; +template class FaceHalfedgeIterT; +template class FaceEdgeIterT; +template class FaceFaceIterT; + +template class ConstFaceVertexIterT; +template class ConstFaceHalfedgeIterT; +template class ConstFaceEdgeIterT; +template class ConstFaceFaceIterT; + + + diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/circulators_template.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/circulators_template.hh new file mode 100644 index 0000000..97a2171 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/circulators_template.hh @@ -0,0 +1,190 @@ +//== CLASS DEFINITION ========================================================= + + +/** \class CirculatorT CirculatorsT.hh + Circulator. +*/ + +template +class CirculatorT +{ + public: + + + //--- Typedefs --- + + typedef typename Mesh::HalfedgeHandle HalfedgeHandle; + + typedef TargetType value_type; + typedef TargetHandle value_handle; + +#if IsConst + typedef const Mesh& mesh_ref; + typedef const Mesh* mesh_ptr; + typedef const TargetType& reference; + typedef const TargetType* pointer; +#else + typedef Mesh& mesh_ref; + typedef Mesh* mesh_ptr; + typedef TargetType& reference; + typedef TargetType* pointer; +#endif + + + + /// Default constructor + CirculatorT() : mesh_(0), active_(false) {} + + + /// Construct with mesh and a SourceHandle + CirculatorT(mesh_ref _mesh, SourceHandle _start) : + mesh_(&_mesh), + start_(_mesh.halfedge_handle(_start)), + heh_(start_), + active_(false) + { post_init; } + + + /// Construct with mesh and start halfedge + CirculatorT(mesh_ref _mesh, HalfedgeHandle _heh) : + mesh_(&_mesh), + start_(_heh), + heh_(_heh), + active_(false) + { post_init; } + + + /// Copy constructor + CirculatorT(const CirculatorT& _rhs) : + mesh_(_rhs.mesh_), + start_(_rhs.start_), + heh_(_rhs.heh_), + active_(_rhs.active_) + { post_init; } + + + /// Assignment operator + CirculatorT& operator=(const CirculatorT& _rhs) + { + mesh_ = _rhs.mesh_; + start_ = _rhs.start_; + heh_ = _rhs.heh_; + active_ = _rhs.active_; + return *this; + } + + +#if IsConst + /// construct from non-const circulator type + CirculatorT(const NonConstCircT& _rhs) : + mesh_(_rhs.mesh_), + start_(_rhs.start_), + heh_(_rhs.heh_), + active_(_rhs.active_) + { post_init; } + + + /// assign from non-const circulator + CirculatorT& operator=(const NonConstCircT& _rhs) + { + mesh_ = _rhs.mesh_; + start_ = _rhs.start_; + heh_ = _rhs.heh_; + active_ = _rhs.active_; + return *this; + } +#else + friend class ConstCircT; +#endif + + + /// Equal ? + bool operator==(const CirculatorT& _rhs) const { + return ((mesh_ == _rhs.mesh_) && + (start_ == _rhs.start_) && + (heh_ == _rhs.heh_) && + (active_ == _rhs.active_)); + } + + + /// Not equal ? + bool operator!=(const CirculatorT& _rhs) const { + return !operator==(_rhs); + } + + + /// Pre-Increment (next cw target) + CirculatorT& operator++() { + assert(mesh_); + active_ = true; + increment; + return *this; + } + + + /// Pre-Decrement (next ccw target) + CirculatorT& operator--() { + assert(mesh_); + active_ = true; + decrement; + return *this; + } + + + /** Get the current halfedge. There are \c Vertex*Iters and \c + Face*Iters. For both the current state is defined by the + current halfedge. This is what this method returns. + */ + HalfedgeHandle current_halfedge_handle() const { + return heh_; + } + + + /// Return the handle of the current target. + TargetHandle handle() const { + assert(mesh_); + return get_handle; + } + + + /// Cast to the handle of the current target. + operator TargetHandle() const { + assert(mesh_); + return get_handle; + } + + + /// Return a reference to the current target. + reference operator*() const { + assert(mesh_); + return mesh_->deref(handle()); + } + + + /// Return a pointer to the current target. + pointer operator->() const { + assert(mesh_); + return &mesh_->deref(handle()); + } + + + /** Returns whether the circulator is still valid. + After one complete round around a vertex/face the circulator becomes + invalid, i.e. this function will return \c false. Nevertheless you + can continue circulating. This method just tells you whether you + have completed the first round. + */ + operator bool() const { + return heh_.is_valid() && ((start_ != heh_) || (!active_)); + } + + +private: + + mesh_ptr mesh_; + HalfedgeHandle start_, heh_; + bool active_; +}; + + + diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/footer.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/footer.hh new file mode 100644 index 0000000..8e2a9c1 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/footer.hh @@ -0,0 +1,6 @@ +//============================================================================= +} // namespace Iterators +} // namespace OpenMesh +//============================================================================= +#endif +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/generate.sh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/generate.sh new file mode 100644 index 0000000..3bcaffd --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/generate.sh @@ -0,0 +1,175 @@ +#!/bin/bash + +#------------------------------------------------------------------------------ + + +# generate_iterator( TargetType, n_elements, has_element_status ) +function generate_iterator +{ + NonConstIter=$1"IterT" + ConstIter="Const"$NonConstIter + TargetType="typename Mesh::"$1 + TargetHandle="typename Mesh::"$1"Handle" + + + cat iterators_template.hh \ + | sed -e "s/IteratorT/$NonConstIter/; s/IteratorT/$NonConstIter/; + s/NonConstIterT/$NonConstIter/; + s/ConstIterT/$ConstIter/; + s/TargetType/$TargetType/; + s/TargetHandle/$TargetHandle/; + s/IsConst/0/; + s/n_elements/$2/; + s/has_element_status/$3/;" + + + cat iterators_template.hh \ + | sed -e "s/IteratorT/$ConstIter/; s/IteratorT/$ConstIter/; + s/NonConstIterT/$NonConstIter/; + s/ConstIterT/$ConstIter/; + s/TargetType/$TargetType/; + s/TargetHandle/$TargetHandle/; + s/IsConst/1/; + s/n_elements/$2/; + s/has_element_status/$3/;" +} + + +#------------------------------------------------------------------------------ + + +# generate_circulator( NonConstName, SourceType, TargetType, +# post_init, +# increment, decrement, +# get_handle, +# [Name] ) +function generate_circulator +{ + NonConstCirc=$1 + ConstCirc="Const"$NonConstCirc + SourceHandle="typename Mesh::"$2"Handle" + TargetHandle="typename Mesh::"$3"Handle" + TargetType="typename Mesh::"$3 + + + cat circulators_template.hh \ + | sed -e "s/CirculatorT/$NonConstCirc/; s/CirculatorT/$NonConstCirc/; + s/NonConstCircT/$NonConstCirc/; + s/ConstCircT/$ConstCirc/; + s/SourceHandle/$SourceHandle/; + s/TargetHandle/$TargetHandle/; + s/TargetType/$TargetType/; + s/IsConst/0/; + s/post_init/$4/; + s/increment/$5/; + s/decrement/$6/; + s/get_handle/$7/;" + + + cat circulators_template.hh \ + | sed -e "s/CirculatorT/$ConstCirc/; s/CirculatorT/$ConstCirc/; + s/NonConstCircT/$NonConstCirc/; + s/ConstCircT/$ConstCirc/; + s/SourceHandle/$SourceHandle/; + s/TargetHandle/$TargetHandle/; + s/TargetType/$TargetType/; + s/IsConst/1/; + s/post_init/$4/; + s/increment/$5/; + s/decrement/$6/; + s/get_handle/$7/;" +} + + +#------------------------------------------------------------------------------ + + +### Generate IteratorsT.hh + +cat iterators_header.hh > IteratorsT.hh + +generate_iterator Vertex n_vertices has_vertex_status >> IteratorsT.hh +generate_iterator Halfedge n_halfedges has_halfedge_status >> IteratorsT.hh +generate_iterator Edge n_edges has_edge_status >> IteratorsT.hh +generate_iterator Face n_faces has_face_status >> IteratorsT.hh + +cat footer.hh >> IteratorsT.hh + + +#------------------------------------------------------------------------------ + + +### Generate CirculatorsT.hh + +cat circulators_header.hh > CirculatorsT.hh + + +generate_circulator VertexVertexIterT Vertex Vertex \ + " " \ + "heh_=mesh_->cw_rotated_halfedge_handle(heh_);" \ + "heh_=mesh_->ccw_rotated_halfedge_handle(heh_);" \ + "mesh_->to_vertex_handle(heh_);" \ + >> CirculatorsT.hh + +generate_circulator VertexOHalfedgeIterT Vertex Halfedge \ + " " \ + "heh_=mesh_->cw_rotated_halfedge_handle(heh_);" \ + "heh_=mesh_->ccw_rotated_halfedge_handle(heh_);" \ + "heh_" \ + >> CirculatorsT.hh + +generate_circulator VertexIHalfedgeIterT Vertex Halfedge \ + " " \ + "heh_=mesh_->cw_rotated_halfedge_handle(heh_);" \ + "heh_=mesh_->ccw_rotated_halfedge_handle(heh_);" \ + "mesh_->opposite_halfedge_handle(heh_)" \ + >> CirculatorsT.hh + +generate_circulator VertexEdgeIterT Vertex Edge \ + " " \ + "heh_=mesh_->cw_rotated_halfedge_handle(heh_);" \ + "heh_=mesh_->ccw_rotated_halfedge_handle(heh_);" \ + "mesh_->edge_handle(heh_)" \ + >> CirculatorsT.hh + +generate_circulator VertexFaceIterT Vertex Face \ + "if (heh_.is_valid() \&\& !handle().is_valid()) operator++();" \ + "do heh_=mesh_->cw_rotated_halfedge_handle(heh_); while ((*this) \&\& (!handle().is_valid()));" \ + "do heh_=mesh_->ccw_rotated_halfedge_handle(heh_); while ((*this) \&\& (!handle().is_valid()));" \ + "mesh_->face_handle(heh_)" \ + >> CirculatorsT.hh + + +generate_circulator FaceVertexIterT Face Vertex \ + " " \ + "heh_=mesh_->next_halfedge_handle(heh_);" \ + "heh_=mesh_->prev_halfedge_handle(heh_);" \ + "mesh_->to_vertex_handle(heh_)" \ + >> CirculatorsT.hh + +generate_circulator FaceHalfedgeIterT Face Halfedge \ + " " \ + "heh_=mesh_->next_halfedge_handle(heh_);" \ + "heh_=mesh_->prev_halfedge_handle(heh_);" \ + "heh_" \ + >> CirculatorsT.hh + +generate_circulator FaceEdgeIterT Face Edge \ + " " \ + "heh_=mesh_->next_halfedge_handle(heh_);" \ + "heh_=mesh_->prev_halfedge_handle(heh_);" \ + "mesh_->edge_handle(heh_)" \ + >> CirculatorsT.hh + +generate_circulator FaceFaceIterT Face Face \ + "if (heh_.is_valid() \&\& !handle().is_valid()) operator++();" \ + "do heh_=mesh_->next_halfedge_handle(heh_); while ((*this) \&\& (!handle().is_valid()));" \ + "do heh_=mesh_->prev_halfedge_handle(heh_); while ((*this) \&\& (!handle().is_valid()));" \ + "mesh_->face_handle(mesh_->opposite_halfedge_handle(heh_))" \ + >> CirculatorsT.hh + + +cat footer.hh >> CirculatorsT.hh + + +#------------------------------------------------------------------------------ diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/iterators_header.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/iterators_header.hh new file mode 100644 index 0000000..22f6d8b --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/iterators_header.hh @@ -0,0 +1,87 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef OPENMESH_ITERATORS_HH +#define OPENMESH_ITERATORS_HH + +//============================================================================= +// +// Iterators for PolyMesh/TriMesh +// +//============================================================================= + + + +//== INCLUDES ================================================================= + +#include +#include +#include + + +//== NAMESPACES =============================================================== + +namespace OpenMesh { +namespace Iterators { + + +//== FORWARD DECLARATIONS ===================================================== + + +template class VertexIterT; +template class ConstVertexIterT; +template class HalfedgeIterT; +template class ConstHalfedgeIterT; +template class EdgeIterT; +template class ConstEdgeIterT; +template class FaceIterT; +template class ConstFaceIterT; + + + + diff --git a/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/iterators_template.hh b/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/iterators_template.hh new file mode 100644 index 0000000..99f54e0 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Mesh/gen/iterators_template.hh @@ -0,0 +1,162 @@ +//== CLASS DEFINITION ========================================================= + + +/** \class IteratorT IteratorsT.hh + Linear iterator. +*/ + +template +class IteratorT +{ +public: + + + //--- Typedefs --- + + typedef TargetType value_type; + typedef TargetHandle value_handle; + +#if IsConst + typedef const value_type& reference; + typedef const value_type* pointer; + typedef const Mesh* mesh_ptr; + typedef const Mesh& mesh_ref; +#else + typedef value_type& reference; + typedef value_type* pointer; + typedef Mesh* mesh_ptr; + typedef Mesh& mesh_ref; +#endif + + + + + /// Default constructor. + IteratorT() + : mesh_(0), skip_bits_(0) + {} + + + /// Construct with mesh and a target handle. + IteratorT(mesh_ref _mesh, value_handle _hnd, bool _skip=false) + : mesh_(&_mesh), hnd_(_hnd), skip_bits_(0) + { + if (_skip) enable_skipping(); + } + + + /// Copy constructor + IteratorT(const IteratorT& _rhs) + : mesh_(_rhs.mesh_), hnd_(_rhs.hnd_), skip_bits_(_rhs.skip_bits_) + {} + + + /// Assignment operator + IteratorT& operator=(const IteratorT& _rhs) + { + mesh_ = _rhs.mesh_; + hnd_ = _rhs.hnd_; + skip_bits_ = _rhs.skip_bits_; + return *this; + } + + +#if IsConst + + /// Construct from a non-const iterator + IteratorT(const NonConstIterT& _rhs) + : mesh_(_rhs.mesh_), hnd_(_rhs.hnd_), skip_bits_(_rhs.skip_bits_) + {} + + + /// Assignment from non-const iterator + IteratorT& operator=(const NonConstIterT& _rhs) + { + mesh_ = _rhs.mesh_; + hnd_ = _rhs.hnd_; + skip_bits_ = _rhs.skip_bits_; + return *this; + } + +#else + friend class ConstIterT; +#endif + + + /// Standard dereferencing operator. + reference operator*() const { return mesh_->deref(hnd_); } + + /// Standard pointer operator. + pointer operator->() const { return &(mesh_->deref(hnd_)); } + + /// Get the handle of the item the iterator refers to. + value_handle handle() const { return hnd_; } + + /// Cast to the handle of the item the iterator refers to. + operator value_handle() const { return hnd_; } + + /// Are two iterators equal? Only valid if they refer to the same mesh! + bool operator==(const IteratorT& _rhs) const + { return ((mesh_ == _rhs.mesh_) && (hnd_ == _rhs.hnd_)); } + + /// Not equal? + bool operator!=(const IteratorT& _rhs) const + { return !operator==(_rhs); } + + /// Standard pre-increment operator + IteratorT& operator++() + { hnd_.__increment(); if (skip_bits_) skip_fwd(); return *this; } + + /// Standard pre-decrement operator + IteratorT& operator--() + { hnd_.__decrement(); if (skip_bits_) skip_bwd(); return *this; } + + + /// Turn on skipping: automatically skip deleted/hidden elements + void enable_skipping() + { + if (mesh_ && mesh_->has_element_status()) + { + Attributes::StatusInfo status; + status.set_deleted(true); + status.set_hidden(true); + skip_bits_ = status.bits(); + skip_fwd(); + } + else skip_bits_ = 0; + } + + + /// Turn on skipping: automatically skip deleted/hidden elements + void disable_skipping() { skip_bits_ = 0; } + + + +private: + + void skip_fwd() + { + assert(mesh_ && skip_bits_); + while ((hnd_.idx() < (signed) mesh_->n_elements()) && + (mesh_->status(hnd_).bits() & skip_bits_)) + hnd_.__increment(); + } + + + void skip_bwd() + { + assert(mesh_ && skip_bits_); + while ((hnd_.idx() >= 0) && + (mesh_->status(hnd_).bits() & skip_bits_)) + hnd_.__decrement(); + } + + + +private: + mesh_ptr mesh_; + value_handle hnd_; + unsigned int skip_bits_; +}; + + diff --git a/libs/OpenMesh/include/OpenMesh/Core/System/OpenMeshDLLMacros.hh b/libs/OpenMesh/include/OpenMesh/Core/System/OpenMeshDLLMacros.hh new file mode 100644 index 0000000..c4d6a29 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/System/OpenMeshDLLMacros.hh @@ -0,0 +1,72 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision: 566 $ * + * $Date: 2012-03-23 18:00:57 +0100 (Fr, 23 Mär 2012) $ * + * * +\*===========================================================================*/ + +// Disable the warnings about needs to have DLL interface as we have tons of vector templates +#ifdef _MSC_VER + #pragma warning( disable: 4251 ) +#endif + +#ifndef OPENMESHDLLEXPORT + #ifdef WIN32 + #ifdef OPENMESHDLL + #ifdef BUILDOPENMESHDLL + #define OPENMESHDLLEXPORT __declspec(dllexport) + #define OPENMESHDLLEXPORTONLY __declspec(dllexport) + #else + #define OPENMESHDLLEXPORT __declspec(dllimport) + #define OPENMESHDLLEXPORTONLY + #endif + #else + #define OPENMESHDLLEXPORT + #define OPENMESHDLLEXPORTONLY + #endif + #else + #define OPENMESHDLLEXPORT + #define OPENMESHDLLEXPORTONLY + #endif +#endif diff --git a/libs/OpenMesh/include/OpenMesh/Core/System/compiler.hh b/libs/OpenMesh/include/OpenMesh/Core/System/compiler.hh new file mode 100644 index 0000000..412b090 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/System/compiler.hh @@ -0,0 +1,178 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +#ifndef OPENMESH_COMPILER_H +#define OPENMESH_COMPILER_H + +//============================================================================= + +#if defined(ACGMAKE_STATIC_BUILD) +# define OM_STATIC_BUILD 1 +#endif + +//============================================================================= + +#if defined(_DEBUG) || defined(DEBUG) +# define OM_DEBUG +#endif + +//============================================================================= + +// Workaround for Intel Compiler with MS VC++ 6 +#if defined(_MSC_VER) && \ + ( defined(__ICL) || defined(__INTEL_COMPILER) || defined(__ICC) ) +# if !defined(__INTEL_COMPILER) +# define __INTEL_COMPILER __ICL +# endif +# define OM_USE_INTEL_COMPILER 1 +#endif + +// --------------------------------------------------------- MS Visual C++ ---- +// Compiler _MSC_VER +// .NET 2002 1300 +// .NET 2003 1310 +// .NET 2005 1400 +#if defined(_MSC_VER) && !defined(OM_USE_INTEL_COMPILER) +# if (_MSC_VER == 1300) +# define OM_CC_MSVC +# define OM_TYPENAME +# define OM_OUT_OF_CLASS_TEMPLATE 0 +# define OM_PARTIAL_SPECIALIZATION 0 +# define OM_INCLUDE_TEMPLATES 1 +# elif (_MSC_VER == 1310) +# define OM_CC_MSVC +# define OM_TYPENAME +# define OM_OUT_OF_CLASS_TEMPLATE 1 +# define OM_PARTIAL_SPECIALIZATION 1 +# define OM_INCLUDE_TEMPLATES 1 +# elif (_MSC_VER >= 1400) // settings for .NET 2005 (NOTE: not fully tested) +# define OM_TYPENAME +# define OM_OUT_OF_CLASS_TEMPLATE 1 +# define OM_PARTIAL_SPECIALIZATION 1 +# define OM_INCLUDE_TEMPLATES 1 +# else +# error "Version 7 (.NET 2002) or higher of the MS VC++ is required!" +# endif +// currently no windows dll supported +# define OM_STATIC_BUILD 1 +# if defined(_MT) +# define OM_REENTRANT 1 +# endif +# define OM_CC "MSVC++" +# define OM_CC_VERSION _MSC_VER +// Does not work stable because the define _CPPRTTI sometimes does not exist, +// though the option /GR is set!? +# if defined(__cplusplus) && !defined(_CPPRTTI) +# error "Enable Runtime Type Information (Compiler Option /GR)!" +# endif +# if !defined(_USE_MATH_DEFINES) +# error "You have to define _USE_MATH_DEFINES in the compiler settings!" +# endif +// ------------------------------------------------------------- Borland C ---- +#elif defined(__BORLANDC__) +# error "Borland Compiler are not supported yet!" +// ------------------------------------------------------------- GNU C/C++ ---- +#elif defined(__GNUC__) && !defined(__ICC) +# define OM_CC_GCC +# define OM_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 ) +# define OM_GCC_MAJOR __GNUC__ +# define OM_GCC_MINOR __GNUC_MINOR__ +# if (OM_GCC_VERSION >= 30200) +# define OM_TYPENAME typename +# define OM_OUT_OF_CLASS_TEMPLATE 1 +# define OM_PARTIAL_SPECIALIZATION 1 +# define OM_INCLUDE_TEMPLATES 1 +# else +# error "Version 3.2.0 or better of the GNU Compiler is required!" +# endif +# if defined(_REENTRANT) +# define OM_REENTRANT 1 +# endif +# define OM_CC "GCC" +# define OM_CC_VERSION OM_GCC_VERSION +// ------------------------------------------------------------- Intel icc ---- +#elif defined(__ICC) || defined(__INTEL_COMPILER) +# define OM_CC_ICC +# define OM_TYPENAME typename +# define OM_OUT_OF_CLASS_TEMPLATE 1 +# define OM_PARTIAL_SPECIALIZATION 1 +# define OM_INCLUDE_TEMPLATES 1 +# if defined(_REENTRANT) || defined(_MT) +# define OM_REENTRANT 1 +# endif +# define OM_CC "ICC" +# define OM_CC_VERSION __INTEL_COMPILER +// currently no windows dll supported +# if defined(_MSC_VER) || defined(WIN32) +# define OM_STATIC_BUILD 1 +# endif +// ------------------------------------------------------ MIPSpro Compiler ---- +#elif defined(__MIPS_ISA) || defined(__mips) +// _MIPS_ISA +// _COMPILER_VERSION e.g. 730, 7 major, 3 minor +// _MIPS_FPSET 32|64 +// _MIPS_SZINT 32|64 +// _MIPS_SZLONG 32|64 +// _MIPS_SZPTR 32|64 +# define OM_CC_MIPS +# define OM_TYPENAME typename +# define OM_OUT_OF_CLASS_TEMPLATE 1 +# define OM_PARTIAL_SPECIALIZATION 1 +# define OM_INCLUDE_TEMPLATES 0 +# define OM_CC "MIPS" +# define OM_CC_VERSION _COMPILER_VERSION +// ------------------------------------------------------------------ ???? ---- +#else +# error "You're using an unsupported compiler!" +#endif + +//============================================================================= +#endif // OPENMESH_COMPILER_H defined +//============================================================================= + diff --git a/libs/OpenMesh/include/OpenMesh/Core/System/config.h b/libs/OpenMesh/include/OpenMesh/Core/System/config.h new file mode 100644 index 0000000..65c0b3e --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/System/config.h @@ -0,0 +1,107 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +/** \file config.h + * \todo Move content to config.hh and include it to be compatible with old + * source. + */ + +//============================================================================= + +#ifndef OPENMESH_CONFIG_H +#define OPENMESH_CONFIG_H + +//============================================================================= + +#include +#include +#include + +// ---------------------------------------------------------------------------- + + +#define OM_VERSION 0x70100 + +#define OM_GET_VER ((OM_VERSION & 0xf0000) >> 16) +#define OM_GET_MAJ ((OM_VERSION & 0x0ff00) >> 8) +#define OM_GET_MIN (OM_VERSION & 0x000ff) + +#ifdef WIN32 +# ifdef min +# pragma message("Detected min macro! OpenMesh does not compile with min/max macros active! Please add a define NOMINMAX to your compiler flags or add #undef min before including OpenMesh headers !") +# error min macro active +# endif +# ifdef max +# pragma message("Detected max macro! OpenMesh does not compile with min/max macros active! Please add a define NOMINMAX to your compiler flags or add #undef max before including OpenMesh headers !") +# error max macro active +# endif +#endif + +#if defined(_MSC_VER) +# define DEPRECATED(msg) __declspec(deprecated(msg)) +#elif defined(__GNUC__) +# if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40500 /* Test for GCC >= 4.5.0 */ +# define DEPRECATED(msg) __attribute__ ((deprecated(msg))) +# else +# define DEPRECATED(msg) __attribute__ ((deprecated)) +# endif +#elif defined(__clang__) +# define DEPRECATED(msg) __attribute__ ((deprecated(msg))) +#else +# define DEPRECATED(msg) +#endif + +typedef unsigned int uint; + +#if ((defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)) +#define OM_HAS_HASH +#endif + +//============================================================================= +#endif // OPENMESH_CONFIG_H defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/System/config.hh b/libs/OpenMesh/include/OpenMesh/Core/System/config.hh new file mode 100644 index 0000000..6c23e27 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/System/config.hh @@ -0,0 +1,49 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#include diff --git a/libs/OpenMesh/include/OpenMesh/Core/System/mostream.hh b/libs/OpenMesh/include/OpenMesh/Core/System/mostream.hh new file mode 100644 index 0000000..4dabf51 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/System/mostream.hh @@ -0,0 +1,330 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +//============================================================================= +// +// multiplex streams & ultilities +// +//============================================================================= + +#ifndef OPENMESH_MOSTREAM_HH +#define OPENMESH_MOSTREAM_HH + + +//== INCLUDES ================================================================= + +#include +#include +#if defined( OM_CC_GCC ) && OM_CC_VERSION < 30000 +# include +#else +# include +#endif +#include +#include +#include +#include + +#if (defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined( __GXX_EXPERIMENTAL_CXX0X__ ) + #include +#endif + + +//== NAMESPACES =============================================================== + +namespace OpenMesh { +#ifndef DOXY_IGNORE_THIS + + +//== CLASS DEFINITION ========================================================= + + +class basic_multiplex_target +{ +public: + virtual ~basic_multiplex_target() {} + virtual void operator<<(const std::string& _s) = 0; +}; + + +template +class multiplex_target : public basic_multiplex_target +{ +public: + explicit multiplex_target(T& _t) : target_(_t) {} + virtual void operator<<(const std::string& _s) { target_ << _s; } +private: + T& target_; +}; + + + +//== CLASS DEFINITION ========================================================= + + +#if defined( OM_CC_GCC ) && OM_CC_VERSION < 30000 +# define STREAMBUF streambuf +# define INT_TYPE int +# define TRAITS_TYPE +#else +# define STREAMBUF std::basic_streambuf +#endif + +class multiplex_streambuf : public STREAMBUF +{ +public: + + typedef STREAMBUF base_type; +#if defined( OM_CC_GCC ) && OM_CC_VERSION < 30000 + typedef int int_type; + struct traits_type + { + static int_type eof() { return -1; } + static char to_char_type(int_type c) { return char(c); } + }; +#else + typedef base_type::int_type int_type; + typedef base_type::traits_type traits_type; +#endif + + // Constructor + multiplex_streambuf() : enabled_(true) { buffer_.reserve(100); } + + // Destructor + ~multiplex_streambuf() + { + tmap_iter t_it(target_map_.begin()), t_end(target_map_.end()); + for (; t_it!=t_end; ++t_it) + delete t_it->second; + } + + + // buffer enable/disable + bool is_enabled() const { return enabled_; } + void enable() { enabled_ = true; } + void disable() { enabled_ = false; } + + + // construct multiplex_target and add it to targets + template bool connect(T& _target) + { + void* key = (void*) &_target; + + if (target_map_.find(key) != target_map_.end()) + return false; + + target_type* mtarget = new multiplex_target(_target); + target_map_[key] = mtarget; + + __connect(mtarget); + return true; + } + + + // disconnect target from multiplexer + template bool disconnect(T& _target) + { + void* key = (void*) &_target; + tmap_iter t_it = target_map_.find(key); + + if (t_it != target_map_.end()) + { + __disconnect(t_it->second); + target_map_.erase(t_it); + return true; + } + + return false; + } + + +protected: + + // output what's in buffer_ + virtual int sync() + { + // If working on multiple threads, we need to serialize the output correctly (requires c++11 headers) + #if (defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined( __GXX_EXPERIMENTAL_CXX0X__ ) + std::lock_guard lck (serializer_); + #endif + + if (!buffer_.empty()) + { + if (enabled_) multiplex(); +#if defined( OM_CC_GCC ) && OM_CC_VERSION < 30000 + buffer_ = ""; // member clear() not available! +#else + buffer_.clear(); +#endif + } + return base_type::sync(); + } + + + // take on char and add it to buffer_ + // if '\n' is encountered, trigger a sync() + virtual + int_type overflow(int_type _c = multiplex_streambuf::traits_type::eof()) + { + char c = traits_type::to_char_type(_c); + + // If working on multiple threads, we need to serialize the output correctly (requires c++11 headers) + #if (defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined( __GXX_EXPERIMENTAL_CXX0X__ ) + { + std::lock_guard lck (serializer_); + buffer_.push_back(c); + } + #else + buffer_.push_back(c); + #endif + + if (c == '\n') sync(); + return 0; + } + + +private: + + typedef basic_multiplex_target target_type; + typedef std::vector target_list; + typedef target_list::iterator tlist_iter; + typedef std::map target_map; + typedef target_map::iterator tmap_iter; + + + // add _target to list of multiplex targets + void __connect(target_type* _target) { targets_.push_back(_target); } + + + // remove _target from list of multiplex targets + void __disconnect(target_type* _target) { + targets_.erase(std::find(targets_.begin(), targets_.end(), _target)); + } + + + // multiplex output of buffer_ to all targets + void multiplex() + { + tlist_iter t_it(targets_.begin()), t_end(targets_.end()); + for (; t_it!=t_end; ++t_it) + **t_it << buffer_; + } + + +private: + + target_list targets_; + target_map target_map_; + std::string buffer_; + bool enabled_; + + // If working on multiple threads, we need to serialize the output correctly (requires c++11 headers) + #if (defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined( __GXX_EXPERIMENTAL_CXX0X__ ) + std::mutex serializer_; + #endif + +}; + +#undef STREAMBUF + + +//== CLASS DEFINITION ========================================================= + + +/** \class mostream mostream.hh + + This class provides streams that can easily be multiplexed (using + the connect() method) and toggled on/off (using enable() / + disable()). + + \see omlog, omout, omerr +*/ + +class mostream : public std::ostream +{ +public: + + /// Explicit constructor + explicit mostream() : std::ostream(NULL) { init(&streambuffer_); } + + + /// Connect target to multiplexer + template bool connect(T& _target) + { + return streambuffer_.connect(_target); + } + + + /// Disconnect target from multiplexer + template bool disconnect(T& _target) + { + return streambuffer_.disconnect(_target); + } + + + /// is buffer enabled + bool is_enabled() const { return streambuffer_.is_enabled(); } + + /// enable this buffer + void enable() { streambuffer_.enable(); } + + /// disable this buffer + void disable() { streambuffer_.disable(); } + + +private: + multiplex_streambuf streambuffer_; +}; + + +//============================================================================= +#endif +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_MOSTREAM_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/System/omstream.hh b/libs/OpenMesh/include/OpenMesh/Core/System/omstream.hh new file mode 100644 index 0000000..01fdfb0 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/System/omstream.hh @@ -0,0 +1,83 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +//============================================================================= +// +// OpenMesh streams: omlog, omout, omerr +// +//============================================================================= + +#ifndef OPENMESH_OMSTREAMS_HH +#define OPENMESH_OMSTREAMS_HH + + +//== INCLUDES ================================================================= + +#include + + +//== CLASS DEFINITION ========================================================= + +/** \file omstream.hh + This file provides the streams omlog, omout, and omerr. +*/ + +/** \name stream replacements + These stream provide replacements for clog, cout, and cerr. They have + the advantage that they can easily be multiplexed. + \see OpenMesh::mostream +*/ +//@{ +OPENMESHDLLEXPORT OpenMesh::mostream& omlog(); +OPENMESHDLLEXPORT OpenMesh::mostream& omout(); +OPENMESHDLLEXPORT OpenMesh::mostream& omerr(); +//@} + +//============================================================================= +#endif // OPENMESH_OMSTREAMS_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Templates/newClass.hh b/libs/OpenMesh/include/OpenMesh/Core/Templates/newClass.hh new file mode 100644 index 0000000..31a2fd2 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Templates/newClass.hh @@ -0,0 +1,108 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +//============================================================================= +// +// CLASS newClass +// +//============================================================================= +#ifndef DOXY_IGNORE_THIS +#ifndef OPENMESH_NEWCLASS_HH +#define OPENMESH_NEWCLASS_HH + + +//== INCLUDES ================================================================= + + +//== FORWARDDECLARATIONS ====================================================== + + +//== NAMESPACES =============================================================== + +namespace OpenMesh { + + +//== CLASS DEFINITION ========================================================= + + +/** \class newClass newClass.hh + + Brief Description. + + A more elaborate description follows. +*/ + +class newClass +{ +public: + + /// Default constructor + newClass() {} + + /// Destructor + ~newClass() {} + + +private: + + /// Copy constructor (not used) + newClass(const newClass& _rhs); + + /// Assignment operator (not used) + newClass& operator=(const newClass& _rhs); + +}; + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_NEWCLASS_HH defined +#endif // DOXY_IGNORE_THIS +//============================================================================= + diff --git a/libs/OpenMesh/include/OpenMesh/Core/Templates/newClass.sh b/libs/OpenMesh/include/OpenMesh/Core/Templates/newClass.sh new file mode 100644 index 0000000..7ea19a7 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Templates/newClass.sh @@ -0,0 +1,9 @@ +#! /bin/sh + +A=`echo $1_ | tr '[:lower:]' '[:upper:]'` + +sed -e s/newClass/$1/g -e s/NEWCLASS_/$A/g < newClass.cc > tmp_newClass.cc +sed -e s/newClass/$1/g -e s/NEWCLASS_/$A/g < newClass.hh > tmp_newClass.hh + +mv -i tmp_newClass.cc $1.cc && echo $1.cc - ok +mv -i tmp_newClass.hh $1.hh && echo $1.hh - ok diff --git a/libs/OpenMesh/include/OpenMesh/Core/Templates/newClassT.hh b/libs/OpenMesh/include/OpenMesh/Core/Templates/newClassT.hh new file mode 100644 index 0000000..00b5f14 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Templates/newClassT.hh @@ -0,0 +1,115 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +//============================================================================= +// +// CLASS newClass +// +//============================================================================= +#ifndef DOXY_IGNORE_THIS +#ifndef OPENMESH_NEWCLASST_HH +#define OPENMESH_NEWCLASST_HH + + +//== INCLUDES ================================================================= + + +//== FORWARDDECLARATIONS ====================================================== + + +//== NAMESPACES =============================================================== + +namespace OpenMesh { + + +//== CLASS DEFINITION ========================================================= + + + + +/** \class newClassT newClassT.hh + + Brief Description. + + A more elaborate description follows. +*/ + +template <> +class newClassT +{ +public: + + /// Default constructor + newClassT() {} + + /// Destructor + ~newClassT() {} + + +private: + + /// Copy constructor (not used) + newClassT(const newClassT& _rhs); + + /// Assignment operator (not used) + newClassT& operator=(const newClassT& _rhs); + +}; + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_NEWCLASS_C) +#define OPENMESH_NEWCLASS_TEMPLATES +#include "newClass.cc" +#endif +//============================================================================= +#endif // OPENMESH_NEWCLASST_HH defined +#endif // DOXY_IGNORE_THIS +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Templates/newClassT.sh b/libs/OpenMesh/include/OpenMesh/Core/Templates/newClassT.sh new file mode 100644 index 0000000..7023244 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Templates/newClassT.sh @@ -0,0 +1,9 @@ +#! /bin/sh + +A=`echo $1_ | tr '[:lower:]' '[:upper:]'` + +sed -e s/newClass/$1/g -e s/NEWCLASS_/$A/g < newClassT.cc > tmp_newClass.cc +sed -e s/newClass/$1/g -e s/NEWCLASS_/$A/g < newClassT.hh > tmp_newClass.hh + +mv -i tmp_newClass.cc $1.cc && echo $1.cc - ok +mv -i tmp_newClass.hh $1.hh && echo $1.hh - ok diff --git a/libs/OpenMesh/include/OpenMesh/Core/Utils/AutoPropertyHandleT.hh b/libs/OpenMesh/include/OpenMesh/Core/Utils/AutoPropertyHandleT.hh new file mode 100644 index 0000000..fae37a9 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Utils/AutoPropertyHandleT.hh @@ -0,0 +1,138 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef OPENMESH_AutoPropertyHandleT_HH +#define OPENMESH_AutoPropertyHandleT_HH + +//== INCLUDES ================================================================= +#include +#include + +//== NAMESPACES =============================================================== + +namespace OpenMesh { + +//== CLASS DEFINITION ========================================================= + +template +class AutoPropertyHandleT : public PropertyHandle_ +{ +public: + typedef Mesh_ Mesh; + typedef PropertyHandle_ PropertyHandle; + typedef PropertyHandle Base; + typedef typename PropertyHandle::Value Value; + typedef AutoPropertyHandleT + Self; +protected: + Mesh* m_; + bool own_property_;//ref counting? + +public: + AutoPropertyHandleT() + : m_(NULL), own_property_(false) + {} + + AutoPropertyHandleT(const Self& _other) + : Base(_other.idx()), m_(_other.m_), own_property_(false) + {} + + explicit AutoPropertyHandleT(Mesh& _m, const std::string& _pp_name = std::string()) + { add_property(_m, _pp_name); } + + AutoPropertyHandleT(Mesh& _m, PropertyHandle _pph) + : Base(_pph.idx()), m_(&_m), own_property_(false) + {} + + ~AutoPropertyHandleT() + { + if (own_property_) + { + m_->remove_property(*this); + } + } + + inline void add_property(Mesh& _m, const std::string& _pp_name = std::string()) + { + assert(!is_valid()); + m_ = &_m; + own_property_ = _pp_name.empty() || !m_->get_property_handle(*this, _pp_name); + if (own_property_) + { + m_->add_property(*this, _pp_name); + } + } + + inline void remove_property() + { + assert(own_property_);//only the owner can delete the property + m_->remove_property(*this); + own_property_ = false; + invalidate(); + } + + template + inline Value& operator [] (_Handle _hnd) + { return m_->property(*this, _hnd); } + + template + inline const Value& operator [] (_Handle _hnd) const + { return m_->property(*this, _hnd); } + + inline bool own_property() const + { return own_property_; } + + inline void free_property() + { own_property_ = false; } +}; + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_AutoPropertyHandleT_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Utils/BaseProperty.hh b/libs/OpenMesh/include/OpenMesh/Core/Utils/BaseProperty.hh new file mode 100644 index 0000000..3abcfe2 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Utils/BaseProperty.hh @@ -0,0 +1,188 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef OPENMESH_BASEPROPERTY_HH +#define OPENMESH_BASEPROPERTY_HH + +#include +#include +#include + +namespace OpenMesh { + +//== CLASS DEFINITION ========================================================= + +/** \class BaseProperty Property.hh + + Abstract class defining the basic interface of a dynamic property. +**/ + +class OPENMESHDLLEXPORT BaseProperty +{ +public: + + /// Indicates an error when a size is returned by a member. + static const size_t UnknownSize = size_t(-1); + +public: + + /// \brief Default constructor. + /// + /// In %OpenMesh all mesh data is stored in so-called properties. + /// We distinuish between standard properties, which can be defined at + /// compile time using the Attributes in the traits definition and + /// at runtime using the request property functions defined in one of + /// the kernels. + /// + /// If the property should be stored along with the default properties + /// in the OM-format one must name the property and enable the persistant + /// flag with set_persistent(). + /// + /// \param _name Optional textual name for the property. + /// + BaseProperty(const std::string& _name = "") + : name_(_name), persistent_(false) + {} + + /// \brief Copy constructor + BaseProperty(const BaseProperty & _rhs) + : name_( _rhs.name_ ), persistent_( _rhs.persistent_ ) {} + + /// Destructor. + virtual ~BaseProperty() {} + +public: // synchronized array interface + + /// Reserve memory for n elements. + virtual void reserve(size_t _n) = 0; + + /// Resize storage to hold n elements. + virtual void resize(size_t _n) = 0; + + /// Clear all elements and free memory. + virtual void clear() = 0; + + /// Extend the number of elements by one. + virtual void push_back() = 0; + + /// Let two elements swap their storage place. + virtual void swap(size_t _i0, size_t _i1) = 0; + + /// Copy one element to another + virtual void copy(size_t _io, size_t _i1) = 0; + + /// Return a deep copy of self. + virtual BaseProperty* clone () const = 0; + +public: // named property interface + + /// Return the name of the property + const std::string& name() const { return name_; } + + virtual void stats(std::ostream& _ostr) const; + +public: // I/O support + + /// Returns true if the persistent flag is enabled else false. + bool persistent(void) const { return persistent_; } + + /// Enable or disable persistency. Self must be a named property to enable + /// persistency. + virtual void set_persistent( bool _yn ) = 0; + + /// Number of elements in property + virtual size_t n_elements() const = 0; + + /// Size of one element in bytes or UnknownSize if not known. + virtual size_t element_size() const = 0; + + /// Return size of property in bytes + virtual size_t size_of() const + { + return size_of( n_elements() ); + } + + /// Estimated size of property if it has _n_elem elements. + /// The member returns UnknownSize if the size cannot be estimated. + virtual size_t size_of(size_t _n_elem) const + { + return (element_size()!=UnknownSize) + ? (_n_elem*element_size()) + : UnknownSize; + } + + /// Store self as one binary block + virtual size_t store( std::ostream& _ostr, bool _swap ) const = 0; + + /** Restore self from a binary block. Uses reserve() to set the + size of self before restoring. + **/ + virtual size_t restore( std::istream& _istr, bool _swap ) = 0; + +protected: + + // To be used in a derived class, when overloading set_persistent() + template < typename T > + void check_and_set_persistent( bool _yn ) + { + if ( _yn && !IO::is_streamable() ) + omerr() << "Warning! Type of property value is not binary storable!\n"; + persistent_ = IO::is_streamable() && _yn; + } + +private: + + std::string name_; + bool persistent_; +}; + +}//namespace OpenMesh + +#endif //OPENMESH_BASEPROPERTY_HH + + diff --git a/libs/OpenMesh/include/OpenMesh/Core/Utils/Endian.hh b/libs/OpenMesh/include/OpenMesh/Core/Utils/Endian.hh new file mode 100644 index 0000000..e511c00 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Utils/Endian.hh @@ -0,0 +1,103 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Helper Functions for binary reading / writing +// +//============================================================================= + + +#ifndef OPENMESH_UTILS_ENDIAN_HH +#define OPENMESH_UTILS_ENDIAN_HH + + +//== INCLUDES ================================================================= + + +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + + +//============================================================================= + + +/** Determine byte order of host system. + */ +class OPENMESHDLLEXPORT Endian +{ +public: + + enum Type { + LSB = 1, ///< Little endian (Intel family and clones) + MSB ///< big endian (Motorola's 68x family, DEC Alpha, MIPS) + }; + + /// Return endian type of host system. + static Type local() { return local_; } + + /// Return type _t as string. + static const char * as_string(Type _t); + +private: + static int one_; + static const Type local_; +}; + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_MESHREADER_HH defined +//============================================================================= + diff --git a/libs/OpenMesh/include/OpenMesh/Core/Utils/GenProg.hh b/libs/OpenMesh/include/OpenMesh/Core/Utils/GenProg.hh new file mode 100644 index 0000000..bf0b20a --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Utils/GenProg.hh @@ -0,0 +1,165 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Utils for generic/generative programming +// +//============================================================================= + +#ifndef OPENMESH_GENPROG_HH +#define OPENMESH_GENPROG_HH + + +//== INCLUDES ================================================================= + +#include + + +//== NAMESPACES =============================================================== + +namespace OpenMesh { + +namespace GenProg { +#ifndef DOXY_IGNORE_THIS + +//== IMPLEMENTATION =========================================================== + + +/// This type maps \c true or \c false to different types. +template struct Bool2Type { enum { my_bool = b }; }; + +/// This class generates different types from different \c int 's. +template struct Int2Type { enum { my_int = i }; }; + +/// Handy typedef for Bool2Type classes +typedef Bool2Type TrueType; + +/// Handy typedef for Bool2Type classes +typedef Bool2Type FalseType; + +//----------------------------------------------------------------------------- +/// compile time assertions +template struct AssertCompile; +template <> struct AssertCompile {}; + + + +//--- Template "if" w/ partial specialization --------------------------------- +#if OM_PARTIAL_SPECIALIZATION + + +template +struct IF { typedef Then Result; }; + +/** Template \c IF w/ partial specialization +\code +typedef IF::Result ResultType; +\endcode +*/ +template +struct IF { typedef Else Result; }; + + + + + +//--- Template "if" w/o partial specialization -------------------------------- +#else + + +struct SelectThen +{ + template struct Select { + typedef Then Result; + }; +}; + +struct SelectElse +{ + template struct Select { + typedef Else Result; + }; +}; + +template struct ChooseSelector { + typedef SelectThen Result; +}; + +template <> struct ChooseSelector { + typedef SelectElse Result; +}; + + +/** Template \c IF w/o partial specialization. Use it like +\code +typedef IF::Result ResultType; +\endcode +*/ + +template +class IF +{ + typedef typename ChooseSelector::Result Selector; +public: + typedef typename Selector::template Select::Result Result; +}; + +#endif + +//============================================================================= +#endif +} // namespace GenProg +} // namespace OpenMesh + +#define assert_compile(EXPR) GenProg::AssertCompile<(EXPR)>(); + +//============================================================================= +#endif // OPENMESH_GENPROG_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Utils/Noncopyable.hh b/libs/OpenMesh/include/OpenMesh/Core/Utils/Noncopyable.hh new file mode 100644 index 0000000..ddbfb3e --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Utils/Noncopyable.hh @@ -0,0 +1,94 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements the Non-Copyable metapher +// +//============================================================================= + +#ifndef OPENMESH_NONCOPYABLE_HH +#define OPENMESH_NONCOPYABLE_HH + + +//----------------------------------------------------------------------------- + +#include + +//----------------------------------------------------------------------------- + +namespace OpenMesh { +namespace Utils { + +//----------------------------------------------------------------------------- + +/** This class demonstrates the non copyable idiom. In some cases it is + important an object can't be copied. Deriving from Noncopyable makes sure + all relevant constructor and operators are made inaccessable, for public + AND derived classes. +**/ +class Noncopyable +{ +public: + Noncopyable() { } + +private: + /// Prevent access to copy constructor + Noncopyable( const Noncopyable& ); + + /// Prevent access to assignment operator + const Noncopyable& operator=( const Noncopyable& ); +}; + +//============================================================================= +} // namespace Utils +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_NONCOPYABLE_HH +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Utils/Property.hh b/libs/OpenMesh/include/OpenMesh/Core/Utils/Property.hh new file mode 100644 index 0000000..ab26d9d --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Utils/Property.hh @@ -0,0 +1,555 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef OPENMESH_PROPERTY_HH +#define OPENMESH_PROPERTY_HH + + +//== INCLUDES ================================================================= + + +#include +#include +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + +namespace OpenMesh { + +//== CLASS DEFINITION ========================================================= + +/** \class PropertyT Property.hh + * + * \brief Default property class for any type T. + * + * The default property class for any type T. + * + * The property supports persistency if T is a "fundamental" type: + * - integer fundamental types except bool: + * char, short, int, long, long long (__int64 for MS VC++) and + * their unsigned companions. + * - float fundamentals except long double: + * float, double + * - %OpenMesh vector types + * + * Persistency of non-fundamental types is supported if and only if a + * specialization of struct IO::binary<> exists for the wanted type. + */ + +// TODO: it might be possible to define Property using kind of a runtime info +// structure holding the size of T. Then reserve, swap, resize, etc can be written +// in pure malloc() style w/o virtual overhead. Template member function proved per +// element access to the properties, asserting dynamic_casts in debug + +template +class PropertyT : public BaseProperty +{ +public: + + typedef T Value; + typedef std::vector vector_type; + typedef T value_type; + typedef typename vector_type::reference reference; + typedef typename vector_type::const_reference const_reference; + +public: + + /// Default constructor + PropertyT(const std::string& _name = "") + : BaseProperty(_name) + {} + + /// Copy constructor + PropertyT(const PropertyT & _rhs) + : BaseProperty( _rhs ), data_( _rhs.data_ ) {} + +public: // inherited from BaseProperty + + virtual void reserve(size_t _n) { data_.reserve(_n); } + virtual void resize(size_t _n) { data_.resize(_n); } + virtual void clear() { data_.clear(); vector_type().swap(data_); } + virtual void push_back() { data_.push_back(T()); } + virtual void swap(size_t _i0, size_t _i1) + { std::swap(data_[_i0], data_[_i1]); } + virtual void copy(size_t _i0, size_t _i1) + { data_[_i1] = data_[_i0]; } + +public: + + virtual void set_persistent( bool _yn ) + { check_and_set_persistent( _yn ); } + + virtual size_t n_elements() const { return data_.size(); } + virtual size_t element_size() const { return IO::size_of(); } + +#ifndef DOXY_IGNORE_THIS + struct plus { + size_t operator () ( size_t _b, const T& _v ) + { return _b + IO::size_of(_v); } + }; +#endif + + virtual size_t size_of(void) const + { + if (element_size() != IO::UnknownSize) + return this->BaseProperty::size_of(n_elements()); + return std::accumulate(data_.begin(), data_.end(), size_t(0), plus()); + } + + virtual size_t size_of(size_t _n_elem) const + { return this->BaseProperty::size_of(_n_elem); } + + virtual size_t store( std::ostream& _ostr, bool _swap ) const + { + if ( IO::is_streamable() ) + return IO::store(_ostr, data_, _swap ); + size_t bytes = 0; + for (size_t i=0; i() ) + return IO::restore(_istr, data_, _swap ); + size_t bytes = 0; + for (size_t i=0; i* clone() const + { + PropertyT* p = new PropertyT( *this ); + return p; + } + + +private: + + vector_type data_; +}; + +//----------------------------------------------------------------------------- + + +/** Property specialization for bool type. + + The data will be stored as a bitset. + */ +template <> +class PropertyT : public BaseProperty +{ +public: + + typedef std::vector vector_type; + typedef bool value_type; + typedef vector_type::reference reference; + typedef vector_type::const_reference const_reference; + +public: + + PropertyT(const std::string& _name = "") + : BaseProperty(_name) + { } + +public: // inherited from BaseProperty + + virtual void reserve(size_t _n) { data_.reserve(_n); } + virtual void resize(size_t _n) { data_.resize(_n); } + virtual void clear() { data_.clear(); vector_type().swap(data_); } + virtual void push_back() { data_.push_back(bool()); } + virtual void swap(size_t _i0, size_t _i1) + { bool t(data_[_i0]); data_[_i0]=data_[_i1]; data_[_i1]=t; } + virtual void copy(size_t _i0, size_t _i1) + { data_[_i1] = data_[_i0]; } + +public: + + virtual void set_persistent( bool _yn ) + { + check_and_set_persistent( _yn ); + } + + virtual size_t n_elements() const { return data_.size(); } + virtual size_t element_size() const { return UnknownSize; } + virtual size_t size_of() const { return size_of( n_elements() ); } + virtual size_t size_of(size_t _n_elem) const + { + return _n_elem / 8 + ((_n_elem % 8)!=0); + } + + size_t store( std::ostream& _ostr, bool /* _swap */ ) const + { + size_t bytes = 0; + + size_t N = data_.size() / 8; + size_t R = data_.size() % 8; + + size_t idx; // element index + size_t bidx; + unsigned char bits; // bitset + + for (bidx=idx=0; idx < N; ++idx, bidx+=8) + { + bits = static_cast(data_[bidx]) + | (static_cast(data_[bidx+1]) << 1) + | (static_cast(data_[bidx+2]) << 2) + | (static_cast(data_[bidx+3]) << 3) + | (static_cast(data_[bidx+4]) << 4) + | (static_cast(data_[bidx+5]) << 5) + | (static_cast(data_[bidx+6]) << 6) + | (static_cast(data_[bidx+7]) << 7); + _ostr << bits; + } + bytes = N; + + if (R) + { + bits = 0; + for (idx=0; idx < R; ++idx) + bits |= static_cast(data_[bidx+idx]) << idx; + _ostr << bits; + ++bytes; + } + + assert( bytes == size_of() ); + + return bytes; + } + + size_t restore( std::istream& _istr, bool /* _swap */ ) + { + size_t bytes = 0; + + size_t N = data_.size() / 8; + size_t R = data_.size() % 8; + + size_t idx; // element index + size_t bidx; // + unsigned char bits; // bitset + + for (bidx=idx=0; idx < N; ++idx, bidx+=8) + { + _istr >> bits; + data_[bidx+0] = (bits & 0x01) != 0; + data_[bidx+1] = (bits & 0x02) != 0; + data_[bidx+2] = (bits & 0x04) != 0; + data_[bidx+3] = (bits & 0x08) != 0; + data_[bidx+4] = (bits & 0x10) != 0; + data_[bidx+5] = (bits & 0x20) != 0; + data_[bidx+6] = (bits & 0x40) != 0; + data_[bidx+7] = (bits & 0x80) != 0; + } + bytes = N; + + if (R) + { + _istr >> bits; + for (idx=0; idx < R; ++idx) + data_[bidx+idx] = (bits & (1<* clone() const + { + PropertyT* p = new PropertyT( *this ); + return p; + } + + +private: + + vector_type data_; +}; + + +//----------------------------------------------------------------------------- + + +/** Property specialization for std::string type. +*/ +template <> +class PropertyT : public BaseProperty +{ +public: + + typedef std::string Value; + typedef std::vector vector_type; + typedef std::string value_type; + typedef vector_type::reference reference; + typedef vector_type::const_reference const_reference; + +public: + + PropertyT(const std::string& _name = "") + : BaseProperty(_name) + { } + +public: // inherited from BaseProperty + + virtual void reserve(size_t _n) { data_.reserve(_n); } + virtual void resize(size_t _n) { data_.resize(_n); } + virtual void clear() { data_.clear(); vector_type().swap(data_); } + virtual void push_back() { data_.push_back(std::string()); } + virtual void swap(size_t _i0, size_t _i1) { + std::swap(data_[_i0], data_[_i1]); + } + virtual void copy(size_t _i0, size_t _i1) + { data_[_i1] = data_[_i0]; } + +public: + + virtual void set_persistent( bool _yn ) + { check_and_set_persistent( _yn ); } + + virtual size_t n_elements() const { return data_.size(); } + virtual size_t element_size() const { return UnknownSize; } + virtual size_t size_of() const + { return IO::size_of( data_ ); } + + virtual size_t size_of(size_t /* _n_elem */) const + { return UnknownSize; } + + /// Store self as one binary block. Max. length of a string is 65535 bytes. + size_t store( std::ostream& _ostr, bool _swap ) const + { return IO::store( _ostr, data_, _swap ); } + + size_t restore( std::istream& _istr, bool _swap ) + { return IO::restore( _istr, data_, _swap ); } + +public: + + const value_type* data() const { + if( data_.empty() ) + return 0; + + return (value_type*) &data_[0]; + } + + /// Access the i'th element. No range check is performed! + reference operator[](int _idx) { + assert( size_t(_idx) < data_.size()); + return ((value_type*) &data_[0])[_idx]; + } + + /// Const access the i'th element. No range check is performed! + const_reference operator[](int _idx) const { + assert( size_t(_idx) < data_.size()); + return ((value_type*) &data_[0])[_idx]; + } + + PropertyT* clone() const { + PropertyT* p = new PropertyT( *this ); + return p; + } +private: + + vector_type data_; + +}; + +/// Base property handle. +template +struct BasePropHandleT : public BaseHandle +{ + typedef T Value; + typedef std::vector vector_type; + typedef T value_type; + typedef typename vector_type::reference reference; + typedef typename vector_type::const_reference const_reference; + + explicit BasePropHandleT(int _idx=-1) : BaseHandle(_idx) {} +}; + + +/** \ingroup mesh_property_handle_group + * Handle representing a vertex property + */ +template +struct VPropHandleT : public BasePropHandleT +{ + typedef T Value; + typedef T value_type; + + explicit VPropHandleT(int _idx=-1) : BasePropHandleT(_idx) {} + explicit VPropHandleT(const BasePropHandleT& _b) : BasePropHandleT(_b) {} +}; + + +/** \ingroup mesh_property_handle_group + * Handle representing a halfedge property + */ +template +struct HPropHandleT : public BasePropHandleT +{ + typedef T Value; + typedef T value_type; + + explicit HPropHandleT(int _idx=-1) : BasePropHandleT(_idx) {} + explicit HPropHandleT(const BasePropHandleT& _b) : BasePropHandleT(_b) {} +}; + + +/** \ingroup mesh_property_handle_group + * Handle representing an edge property + */ +template +struct EPropHandleT : public BasePropHandleT +{ + typedef T Value; + typedef T value_type; + + explicit EPropHandleT(int _idx=-1) : BasePropHandleT(_idx) {} + explicit EPropHandleT(const BasePropHandleT& _b) : BasePropHandleT(_b) {} +}; + + +/** \ingroup mesh_property_handle_group + * Handle representing a face property + */ +template +struct FPropHandleT : public BasePropHandleT +{ + typedef T Value; + typedef T value_type; + + explicit FPropHandleT(int _idx=-1) : BasePropHandleT(_idx) {} + explicit FPropHandleT(const BasePropHandleT& _b) : BasePropHandleT(_b) {} +}; + + +/** \ingroup mesh_property_handle_group + * Handle representing a mesh property + */ +template +struct MPropHandleT : public BasePropHandleT +{ + typedef T Value; + typedef T value_type; + + explicit MPropHandleT(int _idx=-1) : BasePropHandleT(_idx) {} + explicit MPropHandleT(const BasePropHandleT& _b) : BasePropHandleT(_b) {} +}; + +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_PROPERTY_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Utils/PropertyContainer.hh b/libs/OpenMesh/include/OpenMesh/Core/Utils/PropertyContainer.hh new file mode 100644 index 0000000..d8d7393 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Utils/PropertyContainer.hh @@ -0,0 +1,375 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef OPENMESH_PROPERTYCONTAINER +#define OPENMESH_PROPERTYCONTAINER + +// Use static casts when not debugging +#ifdef NDEBUG +#define OM_FORCE_STATIC_CAST +#endif + +#include + +//----------------------------------------------------------------------------- +namespace OpenMesh +{ +//== FORWARDDECLARATIONS ====================================================== + class BaseKernel; + +//== CLASS DEFINITION ========================================================= +/// A a container for properties. +class PropertyContainer +{ +public: + + //-------------------------------------------------- constructor / destructor + + PropertyContainer() {} + virtual ~PropertyContainer() { std::for_each(properties_.begin(), properties_.end(), Delete()); } + + + //------------------------------------------------------------- info / access + + typedef std::vector Properties; + const Properties& properties() const { return properties_; } + size_t size() const { return properties_.size(); } + + + + //--------------------------------------------------------- copy / assignment + + PropertyContainer(const PropertyContainer& _rhs) { operator=(_rhs); } + + PropertyContainer& operator=(const PropertyContainer& _rhs) + { + // The assignment below relies on all previous BaseProperty* elements having been deleted + std::for_each(properties_.begin(), properties_.end(), Delete()); + properties_ = _rhs.properties_; + Properties::iterator p_it=properties_.begin(), p_end=properties_.end(); + for (; p_it!=p_end; ++p_it) + if (*p_it) + *p_it = (*p_it)->clone(); + return *this; + } + + + + //--------------------------------------------------------- manage properties + + template + BasePropHandleT add(const T&, const std::string& _name="") + { + Properties::iterator p_it=properties_.begin(), p_end=properties_.end(); + int idx=0; + for ( ; p_it!=p_end && *p_it!=NULL; ++p_it, ++idx ) {}; + if (p_it==p_end) properties_.push_back(NULL); + properties_[idx] = new PropertyT(_name); + return BasePropHandleT(idx); + } + + + template + BasePropHandleT handle(const T&, const std::string& _name) const + { + Properties::const_iterator p_it = properties_.begin(); + for (int idx=0; p_it != properties_.end(); ++p_it, ++idx) + { + if (*p_it != NULL && + (*p_it)->name() == _name //skip deleted properties +// Skip type check +#ifndef OM_FORCE_STATIC_CAST + && dynamic_cast*>(properties_[idx]) != NULL //check type +#endif + ) + { + return BasePropHandleT(idx); + } + } + return BasePropHandleT(); + } + + BaseProperty* property( const std::string& _name ) const + { + Properties::const_iterator p_it = properties_.begin(); + for (int idx=0; p_it != properties_.end(); ++p_it, ++idx) + { + if (*p_it != NULL && (*p_it)->name() == _name) //skip deleted properties + { + return *p_it; + } + } + return NULL; + } + + template PropertyT& property(BasePropHandleT _h) + { + assert(_h.idx() >= 0 && _h.idx() < (int)properties_.size()); + assert(properties_[_h.idx()] != NULL); +#ifdef OM_FORCE_STATIC_CAST + return *static_cast *> (properties_[_h.idx()]); +#else + PropertyT* p = dynamic_cast*>(properties_[_h.idx()]); + assert(p != NULL); + return *p; +#endif + } + + + template const PropertyT& property(BasePropHandleT _h) const + { + assert(_h.idx() >= 0 && _h.idx() < (int)properties_.size()); + assert(properties_[_h.idx()] != NULL); +#ifdef OM_FORCE_STATIC_CAST + return *static_cast*>(properties_[_h.idx()]); +#else + PropertyT* p = dynamic_cast*>(properties_[_h.idx()]); + assert(p != NULL); + return *p; +#endif + } + + + template void remove(BasePropHandleT _h) + { + assert(_h.idx() >= 0 && _h.idx() < (int)properties_.size()); + delete properties_[_h.idx()]; + properties_[_h.idx()] = NULL; + } + + + void clear() + { + // Clear properties vector: + // Replaced the old version with new one + // which performs a swap to clear values and + // deallocate memory. + + // Old version (changed 22.07.09) { + // std::for_each(properties_.begin(), properties_.end(), Delete()); + // } + + std::for_each(properties_.begin(), properties_.end(), ClearAll()); + } + + + //---------------------------------------------------- synchronize properties + +/* + * In C++11 an beyond we can introduce more efficient and more legible + * implementations of the following methods. + */ +#if ((defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENMESH_VECTOR_LEGACY) + /** + * Reserves space for \p _n elements in all property vectors. + */ + void reserve(size_t _n) const { + std::for_each(properties_.begin(), properties_.end(), + [_n](BaseProperty* p) { if (p) p->reserve(_n); }); + } + + /** + * Resizes all property vectors to the specified size. + */ + void resize(size_t _n) const { + std::for_each(properties_.begin(), properties_.end(), + [_n](BaseProperty* p) { if (p) p->resize(_n); }); + } + + /** + * Same as resize() but ignores property vectors that have a size larger + * than \p _n. + * + * Use this method instead of resize() if you plan to frequently reduce + * and enlarge the property container and you don't want to waste time + * reallocating the property vectors every time. + */ + void resize_if_smaller(size_t _n) const { + std::for_each(properties_.begin(), properties_.end(), + [_n](BaseProperty* p) { if (p && p->n_elements() < _n) p->resize(_n); }); + } + + /** + * Swaps the items with index \p _i0 and index \p _i1 in all property + * vectors. + */ + void swap(size_t _i0, size_t _i1) const { + std::for_each(properties_.begin(), properties_.end(), + [_i0, _i1](BaseProperty* p) { if (p) p->swap(_i0, _i1); }); + } +#else + /** + * Reserves space for \p _n elements in all property vectors. + */ + void reserve(size_t _n) const { + std::for_each(properties_.begin(), properties_.end(), Reserve(_n)); + } + + /** + * Resizes all property vectors to the specified size. + */ + void resize(size_t _n) const { + std::for_each(properties_.begin(), properties_.end(), Resize(_n)); + } + + /** + * Same as \sa resize() but ignores property vectors that have a size + * larger than \p _n. + * + * Use this method instead of \sa resize() if you plan to frequently reduce + * and enlarge the property container and you don't want to waste time + * reallocating the property vectors every time. + */ + void resize_if_smaller(size_t _n) const { + std::for_each(properties_.begin(), properties_.end(), ResizeIfSmaller(_n)); + } + + /** + * Swaps the items with index \p _i0 and index \p _i1 in all property + * vectors. + */ + void swap(size_t _i0, size_t _i1) const { + std::for_each(properties_.begin(), properties_.end(), Swap(_i0, _i1)); + } +#endif + + + +protected: // generic add/get + + size_t _add( BaseProperty* _bp ) + { + Properties::iterator p_it=properties_.begin(), p_end=properties_.end(); + size_t idx=0; + for (; p_it!=p_end && *p_it!=NULL; ++p_it, ++idx) {}; + if (p_it==p_end) properties_.push_back(NULL); + properties_[idx] = _bp; + return idx; + } + + BaseProperty& _property( size_t _idx ) + { + assert( _idx < properties_.size()); + assert( properties_[_idx] != NULL); + BaseProperty *p = properties_[_idx]; + assert( p != NULL ); + return *p; + } + + const BaseProperty& _property( size_t _idx ) const + { + assert( _idx < properties_.size()); + assert( properties_[_idx] != NULL); + BaseProperty *p = properties_[_idx]; + assert( p != NULL ); + return *p; + } + + + typedef Properties::iterator iterator; + typedef Properties::const_iterator const_iterator; + iterator begin() { return properties_.begin(); } + iterator end() { return properties_.end(); } + const_iterator begin() const { return properties_.begin(); } + const_iterator end() const { return properties_.end(); } + + friend class BaseKernel; + +private: + + //-------------------------------------------------- synchronization functors + +#ifndef DOXY_IGNORE_THIS + struct Reserve + { + Reserve(size_t _n) : n_(_n) {} + void operator()(BaseProperty* _p) const { if (_p) _p->reserve(n_); } + size_t n_; + }; + + struct Resize + { + Resize(size_t _n) : n_(_n) {} + void operator()(BaseProperty* _p) const { if (_p) _p->resize(n_); } + size_t n_; + }; + + struct ResizeIfSmaller + { + ResizeIfSmaller(size_t _n) : n_(_n) {} + void operator()(BaseProperty* _p) const { if (_p && _p->n_elements() < n_) _p->resize(n_); } + size_t n_; + }; + + struct ClearAll + { + ClearAll() {} + void operator()(BaseProperty* _p) const { if (_p) _p->clear(); } + }; + + struct Swap + { + Swap(size_t _i0, size_t _i1) : i0_(_i0), i1_(_i1) {} + void operator()(BaseProperty* _p) const { if (_p) _p->swap(i0_, i1_); } + size_t i0_, i1_; + }; + + struct Delete + { + Delete() {} + void operator()(BaseProperty* _p) const { if (_p) delete _p; _p=NULL; } + }; +#endif + + Properties properties_; +}; + +}//namespace OpenMesh + +#endif//OPENMESH_PROPERTYCONTAINER + diff --git a/libs/OpenMesh/include/OpenMesh/Core/Utils/PropertyManager.hh b/libs/OpenMesh/include/OpenMesh/Core/Utils/PropertyManager.hh new file mode 100644 index 0000000..ae8ad18 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Utils/PropertyManager.hh @@ -0,0 +1,577 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#ifndef PROPERTYMANAGER_HH_ +#define PROPERTYMANAGER_HH_ + +#include +#include +#include + +namespace OpenMesh { + +/** + * This class is intended to manage the lifecycle of properties. + * It also defines convenience operators to access the encapsulated + * property's value. + * + * For C++11, it is recommended to use the factory functions + * makePropertyManagerFromNew, makePropertyManagerFromExisting, + * makePropertyManagerFromExistingOrNew to construct a PropertyManager, e.g. + * + * \code + * TriMesh mesh; + * auto visited = makePropertyManagerFromNew>(mesh, "visited.plugin-example.i8.informatik.rwth-aachen.de"); + * + * for (auto vh : mesh.vertices()) { + * if (!visited[vh]) { + * visitComponent(mesh, vh, visited); + * } + * } + * \endcode + * + * For C++98, it is usually more convenient to use the constructor explicitly, + * i.e. + * + * \code + * TriMesh mesh; + * PropertyManager, TriMesh> visited(mesh, "visited.plugin-example.i8.informatik.rwth-aachen.de"); + * + * for (TriMesh::VertexIter vh_it = mesh.begin(); ... ; ...) { + * if (!visited[*vh_it]) { + * visitComponent(mesh, *vh_it, visited); + * } + * } + * \endcode + * + */ +template +class PropertyManager { +#if (defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) + public: + PropertyManager(const PropertyManager&) = delete; + PropertyManager& operator=(const PropertyManager&) = delete; +#else + private: + /** + * Noncopyable because there aren't no straightforward copy semantics. + */ + PropertyManager(const PropertyManager&); + + /** + * Noncopyable because there aren't no straightforward copy semantics. + */ + PropertyManager& operator=(const PropertyManager&); +#endif + + public: + /** + * Constructor. + * + * Throws an \p std::runtime_error if \p existing is true and + * no property named \p propname of the appropriate property type + * exists. + * + * @param mesh The mesh on which to create the property. + * @param propname The name of the property. + * @param existing If false, a new property is created and its lifecycle is managed (i.e. + * the property is deleted upon destruction of the PropertyManager instance). If true, + * the instance merely acts as a convenience wrapper around an existing property with no + * lifecycle management whatsoever. + * + * @see PropertyManager::createIfNotExists, makePropertyManagerFromNew, + * makePropertyManagerFromExisting, makePropertyManagerFromExistingOrNew + */ + PropertyManager(MeshT &mesh, const char *propname, bool existing = false) : mesh_(&mesh), retain_(existing), name_(propname) { + if (existing) { + if (!mesh_->get_property_handle(prop_, propname)) { + std::ostringstream oss; + oss << "Requested property handle \"" << propname << "\" does not exist."; + throw std::runtime_error(oss.str()); + } + } else { + mesh_->add_property(prop_, propname); + } + } + + PropertyManager() : mesh_(0), retain_(false) { + } + + ~PropertyManager() { + deleteProperty(); + } + + void swap(PropertyManager &rhs) { + std::swap(mesh_, rhs.mesh_); + std::swap(prop_, rhs.prop_); + std::swap(retain_, rhs.retain_); + std::swap(name_, rhs.name_); + } + + static bool propertyExists(MeshT &mesh, const char *propname) { + PROPTYPE dummy; + return mesh.get_property_handle(dummy, propname); + } + + bool isValid() const { return mesh_ != 0; } + operator bool() const { return isValid(); } + + const PROPTYPE &getRawProperty() const { return prop_; } + + const std::string &getName() const { return name_; } + + MeshT &getMesh() const { return *mesh_; } + +#if (defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) + /// Only for pre C++11 compatibility. + + typedef PropertyManager Proxy; + + /** + * Move constructor. Transfers ownership (delete responsibility). + */ + PropertyManager(PropertyManager &&rhs) : mesh_(rhs.mesh_), prop_(rhs.prop_), retain_(rhs.retain_), name_(rhs.name_) { + rhs.retain_ = true; + } + + /** + * Move assignment. Transfers ownership (delete responsibility). + */ + PropertyManager &operator=(PropertyManager &&rhs) { + if (&rhs != this) { + deleteProperty(); + mesh_ = rhs.mesh_; + prop_ = rhs.prop_; + retain_ = rhs.retain_; + name_ = rhs.name_; + rhs.retain_ = true; + } + return *this; + } + + /** + * Create a property manager for the supplied property and mesh. + * If the property doesn't exist, it is created. In any case, + * lifecycle management is disabled. + * + * @see makePropertyManagerFromExistingOrNew + */ + static PropertyManager createIfNotExists(MeshT &mesh, const char *propname) { + PROPTYPE dummy_prop; + PropertyManager pm(mesh, propname, mesh.get_property_handle(dummy_prop, propname)); + pm.retain(); + return std::move(pm); + } + + /** + * Like createIfNotExists() with two parameters except, if the property + * doesn't exist, it is initialized with the supplied value over + * the supplied range after creation. If the property already exists, + * this method has the exact same effect as the two parameter version. + * Lifecycle management is disabled in any case. + * + * @see makePropertyManagerFromExistingOrNew + */ + template + static PropertyManager createIfNotExists(MeshT &mesh, const char *propname, + const ITERATOR_TYPE &begin, const ITERATOR_TYPE &end, + const PROP_VALUE &init_value) { + const bool exists = propertyExists(mesh, propname); + PropertyManager pm(mesh, propname, exists); + pm.retain(); + if (!exists) + pm.set_range(begin, end, init_value); + return std::move(pm); + } + + /** + * Like createIfNotExists() with two parameters except, if the property + * doesn't exist, it is initialized with the supplied value over + * the supplied range after creation. If the property already exists, + * this method has the exact same effect as the two parameter version. + * Lifecycle management is disabled in any case. + * + * @see makePropertyManagerFromExistingOrNew + */ + template + static PropertyManager createIfNotExists(MeshT &mesh, const char *propname, + const ITERATOR_RANGE &range, const PROP_VALUE &init_value) { + return createIfNotExists( + mesh, propname, range.begin(), range.end(), init_value); + } + + PropertyManager duplicate(const char *clone_name) { + PropertyManager pm(*mesh_, clone_name, false); + pm.mesh_->property(pm.prop_) = mesh_->property(prop_); + return pm; + } + + /** + * Included for backwards compatibility with non-C++11 version. + */ + PropertyManager move() { + return std::move(*this); + } + +#else + class Proxy { + private: + Proxy(MeshT *mesh_, PROPTYPE prop_, bool retain_, const std::string &name_) : + mesh_(mesh_), prop_(prop_), retain_(retain_), name_(name_) {} + MeshT *mesh_; + PROPTYPE prop_; + bool retain_; + std::string name_; + + friend class PropertyManager; + }; + + operator Proxy() { + Proxy p(mesh_, prop_, retain_, name_); + mesh_ = 0; + retain_ = true; + return p; + } + + Proxy move() { + return (Proxy)*this; + } + + PropertyManager(Proxy p) : mesh_(p.mesh_), prop_(p.prop_), retain_(p.retain_), name_(p.name_) {} + + PropertyManager &operator=(Proxy p) { + PropertyManager(p).swap(*this); + return *this; + } + + /** + * Create a property manager for the supplied property and mesh. + * If the property doesn't exist, it is created. In any case, + * lifecycle management is disabled. + * + * @see makePropertyManagerFromExistingOrNew + */ + static Proxy createIfNotExists(MeshT &mesh, const char *propname) { + PROPTYPE dummy_prop; + PropertyManager pm(mesh, propname, mesh.get_property_handle(dummy_prop, propname)); + pm.retain(); + return (Proxy)pm; + } + + /** + * Like createIfNotExists() with two parameters except, if the property + * doesn't exist, it is initialized with the supplied value over + * the supplied range after creation. If the property already exists, + * this method has the exact same effect as the two parameter version. + * Lifecycle management is disabled in any case. + * + * @see makePropertyManagerFromExistingOrNew + */ + template + static Proxy createIfNotExists(MeshT &mesh, const char *propname, + const ITERATOR_TYPE &begin, const ITERATOR_TYPE &end, + const PROP_VALUE &init_value) { + const bool exists = propertyExists(mesh, propname); + PropertyManager pm(mesh, propname, exists); + pm.retain(); + if (!exists) + pm.set_range(begin, end, init_value); + return (Proxy)pm; + } + + Proxy duplicate(const char *clone_name) { + PropertyManager pm(*mesh_, clone_name, false); + pm.mesh_->property(pm.prop_) = mesh_->property(prop_); + return (Proxy)pm; + } +#endif + + /** + * \brief Disable lifecycle management for this property. + * + * If this method is called, the encapsulated property will not be deleted + * upon destruction of the PropertyManager instance. + */ + inline void retain(bool doRetain = true) { + retain_ = doRetain; + } + + /** + * Access the encapsulated property. + */ + inline PROPTYPE &operator* () { + return prop_; + } + + /** + * Access the encapsulated property. + */ + inline const PROPTYPE &operator* () const { + return prop_; + } + + /** + * Enables convenient access to the encapsulated property. + * + * For a usage example see this class' documentation. + * + * @param handle A handle of the appropriate handle type. (I.e. \p VertexHandle for \p VPropHandleT, etc.) + */ + template + inline typename PROPTYPE::reference operator[] (const HandleType &handle) { + return mesh_->property(prop_, handle); + } + + /** + * Enables convenient access to the encapsulated property. + * + * For a usage example see this class' documentation. + * + * @param handle A handle of the appropriate handle type. (I.e. \p VertexHandle for \p VPropHandleT, etc.) + */ + template + inline typename PROPTYPE::const_reference operator[] (const HandleType &handle) const { + return mesh_->property(prop_, handle); + } + + /** + * Conveniently set the property for an entire range of values. + * + * Examples: + * \code + * MeshT mesh; + * PropertyManager, MeshT> distance( + * mesh, "distance.plugin-example.i8.informatik.rwth-aachen.de"); + * distance.set_range( + * mesh.vertices_begin(), mesh.vertices_end(), + * std::numeric_limits::infinity()); + * \endcode + * or + * \code + * MeshT::VertexHandle vh; + * distance.set_range( + * mesh.vv_begin(vh), mesh.vv_end(vh), + * std::numeric_limits::infinity()); + * \endcode + * + * @param begin Start iterator. Needs to dereference to HandleType. + * @param end End iterator. (Exclusive.) + * @param value The value the range will be set to. + */ + template + void set_range(HandleTypeIterator begin, HandleTypeIterator end, + const PROP_VALUE &value) { + for (; begin != end; ++begin) + (*this)[*begin] = value; + } + +#if (defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__) + template + void set_range(const HandleTypeIteratorRange &range, + const PROP_VALUE &value) { + set_range(range.begin(), range.end(), value); + } +#endif + + /** + * Conveniently transfer the values managed by one property manager + * onto the values managed by a different property manager. + * + * @param begin Start iterator. Needs to dereference to HandleType. Will + * be used with this property manager. + * @param end End iterator. (Exclusive.) Will be used with this property + * manager. + * @param dst_propmanager The destination property manager. + * @param dst_begin Start iterator. Needs to dereference to the + * HandleType of dst_propmanager. Will be used with dst_propmanager. + * @param dst_end End iterator. (Exclusive.) + * Will be used with dst_propmanager. Used to double check the bounds. + */ + template + void copy_to(HandleTypeIterator begin, HandleTypeIterator end, + PropertyManager &dst_propmanager, + HandleTypeIterator_2 dst_begin, HandleTypeIterator_2 dst_end) const { + + for (; begin != end && dst_begin != dst_end; ++begin, ++dst_begin) { + dst_propmanager[*dst_begin] = (*this)[*begin]; + } + } + + template + void copy_to(const RangeType &range, + PropertyManager &dst_propmanager, + const RangeType_2 &dst_range) const { + copy_to(range.begin(), range.end(), dst_propmanager, + dst_range.begin(), dst_range.end()); + } + + /** + * Copy the values of a property from a source range to + * a target range. The source range must not be smaller than the + * target range. + * + * @param prop_name Name of the property to copy. Must exist on the + * source mesh. Will be created on the target mesh if it doesn't exist. + * + * @param src_mesh Source mesh from which to copy. + * @param src_range Source range which to copy. Must not be smaller than + * dst_range. + * @param dst_mesh Destination mesh on which to copy. + * @param dst_range Destination range. + */ + template + static void copy(const char *prop_name, + MeshT &src_mesh, const RangeType &src_range, + MeshT_2 &dst_mesh, const RangeType_2 &dst_range) { + + typedef OpenMesh::PropertyManager DstPM; + DstPM dst(DstPM::createIfNotExists(dst_mesh, prop_name)); + + typedef OpenMesh::PropertyManager SrcPM; + SrcPM src(src_mesh, prop_name, true); + + src.copy_to(src_range, dst, dst_range); + } + + private: + void deleteProperty() { + if (!retain_) + mesh_->remove_property(prop_); + } + + private: + MeshT *mesh_; + PROPTYPE prop_; + bool retain_; + std::string name_; +}; + +/** \relates PropertyManager + * Creates a new property whose lifecycle is managed by the returned + * PropertyManager. + * + * Intended for temporary properties. Shadows any existsing properties of + * matching name and type. + */ +template +PropertyManager makePropertyManagerFromNew(MeshT &mesh, const char *propname) { + return PropertyManager(mesh, propname, false); +} + +/** \relates PropertyManager + * Creates a non-owning wrapper for an existing mesh property (no lifecycle + * management). + * + * Intended for convenient access. + * + * @pre Property with the name \p propname of matching type exists. + * @throws std::runtime_error if no property with the name \p propname of + * matching type exists. + */ +template +PropertyManager makePropertyManagerFromExisting(MeshT &mesh, const char *propname) { + return PropertyManager(mesh, propname, true); +} + +/** \relates PropertyManager + * Creates a non-owning wrapper for a mesh property (no lifecycle management). + * If the given property does not exist, it is created. + * + * Intended for creating or accessing persistent properties. + */ +template +PropertyManager makePropertyManagerFromExistingOrNew(MeshT &mesh, const char *propname) { + return PropertyManager::createIfNotExists(mesh, propname); +} + +/** \relates PropertyManager + * Like the two parameter version of makePropertyManagerFromExistingOrNew() + * except it initializes the property with the specified value over the + * specified range if it needs to be created. If the property already exists, + * this function has the exact same effect as the two parameter version. + * + * Creates a non-owning wrapper for a mesh property (no lifecycle management). + * If the given property does not exist, it is created. + * + * Intended for creating or accessing persistent properties. + */ +template +PropertyManager makePropertyManagerFromExistingOrNew( + MeshT &mesh, const char *propname, + const ITERATOR_TYPE &begin, const ITERATOR_TYPE &end, + const PROP_VALUE &init_value) { + return PropertyManager::createIfNotExists( + mesh, propname, begin, end, init_value); +} + +/** \relates PropertyManager + * Like the two parameter version of makePropertyManagerFromExistingOrNew() + * except it initializes the property with the specified value over the + * specified range if it needs to be created. If the property already exists, + * this function has the exact same effect as the two parameter version. + * + * Creates a non-owning wrapper for a mesh property (no lifecycle management). + * If the given property does not exist, it is created. + * + * Intended for creating or accessing persistent properties. + */ +template +PropertyManager makePropertyManagerFromExistingOrNew( + MeshT &mesh, const char *propname, + const ITERATOR_RANGE &range, + const PROP_VALUE &init_value) { + return makePropertyManagerFromExistingOrNew( + mesh, propname, range.begin(), range.end(), init_value); +} + +} /* namespace OpenMesh */ +#endif /* PROPERTYMANAGER_HH_ */ diff --git a/libs/OpenMesh/include/OpenMesh/Core/Utils/RandomNumberGenerator.hh b/libs/OpenMesh/include/OpenMesh/Core/Utils/RandomNumberGenerator.hh new file mode 100644 index 0000000..aaedfcd --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Utils/RandomNumberGenerator.hh @@ -0,0 +1,117 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision: 693 $ * + * $Date: 2012-09-23 16:25:16 +0200 (So, 23 Sep 2012) $ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Helper Functions for generating a random number between 0.0 and 1.0 with +// a garantueed resolution +// +//============================================================================= + + +#ifndef OPENMESH_UTILS_RANDOMNUMBERGENERATOR_HH +#define OPENMESH_UTILS_RANDOMNUMBERGENERATOR_HH + + +//== INCLUDES ================================================================= + + +#include +#include + + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + + +//============================================================================= + + +/** Generate a random number between 0.0 and 1.0 with a guaranteed resolution + * ( Number of possible values ) + * + * Especially useful on windows, as there MAX_RAND is often only 32k which is + * not enough resolution for a lot of applications + */ +class OPENMESHDLLEXPORT RandomNumberGenerator +{ +public: + + /** \brief Constructor + * + * @param _resolution specifies the desired resolution for the random number generated + */ + explicit RandomNumberGenerator(const size_t _resolution); + + /// returns a random double between 0.0 and 1.0 with a guaranteed resolution + double getRand() const; + + double resolution() const; + +private: + + /// desired resolution + const size_t resolution_; + + /// number of "blocks" of RAND_MAX that make up the desired _resolution + size_t iterations_; + + /// maximum random number generated, which is used for normalization + double maxNum_; +}; + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_UTILS_RANDOMNUMBERGENERATOR_HH defined +//============================================================================= + diff --git a/libs/OpenMesh/include/OpenMesh/Core/Utils/SingletonT.hh b/libs/OpenMesh/include/OpenMesh/Core/Utils/SingletonT.hh new file mode 100644 index 0000000..b0745c4 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Utils/SingletonT.hh @@ -0,0 +1,154 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Implements a simple singleton template +// +//============================================================================= + + +#ifndef __SINGLETON_HH__ +#define __SINGLETON_HH__ + + +//=== INCLUDES ================================================================ + +// OpenMesh +#include + +// STL +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + + +//=== IMPLEMENTATION ========================================================== + + +/** A simple singleton template. + Encapsulates an arbitrary class and enforces its uniqueness. +*/ + +template +class SingletonT +{ +public: + + /** Singleton access function. + Use this function to obtain a reference to the instance of the + encapsulated class. Note that this instance is unique and created + on the first call to Instance(). + */ + + static T& Instance() + { + if (!pInstance__) + { + // check if singleton alive + if (destroyed__) + { + OnDeadReference(); + } + // first time request -> initialize + else + { + Create(); + } + } + return *pInstance__; + } + + +private: + + // Disable constructors/assignment to enforce uniqueness + SingletonT(); + SingletonT(const SingletonT&); + SingletonT& operator=(const SingletonT&); + + // Create a new singleton and store its pointer + static void Create() + { + static T theInstance; + pInstance__ = &theInstance; + } + + // Will be called if instance is accessed after its lifetime has expired + static void OnDeadReference() + { + throw std::runtime_error("[Singelton error] - Dead reference detected!\n"); + } + + virtual ~SingletonT() + { + pInstance__ = 0; + destroyed__ = true; + } + + static T* pInstance__; + static bool destroyed__; +}; + + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_SINGLETON_C) +# define OPENMESH_SINGLETON_TEMPLATES +# include "SingletonT.cc" +#endif +//============================================================================= +#endif // __SINGLETON_HH__ +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Utils/color_cast.hh b/libs/OpenMesh/include/OpenMesh/Core/Utils/color_cast.hh new file mode 100644 index 0000000..0dd9901 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Utils/color_cast.hh @@ -0,0 +1,385 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Helper Functions for binary reading / writing +// +//============================================================================= + + +#ifndef OPENMESH_COLOR_CAST_HH +#define OPENMESH_COLOR_CAST_HH + + +//== INCLUDES ================================================================= + + +#include +#include + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + + +//============================================================================= + + +/** \name Cast vector type to another vector type. +*/ +//@{ + +//----------------------------------------------------------------------------- +#ifndef DOXY_IGNORE_THIS + +/// Cast one color vector to another. +template +struct color_caster +{ + typedef dst_t return_type; + + inline static return_type cast(const src_t& _src) + { + dst_t dst; + vector_cast(_src, dst, GenProg::Int2Type::size_>()); + return dst; + } +}; + + +template <> +struct color_caster +{ + typedef Vec3uc return_type; + + inline static return_type cast(const Vec3f& _src) + { + return Vec3uc( (unsigned char)(_src[0]* 255.0f + 0.5f), + (unsigned char)(_src[1]* 255.0f + 0.5f), + (unsigned char)(_src[2]* 255.0f + 0.5f) ); + } +}; + +template <> +struct color_caster +{ + typedef Vec3uc return_type; + + inline static return_type cast(const Vec4f& _src) + { + return Vec3uc( (unsigned char)(_src[0]* 255.0f + 0.5f), + (unsigned char)(_src[1]* 255.0f + 0.5f), + (unsigned char)(_src[2]* 255.0f + 0.5f) ); + } +}; + +template <> +struct color_caster +{ + typedef Vec3i return_type; + + inline static return_type cast(const Vec3f& _src) + { + return Vec3i( (int)(_src[0]* 255.0f + 0.5f), + (int)(_src[1]* 255.0f + 0.5f), + (int)(_src[2]* 255.0f + 0.5f) ); + } +}; + +template <> +struct color_caster +{ + typedef Vec3i return_type; + + inline static return_type cast(const Vec4f& _src) + { + return Vec3i( (int)(_src[0]* 255.0f + 0.5f), + (int)(_src[1]* 255.0f + 0.5f), + (int)(_src[2]* 255.0f + 0.5f) ); + } +}; + +template <> +struct color_caster +{ + typedef Vec4i return_type; + + inline static return_type cast(const Vec4f& _src) + { + return Vec4i( (int)(_src[0]* 255.0f + 0.5f), + (int)(_src[1]* 255.0f + 0.5f), + (int)(_src[2]* 255.0f + 0.5f), + (int)(_src[3]* 255.0f + 0.5f) ); + } +}; + +template <> +struct color_caster +{ + typedef Vec3ui return_type; + + inline static return_type cast(const Vec3f& _src) + { + return Vec3ui( (unsigned int)(_src[0]* 255.0f + 0.5f), + (unsigned int)(_src[1]* 255.0f + 0.5f), + (unsigned int)(_src[2]* 255.0f + 0.5f) ); + } +}; + +template <> +struct color_caster +{ + typedef Vec3ui return_type; + + inline static return_type cast(const Vec4f& _src) + { + return Vec3ui( (unsigned int)(_src[0]* 255.0f + 0.5f), + (unsigned int)(_src[1]* 255.0f + 0.5f), + (unsigned int)(_src[2]* 255.0f + 0.5f) ); + } +}; + +template <> +struct color_caster +{ + typedef Vec4ui return_type; + + inline static return_type cast(const Vec4f& _src) + { + return Vec4ui( (unsigned int)(_src[0]* 255.0f + 0.5f), + (unsigned int)(_src[1]* 255.0f + 0.5f), + (unsigned int)(_src[2]* 255.0f + 0.5f), + (unsigned int)(_src[3]* 255.0f + 0.5f) ); + } +}; + +template <> +struct color_caster +{ + typedef Vec4uc return_type; + + inline static return_type cast(const Vec3f& _src) + { + return Vec4uc( (unsigned char)(_src[0]* 255.0f + 0.5f), + (unsigned char)(_src[1]* 255.0f + 0.5f), + (unsigned char)(_src[2]* 255.0f + 0.5f), + (unsigned char)(255) ); + } +}; + +template <> +struct color_caster +{ + typedef Vec4f return_type; + + inline static return_type cast(const Vec3f& _src) + { + return Vec4f( _src[0], + _src[1], + _src[2], + 1.0f ); + } +}; + +template <> +struct color_caster +{ + typedef Vec4ui return_type; + + inline static return_type cast(const Vec3uc& _src) + { + return Vec4ui(_src[0], + _src[1], + _src[2], + 255 ); + } +}; + +template <> +struct color_caster +{ + typedef Vec4f return_type; + + inline static return_type cast(const Vec3i& _src) + { + const float f = 1.0f / 255.0f; + return Vec4f(_src[0]*f, _src[1]*f, _src[2]*f, 1.0f ); + } +}; + +template <> +struct color_caster +{ + typedef Vec4uc return_type; + + inline static return_type cast(const Vec4f& _src) + { + return Vec4uc( (unsigned char)(_src[0]* 255.0f + 0.5f), + (unsigned char)(_src[1]* 255.0f + 0.5f), + (unsigned char)(_src[2]* 255.0f + 0.5f), + (unsigned char)(_src[3]* 255.0f + 0.5f) ); + } +}; + +template <> +struct color_caster +{ + typedef Vec4f return_type; + + inline static return_type cast(const Vec4i& _src) + { + const float f = 1.0f / 255.0f; + return Vec4f( _src[0] * f, _src[1] * f, _src[2] * f , _src[3] * f ); + } +}; + +template <> +struct color_caster +{ + typedef Vec4uc return_type; + + inline static return_type cast(const Vec3uc& _src) + { + return Vec4uc( _src[0], _src[1], _src[2], 255 ); + } +}; + +template <> +struct color_caster +{ + typedef Vec3f return_type; + + inline static return_type cast(const Vec3uc& _src) + { + const float f = 1.0f / 255.0f; + return Vec3f(_src[0] * f, _src[1] * f, _src[2] * f ); + } +}; + +template <> +struct color_caster +{ + typedef Vec3f return_type; + + inline static return_type cast(const Vec4uc& _src) + { + const float f = 1.0f / 255.0f; + return Vec3f(_src[0] * f, _src[1] * f, _src[2] * f ); + } +}; + +template <> +struct color_caster +{ + typedef Vec4f return_type; + + inline static return_type cast(const Vec3uc& _src) + { + const float f = 1.0f / 255.0f; + return Vec4f(_src[0] * f, _src[1] * f, _src[2] * f, 1.0f ); + } +}; + +template <> +struct color_caster +{ + typedef Vec4f return_type; + + inline static return_type cast(const Vec4uc& _src) + { + const float f = 1.0f / 255.0f; + return Vec4f(_src[0] * f, _src[1] * f, _src[2] * f, _src[3] * f ); + } +}; + +// ---------------------------------------------------------------------------- + + +#ifndef DOXY_IGNORE_THIS + +#if !defined(OM_CC_MSVC) +template +struct color_caster +{ + typedef const dst_t& return_type; + + inline static return_type cast(const dst_t& _src) + { + return _src; + } +}; +#endif + +#endif + +//----------------------------------------------------------------------------- + + +template +inline +typename color_caster::return_type +color_cast(const src_t& _src ) +{ + return color_caster::cast(_src); +} + +#endif +//----------------------------------------------------------------------------- + +//@} + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_COLOR_CAST_HH defined +//============================================================================= + diff --git a/libs/OpenMesh/include/OpenMesh/Core/Utils/vector_cast.hh b/libs/OpenMesh/include/OpenMesh/Core/Utils/vector_cast.hh new file mode 100644 index 0000000..39fca19 --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Utils/vector_cast.hh @@ -0,0 +1,163 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Helper Functions for binary reading / writing +// +//============================================================================= + + +#ifndef OPENMESH_VECTORCAST_HH +#define OPENMESH_VECTORCAST_HH + + +//== INCLUDES ================================================================= + + +#include +#include +#include +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + + +//============================================================================= + + +/** \name Cast vector type to another vector type. +*/ +//@{ + +//----------------------------------------------------------------------------- + +template +inline void vector_cast( const src_t &_src, dst_t &_dst, GenProg::Int2Type ) +{ + assert_compile(vector_traits::size_ <= vector_traits::size_) + vector_cast(_src,_dst, GenProg::Int2Type()); + _dst[n-1] = static_cast::value_type >(_src[n-1]); +} + +template +inline void vector_cast( const src_t & /*_src*/, dst_t & /*_dst*/, GenProg::Int2Type<0> ) +{ +} + +template +inline void vector_copy( const src_t &_src, dst_t &_dst, GenProg::Int2Type ) +{ + assert_compile(vector_traits::size_ <= vector_traits::size_) + vector_copy(_src,_dst, GenProg::Int2Type()); + _dst[n-1] = _src[n-1]; +} + +template +inline void vector_copy( const src_t & /*_src*/, dst_t & /*_dst*/ , GenProg::Int2Type<0> ) +{ +} + + + +//----------------------------------------------------------------------------- +#ifndef DOXY_IGNORE_THIS + +template +struct vector_caster +{ + typedef dst_t return_type; + + inline static return_type cast(const src_t& _src) + { + dst_t dst; + vector_cast(_src, dst, GenProg::Int2Type::size_>()); + return dst; + } +}; + +#if !defined(OM_CC_MSVC) +template +struct vector_caster +{ + typedef const dst_t& return_type; + + inline static return_type cast(const dst_t& _src) + { + return _src; + } +}; +#endif + +#endif +//----------------------------------------------------------------------------- + + +/// Cast vector type to another vector type by copying the vector elements +template +inline +typename vector_caster::return_type +vector_cast(const src_t& _src ) +{ + return vector_caster::cast(_src); +} + + +//@} + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_MESHREADER_HH defined +//============================================================================= diff --git a/libs/OpenMesh/include/OpenMesh/Core/Utils/vector_traits.hh b/libs/OpenMesh/include/OpenMesh/Core/Utils/vector_traits.hh new file mode 100644 index 0000000..fb78b3c --- /dev/null +++ b/libs/OpenMesh/include/OpenMesh/Core/Utils/vector_traits.hh @@ -0,0 +1,115 @@ +/* ========================================================================= * + * * + * OpenMesh * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + +//============================================================================= +// +// Helper Functions for binary reading / writing +// +//============================================================================= + + +#ifndef OPENMESH_VECTOR_TRAITS_HH +#define OPENMESH_VECTOR_TRAITS_HH + + +//== INCLUDES ================================================================= + +#include +#include +#if defined(OM_CC_MIPS) +# include +#else +# include +#endif + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + + +//============================================================================= + + +/** \name Provide a standardized access to relevant information about a + vector type. +*/ +//@{ + +//----------------------------------------------------------------------------- + +/** Helper class providing information about a vector type. + * + * If want to use a different vector type than the one provided %OpenMesh + * you need to supply a specialization of this class for the new vector type. + */ +template +struct vector_traits +{ + /// Type of the vector class + typedef typename T::vector_type vector_type; + + /// Type of the scalar value + typedef typename T::value_type value_type; + + /// size/dimension of the vector + static const size_t size_ = T::size_; + + /// size/dimension of the vector + static size_t size() { return size_; } +}; + +//@} + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#endif // OPENMESH_MESHREADER_HH defined +//============================================================================= diff --git a/libs/OpenMesh/liblinux/libOpenMeshCore.a b/libs/OpenMesh/liblinux/libOpenMeshCore.a new file mode 100644 index 0000000000000000000000000000000000000000..29578ffdd3ec8501300d73b900b402e9162a4ff0 GIT binary patch literal 1163982 zcmeEv3t(JTng7kJ4FxmdA+3rsK!DUo$)stU0J2G&lsk~p(1gMYI-MqyW@wU$nMoU5 z)M`>>48i{Y;>!NjT~^W6T_5bq0?WE=N(Iza7Z7({UsT*bHdF;c5ug44zVo>EyJzm5 zxs$d${>y16_uk+6zVCeJJI{O0x#ygAesa8j=z=BZM7^$wJ<5CjHyT|XTiMzwXtpe| ztg0t1>#1)Z*018&_ghE&mw()<2=n{r_gWP}zaMV4DqbYN%HKU~J)gg-zj&MVLj0=F zSz^8Xd)Wpr=Yf~=z{`2yybW?OE%%7wY%TcUZ?gkH1%} zJqzJ_m^v}v;E`~(|9U5kjM^Y z#&cagt%>-?#QJ!5*H+7*YZYYa(V|33*x+y`S)48=qzz;ywhpI?h3e66Q*XM6T7JGB zeS8T#iuhCP98c#`%0Ss77HX4(WTJEtvRF*gNh1vwqimLx%1i^rNR?2TjM+`SnF333 z_5Az|y?jXwh5TvOCbOyd$QbfdYJAPucxo&;p6c3R=BHRQr&~Rk9!+P53d!2y8#g3J zliO0`g?_OZa;x%9bjC^$v{07o+H~kqzCB01vuf`HvvvDk!&WvWe3Zln#TP4!*@Wbw!lveE` zb)2AwDeQ|qWts=x+MgUv97f!&&dXPfrv_If65A#x6Jx3IY-Th$oX%a7*wIux+8ygN*k4MUz z$NLg}O^Lo(0(tu4-qu8KN20iq+a|^alBoVfeLa{SMw!l*C}_=1ibvIRoT)e0n%J}z z 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

4N(K%4khXe2-0eD#eetZBvGyp##0Jptw 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%0DthM~L6>HjlMY8Gy<~2u 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�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

Q~P^fq2}9MYH1 z1{jwmqJf`HGV25F6oE34F~%j!G_xjhQ7(j(Q?iYpAACq`|CP` z+wl2bHk_X_^fsKe{YyDEoL?1s%CX^gsEHSw zK9BV9!-W5IgEs-wbgt{H{dm;xJH%}`aNP?XaT{(?>G1o8-pb)R89G1QY`Ja2?H7jL zhTBU9x8bJkFF)LL{K@w(*9X%1{!N&4Ztb_}wh4S1p0gVc(SiS z=hI&mz$Li-F1#ExYR~5ly$#R*WpL{+YmaTuKWXUM*VKIdD}!4(N1O2cu%YK!7<3HQ zQ}9zc^9_Bs!B4|I9m64upVEJfARO^#{1pF;kz?sK{rGZLoA|Z#aSDgyYw}d^53W48 zIBW&(Rj;KsyzCMBIjg7|54nlo$occ zZU5AHa&8hi=NNh$ziczpsr{RTerW*b@%4f;j_CMk(>cS0PUYx#E~WuG(p$Y8d!bYM zr6RxIp#@yy>q@~%X4C&QK0O7(eJZ$=#P1ftRj-yK|7vg>znZ_4{uPn`O+!zc6u(t) zVm5y7^ynvwoO=!ZM{%$5`=G&X{QlUJbCbyVFGFv``5BLXlh8l!;p+u|!N{@k`+JXG z$91)RMgLm82T1;50+N+-dHv_>VaIZj%Krmn-p{ z+}jKBtMCh>*SI3Rz9;=B2zYL9ayA=UD@Xg1=C$)zls#7)LM!Lv2Dkpzu_eB?^eYVg z6uGDU7aKfj@M{fTY4A@PyvpGJWbio#zs}&b2In}5x|H0|9<3t?H5&Y%<(`)%2LH6d zn+$%v!B-pnGY0Q6_-75?XK>9!glu@)c(netxQe8|*pHYZfQ_$J2DkEw*9yJzsT{>E zz1^e3(zlBYUXpT8Icwye7i+(jQ!6y2Z zo+~LBju*uuGD-TDvQ{Q)M71`E<*Y%u09)m zvF5&ny<2S7s6&4S50Ym4C=4>-#`b}SSINGViZ`NAK;*fu1QrTZ* zjiWIfi&NSzZf#!|E6H)TM8X=Q?rd+DKwPGnY3}ZB23NNx6T2=fdbM1j*`+LGQE(%H z*~M&o;|$XjvG{E?HIZy#I`Y}AUi=?zei3Pytf(bzqZ%BsU@nwz^tIlhY|+c5OUd0@ zI>uf2s;Ip%7~_gUi}j@q*t`bAFvideSogNU0Ct#I!?o?P86BP3)){A=bKZ$a;#i~= z7~Z-%v$DGxy9>-%)!m6?|Ceyn(bzpWL{P0@+Ll~`=Tq^M=1l$?#os9W+SVmM+xcVV z*FKrm&;I0C`L$1E`6+X({MsL|_H*23to&DkmQLHU^#2_E#>#&^nc=K{`f05EH#+WO ze)b2)%KwcJ{*Ha%9|_^_*$4gygdfS%Iffs{dB$r0qXAn{_;EaCto+-B-|FAA5BxiX z-^L%uZN{qqw;}pB?*soUA^O?p8LR$s>AzV2bDV0d{Mw(i{=a4)__e=m`J48Ezf$Z! z5Eq6#bT;Hu(HWU?jC;7kG>{3I7T^hyYy6Gt$t#13${F z#m~BzYlEkew+2`0ej9!opHl+Zoi9#R(hU|A`$MVWc_g?Iv-0Q(xT8#;f4lG>;CU>W z=L~MDadG}~s^Pe|^-^HJ&|Dh259BcRWGoOd)pDcq(x{oEuob&a+1T;+l4$(gnu(|w`#J#Wo z-B3>b<2?HhkwGgvMnzGiweDi!-{0e}68>jB2H$>uw+XZVMm84U`h}nIcMN{M{ht;6 zzWqmtBFR1!<(y|u>}SGXV!!a$D5G3``=0`TnEjO>2pFn_kME2IA7@$>aR z7@@yb1}UpY(f_>&{acn&do1=X;irBr>xfU`AKY&u^!H1``C34h|M&g>s|fu|G6Bou z!b$xz@bmqDGzwnE|4gCN%gn=ryCW2kD{1NU%K6V>>8DZnmn&hwR#JX`9sFVOSJf0S zY!*J+&$8aPKLzG6{UfZb;B=qU;Hk9yo(KLg{Uc2QN1rfK|1A7`{ajb+^b4I{-Y)_7 zbKt$23$7&<^b~TKMnjWs*wze+!oQV^!iet^?GuI{?+oKW{NN}{7%D9 z`4m4>{O_0FBci`T70Wg0JzpmLI^RuS?+|`Jyi~u^tyTNI2<#X8tAvpDbMBDxtNk}e z*dIG8V4N!adP(YyTz?i}f2HuN9%WPg`utRc{WpvKDIui&wfHH&$~_DTkLk}3|60-S z*PniPo+kW$_%9iw{U?JzEdRe8V*k7l`Wjwqy1M!*k8Lk zP-MgZOhA74-yflWMD+IuV)FmWufV+#`mYrIy8eLiPg|5<uCEP?zdfAf184Kk*?3ld)n6TjqAh!mk&#U!Sjv&_7uwjWh`%{m-~me)a#u z5&A2S4j7eQ#N_$)`GE-iU7}z0P(SAns654A75$n{RBn~%x8Jb&PU}y-?hk=_ue`jT zA^aBOy-)iN;rELFSW5W&7`eu&{R$lpz{S4;a=lXgze5Dm|Ll?}zxto{__`@#aLw&=UjuJI-nNobl&c055O}ekc3|4 zJ=-(9x_J?DPk;Jp2}ctD?p6kVDmapHkvr{sH;-`K0TjoYE}EPg>cKg?!O5NdmsOSt zY3l8d@T^oh`12(^>>l{pK_Ebc)$IwmdE{em_pP+#LSb9BlXBG+A2W~R;G0qdFTcja zV{u+D&a=mJ;;UQbjQJCi+|9TRdlq+Old)JbSu}0MiJZGQkm!zZ?|Q9q2@jGM6LGk9 zrIG9DNhiK~H;Dk!b37fL(>hl!;LvHr* zjKd0eOPZ6h6Y0gd_ME?q^qfC8R|Uc6Tp#}(T_eu}#F=^H&YCm@hv=mymCwd2?H9OV z4tHkXT%Pae&f)9JAFX%hfoB(v`g3x_{+Pm|&q6~59pc`+vvZg`OI`FCIWiF8vFyv) zHi3i#OHSbly2#!DE%b0qHWoXuXx#Z> zR3~#sRBVUOU1uXU)yH0`f5{#1N41w5mf8stez9CU2_oce@m9W3TL;@uWPZ76;M?&*B|)BtwvBbFLUuVpOdvyNB% zgF^4ik*183!}O-~*$8?Wx^ncqS9&3LZ3}h}H0^2=3CS~GPmtE)(w!q5OS=D{jiUF2 zDkJc!2z*WiUK@d@BJjote2KxQ$UQGja!>yz<(`+-a_{3^5qO`$gEBV&`VFpeLFh_@ zC*_`(&2sPSO$yF*f?<-p({LcppE|XZ7`i0|_qykFj+%ql>%% z37(-7g1mfMI&)_4WkV?aUdn+tVde|!Geme;>!4O*u3WB6L;SH^pwnv-=vE0V)th z+HN95H#xZE|Ciy8q%-qKaC4&YALii#t9aM$BIbYl)42y1c>KQpcD!d?)_V3|CjqVD z%tVD?9leK>5}G zw8z&?mMY1Ry0(P$3`3tkYV0Z{1=3ZXhrLG^Cw|_i{u{-9U0X_w&gZZ1Skczpfeyor z&XbaGqm5n7tUh(0$F6D_z~XA%wH9_yjt#tqp(OWlMMr27^>-md(8h*EXT%oZXI=G3 z|9jnY;+m0xk+Pg?&oBe2+s82t=1pyn%co*jzG+%kOvU?G+8I6O;D>a;9WN=V6*qxo z6z$77!R*D4Gc}pDKYFaAwC_*#VdwsG%!aK<-_l@yh;3auLiZPT-thbI<`9z-)lQbR z2b=IwJ*yn9PeFcl!t;qY-y6-JXjfQ7b4oxpyR)Me=lp1Am?xo?(9|^d;8Yx*>Q;Xa zj>(z57^lbZvus#95~6K4037BhIv`^tg47 zDN1z_Nb(Pk^!%v{;wiu^eQclG@Y1d>ZI?%{S{UQ>Z?*N$xhBEvhY97?@()haRq#~W zc8O}cl}mxD<$#W*`(^jB5KR4k`MX3EYCNlc|2eAdrfpxJ-hbA%o8R_QezjNi(^fjY zGWmvuUzejAJ^X4xN1J%HZca$}F&(NsT6Z#>7`A@+T`9tpULN!OiZ8;8F#W4Vpz5Ix z@+hC;D}d4e8qc_OZnIoRYrCugora~bxXb75gSq!kj^_6^fb**ipm?nA~hO2d$^H2k94F8$)60gn%Z`jn`!<+;^1>9 zr#8OWcj3y!?vWQ#iR15GnKaPfZt; zr#6mck64+gytDd|;j_y?a%U>{{Z!4J-M@zHvnJ!q6uyb=8F&UPyGK$F??}C657msk zkXSOZ>uUGiYU}2e?izdr8+dL?YG6ZoEZbQ9Q}V2wkvMwL`2xb7&mg$2BKXwjtcJAV zc~HFsXezfg^`83j?jOC7xTt3#w`dw70sPgo;q-Weu!efllhyjs16LEl7FVHH?J*MG}4y0Ev(HJ z^hZsi6zbqp{eJl}E-wT(@sJRx0B+l08rBUFcvkQ&xYD_J!1V_FCKK@7xA7c?-wvF5 zCrf6|$IU_jSl_QF-+W*iI zL3k?8V526U-4^=AqZ==aKbb^Gs;3gvjPZfT>cD|=q#5h{L=QXNLI97gb z6Z&nJC8FQYlWMqgMahC z_#fWA{rr47__tdBTo2@j6Xi4JJ$YrCx3r_9GQQgL3mfMhdv9B&%8mW;f>lOHvHt(kDw{Z zmwt0N?DQL5Hb}lq*Wr4znl0{GYjHc9E)+Fv!#wP9 z3g*45FBg#srqcjPj_U6(>qj>a(^a@xO=p`mYqIs`mND_?*G8k&xT+srPuH`Xa0#+S z(?`~{pd2%VJ~?J6Dauzr3cHJSwA#e2vS32*a;6p8{T0}W0a8B+KShhp>Lmn;BjzeN zXU@kN4x0MOn$xI?&inn?A5BJHqvHb=rPEJZtzoYbbo;FSUi)y`A9XsdR)50kHTa*3 zGiKd>v(f8}JXSxh*Pf!)dbZwxhzZpvjZf625Otbff5h(S6?Y z%VK#OLC1QRPqXMI`aWAn;mvXZL*e;m6K+Ju!4TOzKg~HD= zDni`Hr*Jxlp^G5l#pCoT9(ohNgr6%h+8&?hn;FpjBiu|^F!R+W)sN=UdJW?YSaETI z6sO5;2Mo`r>1>6T!;PMx!Oq#yaYK%L@hcn?zyt^i;khmoWU$ROktx|LOdiZgB2Zmuz<}OuPCg=-)2%Zyhx*x_7pbt55QqZ?F_3x>?U2VLXN# zu)u5lZKXjbW|#Q$goUG>53dTN-~`5#X09J*i?;zq7$B>`_~8R88M)j>hld~0mCVoy zn(}0x?ZC?F!+EiM8_=+St3IG(W0#DsLys$NFT)Yosc`g~Mi|VpMRc>lrOs`SEDV3z z6Jkq!{d}ivZ*bSan^}@7H{lViQPZ0UHo!N(<7NYQ6onfq*qwcYX27`%=3y~7$d&H4 zoG_%p>hXCK z{gG`#0tq`b1>sS+C8P@K^QR3O<1Gz-xHpR-cKXSU+kGFW`@{6{W>`<56eQ z8nqcrD?EvBNTilQ*rW4__-Du(47wHO<(IDLnf5Mw28WDFyRe6{2nN}6AY_kapg$gq zvrKonzGfY1uYLpj8Okq0!r2nMJYa{cULTgniN{n~ymXwoWA1KJD-9{^90e8>B>YEW zu}-yN=r9E>l{;;9ItL}-$%i`l7+MYVhp7D|n4ElQurupNK%#J!&yF1}ndT6kdfSGa zHlFPAJbJ3XZH;-Bc46md5%dv|{c0EnIS_K*CeWg{E!^N^fa9c8XPz3z75ug=6#-vj zBqTga4FJH}b-$lFcK4}C@2A$zJx%3ITbRyo(Whrd^}}yVsXu`)q5cFX70zM)0an_q z-AubPNA;hX)PH7G|5++$+QO{*&v)4zxgYv?Uf7@n(ja~MjWh`yEChG^Lo~hR4v^R> z`D;7OPx)RS6@yASe!E7%9VeVv@wglM57Whc6i!#G>B~Wn@Zf@Je1Vgg(~&pqbMJEK zFP~6KF`Hlx<29$nL=gw{FXE;zY(_w0`4Z0V!o_kEE@tz1Z2Tnm4tO=SJC~=p5Dr@_ zaqr3RGk#@71aQ~*lUt0v43KuTfh(<_c5M;9-|+JaZjF;mnEP#Dc_;ZoU&tF z-QKz_aZcreEmb=y|NaWP4SOx|2(sjF7-$S3%6dEn_g3H@Vfh%XR*Z=-V}q|wz|5ET zg)qzKO%cquXmvMVelL)12otc=!PY!IuOCFz#`ZoE9(}!jS=_jA$5z8$|8g-~%r>*> zeD=5KHhf%u1IN-ld|uo&bWb$bsnzUXf1ZlcGv60?Gq{^axwT@I=7zOuus zqv|VPC+x5>?c?Ku!%i{3V|E#eB!hYQv{@zbaS&sC52oNUY%E^n-?2{|)e=C!O&PV= z;qz*-!@8@*PDAo5trjiHh*Ep98z+FOj2XU!i+E}Kz!6=j%Sz}XmDLWU%W8*HJ5rIA zK)~U4+?merBA8_1_u1wld|E}{%;O44iYOSKZE)J|wMMN;qs{K>aHXRp9GtcXjlskV zCM?Q)@w&_pCJ>-8?y%Vc0-a~K^_p-1dz{l>U~$DhusEuBJS4c82YCpxi7VRZIKQ&@PL*y?QIM_EFs4hIhD5U94ulh+3U}n`xOssJ(jQ63NPWeu@#Kz*KrvE-gkt6Uzpq%7jK? zT1_CxEz>!~N3V+Xvc!)0fk5tI&%JA(?uRoOoI!~xq(y{J25>UKE8@!jepA%s+W z3Ynr&C%{W_wF__LY6mxPE!k7$o24+Y3nto;=*My%M(%5k@I)*1RSdu@^0Ia7_gVEK)2 zjYF5NcN%qK34*g{oPDb<$?4WR_TT4HY9VMkPN_9xg5Q%TA(+1k1E#O(XvJhVDgwAB z%o?%rd;nI5pW!Tmz(fEo$P{u&aW#Woh9e065W89c$1GzJ`S1hvkjVqA;M_FoOkE>+ zE)*y+3X@9fJ?S#4&O^u~-Tq>K^6f&`I>S8X(-iGijeV*&*9ekrY>u$8Q*^>ckV3*1ed?qwKxX3MU(BAOBkw~4>!jJg zLq2p7M7IdSk7;0n^=Z2~YPS8xkUeB>?EEGhbb`Q}1bx1z#rk*`0CP5#u5|c&4bz37 zXjZ)z-QFj)=KO#Kt>Mt``4b1sZ{Xa*HlsBDm<@;Cpxd1^?3ho}&CNr-wuV zE3OljQA2FOPgNUr%AjDKL|4WJiLSt@=o#-2Ng@NQlF^0{NkoI>B%JcOexR2E%>gcB z@iAEx-cj_aEul%;QDHLH&(|b#CRLe3gKm7P9K_MBj!9LHT=CvZCRRO|(!k1`G<4z1 z@8|h8A(6iXenAry3z7~+U05TCYUC5KjF1Ha80Ug6fDyzffDy7l0L`e_bYKB83Sohb z#b~Ax{=8GukPf_-Fy)v1z{!qYR=mY4VZeARij%{BV59i1wnC$l7!qTd%^%#LVsD{v z)E2Ek!ZRcOEE{p+XjeILeTrAH=3??;XBM~J+21Q?bm^9tu*iDLOCYM&#=Y_78I*3k z(eCTbG=fxX5JjrA=*AU87u^U_O>~M>Y0)j~j4r$dsG9gRG1&lPa^nv)j#ZbikI6b6 zMt@9iHglx_fO?>^Z5gOx$}J$@Hi?*qkYr{YHF`H2LDWumW@hPQot*{9%FvYL`4bL_ zTp;0L7d&e`br<1hs#7UT;E3NxEM`O_lIL zhFwwj-u#e}CC7=S`Q2%>V;Msth8ofrXBd~gZ4$z3WL|oU7&9+{C>A!5ak_*=Y=Z z%|wkJLlhGw&n1a@pm_`I4nNV9fx}PnIDDbKjGFKr^KcKS|^hRH) z7y75{s8fG{*VRw}s1Y#TJg?dLDZCJc`6FNcc>}-0B|rS?$b-aK*upR+=|T98oQ21{ z2soC#Lg6ELJg=bde_GLBrPlN1V1DqHS1IX7bI}69p);o;;SxU_G6MuQZPjBK&@==j#ytRcd{u_dkIb2anBImR%g^6> z#&c5fDZ^l`)4#^V}Y4U|a=u`~aRZ1l6ikM3SGwR81F;HDXG9(7w1{E9%#cKhmwKxZ- z_;LT#^P&Gy)9Z4`SrX;H_yo#(=Y?S;Wg7fkE9u%=4~`e0guEN zIQ1Zn$FPMi(}GHSw!^hxKU?QlB>(HwzsQpMi|0+oZEwKpwL83jT|*|;`=oXv=288n z+3oqG{%8y!kp-mNZ1p?cVH-dmEg-!{Yv7N@J}d>n;5I^!{w@4JMw5Q4-3LP7 zEQE%=(Wp7<_5kF;3^Ih*JDb6z*#t5fX0@bo)2AmKcw2=L;f;eiVqnMAVFi>G_jwO+ zlVQCihl)-pRNOMBm)LNrE>Bw2+${MNk~=G0ANZi$PkYOguH0TXR@h!Xr1#U_@}w)b z*Nqjnmz#_Iw6{Fz%I$Syh3!R)1YwZn^pn53B3dx0BjaS@J~b$&@hxq=`hp znS>?4OE&}02TOE*Jo2@4xSf$2@5AdQWo5Q>@;m(+v0wwF({ z=qCC;gDRE$Ds=UH19kHRN04yy40-gTJY5Hh6DhyB!dgXf&NT5nXQu;!v%Jure2iOb zcN|oEbmV*R0)PnCf%pS>;#qAq?vC;?b21}M#pN+~Cm3{TX_&0Fr!)j;cj6L!%CE2B zceuZRCYDtfaQ|~Ei#IH^xZwFcrb9y@GIyRiNp@xX)Rw`~Ibk^{Xm?FeRJPHDxy)_m;xLWm0D-aCvSu!_ zfeR^gZcx}kCE-FlVW*I4VfTeZ$>9-qqNWrQBc~Swh%t0;OGucDcKsMgufZ5 zK^7dxsX5Lpv5cl16AN4s3%jM!IM~687!dnCjROH!$O3!X zye-vP*x?FU2=%%!p&%`6%v0(z9oNSEZsq$#UX%HTH;YoR@PnDrdyiLv{b1x0f23GQ zn6{Zb3IOx*i&!(mwvkO1h+>z4{df#64bB?U2er3q*>70g7Qbr|Md|vc02rlGzEc88 zu#*O>gHyi+MSe{$=L%smK)JOi3uTlm3q%PgVfzpPQYhRhA-MQvk@u7k^R!sHGlH-9 zX5o8A@I5Q$d(QdhXv^{Z@!Uu~`AX5}KzOT?UilGA80-fiJyoRt>PUoH)NPynXs#L^ zf|1=g>Wu7gj*KV+sk5RWDP|AR^p@Wdq`vgWC#;#VyxGr{050CR<%szeT~OftdVJ+} z9N$*J<>V`r(p)gPU@T*G<8EAO)=a^^qtM2H9V|NlctvIFR*M#fJYj0`kdP*kNQ79b zW&{Bp%a?F=7cQ2YZ~@Pp$)U8L@oFhXXuJ1;8#NrTt$dR6J}xW`g?cS3#zg}%s9NLEN{E<(B`xqOr6lq(iV~{+YHi#Xe}WjD>cT2qHK?`;_9vkbv4UH z)-|=R8JcPfdzDWT++WEDV##8vd)U@Fv9)jBw8j=+>6L3OwUN^qQ;_Na))Z~3>-std zUanLtVGix}Mt3&q3E_cqbS;Q@d5wd9JNfLH2f;QRc)Z)Y5 zo`jSfM7XTX;GBJ%ZC+>xvxiA~*lw(txS(Kh&E-Jh?@{y=!c*1J>f4k%^36wBzCnqx zFrkpg_v~jknc-C+kXt#uc*##(u(;cjqr{Cug}sf&%n={6EU^n6g|bd%)wpqm;(5{v zU4|z)a!qVW1Ow-EKdDS=TYsg%*g#y5a+f&iyh9>ZFj5jydwB+B6s@;FELaY0umBdd z;tG9Gv8PFSiayr{8z9NRagg(gp>uS^G)|9HgZ2@g;a07K$dRmbAVFgt^1^zv^%Apv zZ^LggEtW9cT{OXQji^1FV5Q>MP9q!n#p~W;QtdUwcD;i`tNOF*2v-=xB|fp#h9gme z{9(Gdh4cm+BqrPHr5hl+A$K|vyA&5via{53p|d9rcT$-tFUZBe48PAd4^RR*`X-tt zu72E!Yt~qh7Qf1qn=NLW@EU#|r|aL>7ESW=2>byXWf`MD?DVlW-KnApf%+g2sz1Xj zSq0q*MNYIT6P#BWY^?`NW5@j?7evt^rKHdF3`(%z6-jKWzr@;}ebiD6XS}vi!R}z& z;X+Qp6_R_9h4@`arm%%%3)UC4K?!I9QE_mvn*;8>5QZZLjrSg=yJajjBK-~kKKq*! z;q`Y2Vt1g*i@4Q~>hEEzaq}=;#hEcpv2cq&zw(T7*W~SE%r3b)Ic7~9R&Xd%(w<;> z;9IEAD_lKUcdTx<p zFI1(bJ(2L2;Rx<8#FkMzcfKlRWm2QcXWLMURY#~fQHsKL>lUHrB!N$MPm+@Jr|BY? zJG_!P%#5m=P)gZaSMfocB=I&MsA+wf+(mYKKw0}661m1z1d5TieCq9^X`N<1{Y2{9(T zaeh5r&u+rI**v;_zN2MN1ELbVrBkC7L|kS~3xxurw^sR(X^rwlc1hYu-u&=GspiS> zlmyAGZ84UuVexlsKgR%iv*X`p+AM$lTih@=89#_PHLS98;t%@%u-AwBI5n*#&RHw) z#{Ci0cl@^bJ@chI4%&_8guzhNzP#_Wy>V+Y8MDSGzuQe}-iVSvABKU~>cgAr!0K+k zoNlt;p}bD3Gx6DE+#Owf%E0PQvUe!t-jS+jA`_|&?n*N`m!M@DMM-X09Q z-M-f!GhQ|mJsS1e^-H}LhsR|x`ViSRn2b9^C~X9Ff|3c(%M#V_N&4@&bpkEHEX*Pg z*<>{74hFprAp1?IR|MTtYfd-Q0HJHJ>t91ydcAg5KR?bOL#1ixg2~96cs9;A(**=h z)N4zqQX~b?$3?RV=4#aJjC&Is4KDqvUb|gJ>w1loTR-#2$Y!~5ik6MPI0PXRP8~_H5uJv<;;BM;hb@M zoRpzNamILVdQcE;Do{YItyf_5hASU3ZI)lsV9{7`rv_)kLt|vOR%fwoP0zwv+n)v0 zm5}|K(S-PX8aJUt`xBfp&E|ourj=dFQP9X!Q`=6BO**U4qy(o-lX#4*y-8;UO*%6* z>CD)q^HNQcn}ClAmRq9|G~2jL0IUs5AoQjszs@v{|2|pn^zE(K)~lT0N*A|nv1`E| z-ubGI!?q8t2)>_>1#S>Q6YxjLPp1|=<9?(^B0N<-qRzCXA zL0foMf-KGrR9%S`oelbZbqxiN8IB6K5W+$o2)B^UZHZX#@xlQ7K(aT zSE;Fu(Awut?&cu^HQU7M^7qMH#JZU;*Er%!7+PuDG1v%)sAHr`Y@pm$0%dZET{}Mn zfjKC>qQrOYGDtv=8Y@Xnk!nkM?qOQrM(dl^OgN&*5y5YnMF&+X)QG)=45L3b(E^Xf zYqocOv&ZY_lH+QKW>|40ipxGcf>$1&sY?;wAy|RC<$F0&D3WkVKA{o6oAOMG5_2Ub zu#TeNmv?vN`Saetds;#bHPt^0kuW_W8dAp3r6w^7W~Gczv2jN%tX^pLOH;;mJ4O=z zU&@Voip4;iVGp-6>zBn%d43%n;?EWPm*XyOD~}Jv|Nb!Du*^OmjX4fL{vBOe^sEa< zXs=_fIn|9WGVnsBVlPe3c;t;9{w<7*lPsZs5ogfqXC?MqfkXfF{GEcF(KN@-{0eUzMjZ+x%I^%cYMc43Kyvz;1-K;hcCxJzJ@h{P8b_Z3)R`<{NJ`m4G!G}PbjD3~< zx#ZTv$^XwKOf3{#dVIPVh=aBD(j&QIaN>X)TUpA$N;`#7E(TogY~=CwgO#!bNWAh+ zB7gAWQ8+6Q0 zhpc|S-pr@^$L3_<_lJG(8{ks`#tM3mwBZd(g(I1)H zfxomHtyaf}jB&U?6cpZT%we#?ivxq8GX&T7d%R^_E}!^c_~|9X&Fislqu=TTeTAJL z)Xz_j?~t?MuSYQ8uvbuRfIjF?y4^w0W1nDG96^&d56gQ<9(#a$fnd3Mgxe1dqt7~C z&d(1@Nz!d^0Y%UZp^`HFf{qh+!T(4n&rZoBt zUUX=T`we(t!rYM0)74_OxX1g6Mg1@0`IrPBbT|mw-OeNkitypK=F{&pc+>&L>>?o$ zG?)jAV52)|vbdcv=93$h8Z?IZUqWZZI^#)u)WQx?TbdcKW7h0W{B{6GD$a$^y;^RP zjake0+nu00%xhK--{gkI$!77h0Iu@N1&tG;)BQ|=8RTb@%$-KtYLhd7`sIfUC*_VI zG1Nt-R2-Xx#~X`hB#0#$T3cnm-f-cNy)j6{b843ry9#S-3ndqL(oPoB~!Hv2vy z7V$pB39-)g00VM9W$CcXoQL4B3RgY*JT5y5uxE{+LnP71^^ewvg8=*2M@U$#cks{? zS}@p%L6~><==fBLxh@wl$;|)`FuY^nt`Sj~;(~FqGRjeKIol7HvpAL#xD5Bx7EU&8 z3;gFk+QP}kTr!2*&2@GC=k;d!7{~Opa5DI6^o!tqz{%;^Io{HxcKp&6T^M`uCoe+m zjF~VlEH>**QVLVLwmF6XCYpjnqnc-cjlwAzf4^WpgpcFzJT(h6jyl#zHH%0!ok_Kd zNVS|v1x2I+XHxAVQf+5aogz~BT8^9AyG5kB&ZLG#q=wFz7RwE?01!0Fx~<8(~55@rTE_AMuqPrsf|nY-G1_ zxYzme`TPoBp1**nbl5RplG0PO)4^;6H=W*cIX~qjjvyrqqI7}xJ??qA{9>PRlUQCz z2Rbg0s=@{=*Z0^OaYb7f3JEn4;7u#5_2-(|u?)vnZroeXojl-!mpPdS9+j~x-?kj4 zu6#If{umLlJ0OjMR}oJ#F~Sd4t;(}5x{J>`5Y9dJn`3r@G25zN_^ju3CqsYWGuYng zU;2Yqr_pV(r}>Na;k?xu4Z1;N$eyz}=dIDuYd0nhhG~ErR?Q3g{Yl?%v-JZ+a_HaM z-f-OSH-TavuRjXBkw5M*5z?;;|K1z*{6@FkW4FuaYY0x)K6X1nt22O$+~+*U54~oi zHyT4QKRkShzH;!nEB^Jr_zh4?8*I#ztk;_X0B_N_*$0REsKwyPU%a(~KzY-}f#wv!|`x3?DR%?P`zt` z>ZmhnfkSwh2mK>UbsUWSUMo9WcK&9*u^6 zFAseWPslBF;sNXV<8fzXXybJL^q^m@c>x;+<7RU_Zs&;`!N*;{(SVt&fXiMq$kJwz z)Z@We9>tvl_gR~HWa*za8+6<4-f+@qBg`d%CuL>}ydQzdT(4m@!)%X2(hfWYF&=dw z7jE#iUVB>3U+yu91*6nCUiQMw2X%J)U?lu5dtR)cpLqNk@PPbN+>Y=R7{O|@tk-7A zjS5(}Za)}$4d8`WL&=ho-jl_5Tzq2y0s}te+QpZ9a6{K>_IiW+5Ak2aX#HSq^vDdNop6mrtUVEH z*U#N6SyAFkjAR~VJeK17SpojJ^*i4uCBzNqiYpaWMrMYVQpv9Vk?qe?upMmhLdvcz z;|j*@IH+B?-R$*X54Z&v9vVCcK(pXHWshNZZLReA$iVenamNF;EiU7jjw0(#PcjOV z0BkIT4*8y7RVzE;P^;)vbJd(UGHQ2Bid@>U+dZb*F_PI;M%laEmCT(A&N~%;!`#gr)e-x+ncFu%@I|k9C^OFo0AGzZ zygos(Ak;>w3wdx|jG!(=e7$4$aqz*r*PE_l-g~~(QG!&(_(T^~hi|UzvZ3#XkEO%A zIm&c)4R0o}ggMqUH`IiYU*c!8Kg}ND?RZ(~9IS=zrdKvG+@?tTQiJIj4 zL%>4PTyPU%uG$Y2K%9nY0U)`j^g5YOtV1G7Zk?cc&}E>;#M^~O+*c$L1mRpg6cNq( z_TVclQ=iWREc6n7!c0Q{;d$}9yu|UiZL6zv;J{mf4j=gPh2Lo9B2jm-iS7Z^Dib(i zH~>$7q@}Xcisf2|Tvg1jC7yvI)dBS#1-P9p2T!R>VM+Qa@feySpVD5>?!j$Gl7`(# zN?pQ(|HIOeTz2`6Jv3FqQ^ElKoIJ2cCmF<-YGU`AyP>YOY3+PIH*|I)2i*KXy-?dt zV;pAiqa}hn#rX157YX)iVncSpT6(}uc1~B*UY7m|16_eW<4f67MJ{nVs2>SsUBy1W z(eyDkA&J(t~tkR84EQ zy}?K%*u;&_U&1V{g~%Wx%J*B74u~3GUmW=!6lzQEB^O{b@csraaOO+M^*K*&G@2de zkGhRv5ALY&N<`xit&C(n15**Rwyldy_ZT+Vyn{U!Au~^6|2p~k%*IAwpW8n3K^0TZ znlc>Q3S#V9Pkv?flg0#NH>u{VOh0OK)ZJH^^STif_u+KgGrPy>J=EW1iIy|N;pDGy z6$r`Vx@RsEJ6F{+*A;7ThIl5Lt}5}NkvRCkv~f_Cde}3Q&n(cD$@dlV^2{mYwZa>I zuCa9(FGy0!PpbRC&Y%KKYq7znki+T~ec(!Ce%ek_EP?axU&==c+F*k-=A895m>M#C=DMr9-I_ostKuj!A27W;Ie zeK;HXjpkt32pE(n$$Xhix*f06V<3^|mVj_K{!m&BdWDG^aSgp}kx%7m zGoT*(Ff;Tz&^i3o7&}NJVA@@P#GlJJ0;hr-C~ z?%NX)9|J7q(0G9Rzqi2w0o8V^{euPvEHG8yWGXd?GGnrYp};iW9SmQ&*vJ8yJhJ6H zrul5zfh0ejy^6az87YUcTU_7ZUPSx#!$!;CdilJ#MFVZyZpi8L6RbU08FdHqh~6iN z9o+@g@Rk|qgzk=xu3+hg^_qY=%nn)@C%oZ>r*yNA)g5}ci$q@gh!ZNlgc^dg%?vI+ z{|4_^8*6&#qgE}<0s{f7tN=iI>aatrrkmI7u!Bm%g(W)d6eP3KH91_0oakIt-*mA; zROkYQsG!vpqEe`;kZc7Az47X3fJyj`hf8PXp$Y@oWrqsSzsOk&m8e*fX+bqrSOisJ z2tidawF}LHYS1|6;I6^z72P$wHhU)P7g!Xh`aTH7sbE>f(G1kyCK#w-SvYqLcox2}KavBdjZ^ z=ER;rO#yfg(Z^!Q+J{rW0e4G58$wUcGdQQ6PNOyK!Ch7TH2bMPX?m0Xqz#4w-~H1` z4j~T5Yxki%a^}mK7YsZPf?ZfPh58JlfqbalFks)ZDfVZr?xY2`TpsH~K##`hENJ(d z%|RD9L9TMc zd@&NTiPswD2Y7?B(`j}CHk;3%AL}(;{U0FK30{mG4%y>oKA&A@B>FJ)`psZG3D_d~ z4iK5o5HL09w6Ioghc)K2>AHUM8D7Y_TP-tnIJ_wga|@m$B#-9doX4)xBcB z=x#M(&cN4~Vs*m-U&?N6!5_hM?CnJ3q*0`LMNu5HYa-zhvW!pK5&Nwql0^ zAt`!sf%h*z*(I-Vi`r{qY`L&ha(lDqvg%BnY;>Dg1p*I zqEpS}RX9N&LYID`6BM?JN4|2jRshWRnijvkh1Hkcej42Eg?xB=%=b0zL!31%WfDr6LLF4`SP-z|F`OapPR& zruUup&5vIo*p<8gG{0irhsz>y9BjKUdY$~VLyt>e%b*eJ~8BcUhw{SxZ!<+ahFzn z=rW$!K*5L(1WlxyClb8omdZfUfNwH$foweQS5;M(JO^&NpaCK!gbrreLGFmUi@Oxp zkew;K7#!hJ?$I?#+wYq}^gsbT+?$ zR&^E{BMFmq631)=C!u$&0q59XO1MJ~guMi%Q;kzcq5ONv1cqYj$zV)kJ@c7XB$Zrx z1J8W%D2sC$j^MUUOfl`+=~bEAOm~+*wSa1^D~8s!#!jWMlTLF`bJi3TXP=PW&3g^_ zzZru)9HNUgpBXo>8t?wdR$2;i5mjZ`EtSqvESH=YVy7CXTe)PnIFWuE@_S4PDDDAm z=yNmVk`P1EJ?QXru+=}uk_hvF&-E>g54E@v{p_H^WVthDE2*O)KJ*oY`=}^C@)&}Z zEq1@|;!6sdyn404!jfi_5_C1hg$$u$KoVJRgV2t@HXwBX;Nc6(HhWfBes~4<;T+z! zD*4K~Ug_yzu8F2lDnz`77)`yw@ppr7WHIf652eGNi9a3lp2C+--~=ok9Pmn^^sC%~ zizJ#p+B6_kips<%z93$k%W#YjoC|+QCUllV#*a;wVUgwsKp40{6waIL=R2El+MsA+ z4m-DlR#J3RU8v>L?9@T8kG1_e8h{2iXL3;~+OYPT1_O^RLgFEG0mcN#E~GV= zlV#0mR7L-o`e;%UVaWzLgEneiWvw{gcnkAR@X^7fcRy9 zJb<(c$m;l@WD4*{UYn3UG#m`zfmKL0QIkQ=gYl?09Q9iGMSs`vyc0}Xy>WooW^^IBjIV1=1%nT*ZL7J?Dv+c9}JgM!Nmo~Wg83APZf+JbJUC%fM= z=Pjl-E27QhX5p-+Hv{-lyl^R(Pp5Gv6NyyBstU7`s-!E0noUg#h*d)p<^+raT$HrX zHk471$ezk$SJe?suacs&ByHNt!dX=&08gtZDnZ&#KN&JxsO6N_#%X~P&Z;OOLE26U z88TZa;fz+oS%DHD54p^gk=wzK30hS(SO`^8L_*7^iUh!_3=Wa(D)g8IS#dV`x}!wL zA9c(-%$@Sq*^h7P!TXd~bqk66%$(Z~eqp^?#2pr#rg5hmR?cyJEd!x!rXwY{aBoQU zp#Q5>;v+@*&_M`gQvN8p^BUPA8sg9byTX&C_OOxoA3t8=)(46D4n#P8q&X6P8OU{WX+& zF}r=)&G6+LwDfEQfts7?;wI9ML1$MfMErb)F&$H09m?IJObWbth;Dul!Dr21^kyn4 zE&LfS8u=@+aM}v-@pC4g<=#QOc$s|6*D`<-&#qfCqP~QbGKt(gn)fS(bjoE+>OyY4 z8B*;!(TJ`27#o?!&ntr-H#w$M*c4b-L7{$?ChoF_Z1QZaszQ0U<`8#AnOwTpG^cl- z@<=sK9IdoJd7{D(kJhY^5J|Q3&?mdMPQ2wWv*7s*qMr1WMa5gHt?&CvSv&+k{tzd# zIhl9WvL!s)2(RRR-+F5Y6(JiUy6WkAdh`3;l$R9~-u|kmos=eCl-sv)cz3D4?o<@h z#up7tv_t)NAD@;h2nAs9k|q9b{Ir=Z7i;`a9BppAx7;(9kOlX(Q@b*7PrF}bI0|rB zja>g|jW`H!7>%r>=y!NfawjvIuR3>6%Qd?Uhu3gW+d$YRK9Cjm#AHWi_&L7V+h(d; znO&Wo!jma56*sHdYo_{cuo>HlQ^n@l+t+pDr+yr>^|H4XkHBXR4$xdoj-tQ$9&kc171;nhd6`eIzz zxVd?Le4fLI3ZEDJz#iRVu5l;q!;U?G-@&6uAE8#|auq@EYwLOr@y)z>t??b&_-2tvzFwg6{lv8lFWQgQcktp)2Q7O+ zma7?s=Go5kY!f`&W}aCTnx{6NgwVuj@^Yiej6(C&#*!eA9Tci=b0f)&Li5zdksy#A z5Gv2yC^Dl+p6m7Oei5#wi~9)YC>G6@k45-efSNBxs`wKoC9l@%A79=rSKp_r+b}M< z6KjAOA&wU)Uo!xxfn1Mj2)bds7Cn(={l=3~f_}8M=%z%oO&f3}RnyP=*=WrVKN58D*F$>`fV6Fdyks z3>kmv8OWdvGqg<^X6Q1?FjG)v-05mU9H|V-FhkpvVTLZF3^RqjDT6ow8kAv%wkg95 zT}ByZ3fn5a8u@Uums1L)%(w zhAz`uGllA{E!;q9tu;g2T5Ea8u@A!)5OL)%(whAz`uGllA{E!+ZWtu;g2 zT5Ea8u@<7lllL)%(whAz`uGX-O7t<`>=+`Osh5`1bRP%-xmXGualZ%Puw zy^r>+q8lxch1b@0f)*PF?Wk4Ni_h}61euDk@hzTc7(SWj_JV~|OX9liNQ<`+q;_FBRDBA>o~9q zs(U(8iH9dn7P--vX4YI-wj|lNQBREe*tR7j@Zctw_rAH#tYb&-Z4_QWc|Td16H7xn ziGyzg)Q_qG zX7rfi6*`nMe9Z90dQAmX&K`98_35M-x0STe=5b6sgCj%bViXR(`7y0+ZKolx6wH<`(9a?k+44 zR8gCm(gD?GUf>+mMj+bMW=5%^HZ!FIs?EG!JE)C7w5iREQblcMN(WS%dHdm@HUiP6 zHZw{UwV5d$P;KVjl!Mv`M4Q^oC{@&ErgT8HnKy?HY9kPBYBQr$QJb04F4cA$-A$k8 z8+fjEJ`Wed!KFRWnZEbH-)mMjx)w0GGvY#uovj5>Y-L%T>Szxlx8SE+Fqg3L%Z0jK zH8k64+n3RS6OL_|nD@lVFe%iF8*?#O97Fy}D2dqQS(QZK*py^OsiGt^rOaH~@kk=J zbXFx1I5s7jQK~4(OliMLA~tYVB@s9_C7DsGD9KD|ze*yuYgQ!@I5s7jQK~4(OliML zA~t7MB@s9_C7DsGD9KD|ze*yuVpb&)I5s7jQK~4(OliMLA~s%DB@s9_C7DsGD9KD| zYb8BGHKn|NwA@Vz>{FCoqZ4j^59x$f!a3?hFWq5o zsLf32fNCQ)&$QYIM4Q^oC{@&ErgT8H5!-26Z3LoCZDy1zYBN(hpxTHHHmx=S(WW*t zN)@%4DIHL4#Fm>@8-Zw3n;E5w+RT&=s5W8~POFVTw5iREQblcMN?WOIdV9-!7Vi!H z*~xm|Js-A4a$WU1a{>a??ElPS`fCKI5$Z!&dK z*|NzL=}eOe(A_tgI%RCxWQugA$pq-`n@pV$wrny*I@4qVboWiBcK2I0nIfHOG6A~# zCR01}Et^b{&NP_--F=g(UG%(Jm>mq`OH<5g;WsBibb;R$@0vDFURV zW<wYk%tRbBT9dp`H+WbUw~5Y( zWp-m`X_)giMrOP^ZV>gRIWo!4N!%(rqUPsRiCM`LoqdCXN=!;l!!#{R%t=neG%HI? zNlwEwDND>qPQx@OyI^hG|ygtx$Xcf@RB< z3zD>z1duku3Ao%*iAzKw-eX%^Lx5Xa zLtv1tG2<1q#=H-=wuS(=w1&VSTVuv6XpMQVZfy+#ZfOmHLAJ(>SI`>se%{&|0^HIX z0)uRg8LyxlYX}UoHD{xyCR6zWO^xIfFp4}jcT z#|~5!=jwpsv`T76#x(3pI}YM#+S#)>K}qe%IE#I0$3YxTJ9`$VT~a$T_G4e#aS%t- z&Ys2Tl+=!lN7{*;)N$tqEoqcJ?K^#pxdlqL@ zQadu1XkXfK5J%I_p2dM?I@EP5wtf4Y*eq=a zn>LH0`7<=j(p#^fS!QpJWy{@A`}inOK(v$57aEPw`IHDqGjWtm$CY1S&5-um#zCi0)xo8@DCuMcm?AN!ZV^d=HsWW~>He_R^^ z0~%l8H4E6TUr*Pwn{Wm}q|x-zmZm1|U=aaFbocRTx!OQV9F)FQIiF%MPeKwX&KCDJ ziU5{|ZZy&Fey+U*a16B1#qBrUa$A8l>%-zZY`ez$2eiJWYCkP@_Y3rU>r&JGf!nU} z{sH|S{IdNX{L=m2{$=~U{Y&?I=a=pG&M)2X-CwrfyT5e54}aNyAO6z)KKf<*ee^5$ zdxQP52Y76{cAEONPI3+Q%O2se>A!T(|FVbp2K%K?@eTIN9^Qyt6v zVhyt83>i2>ww)n6&X8Sa$e}aj$QiO|fQSxv)p<(I+^1EkQ7H=LWurpq%TuF5yvtLg zLXgW-qe5iMQ=>vSX=);V5{(u_JJO~LhEOKvkq;U^*G07;nB{_=Ab0(I=N><4pheop z6dt2C6+0ubh+%HBP7;e4&IA@QYzZu4coJB|FeI>u;YMH)!-~Litl6avCr6xYF{SJp zBYQD5cEmES@pr<|%4-y|CI+B|HGxr%H8F}UtO<;Atcj^$VNGC^V@=E_3u^+S9BX1y zT38bp(Oca+sjyI=tMQV=u`8)=Ow16`$ zmOrIu4a(;vzF^_DILP7FB{I5D(L;BK{P^$vA1_p%eyQ-J6}%iEK9}wA-_#5e!Rk{vJN(qf$Fp- zXuaWtp{?B_FOQr^CoJsq)*VtZuOZU=s!K*pbBoRh47<+ENTklpD135kC0RyiW;Tgr z;Rkj9q51>gdkpqQ`ghd}X!@@D{!HIhkDuwg>gO|kSG{|t@2XGF^j-DjnZCQtoYY3q zG|Z~!J*@2EXd1-2<4l8CjGSo@E0i-0w+$Dq4`S(amV;OijWo93XT@!@EOqf`>oODr z3y)7)jnTlL3?}TQegsDhGz9$jL2uab#*;DoL;rnyFll#& zogw?1{`*0{*&2450bA?8A9h;JX0y{^-}K*)hwX8@F=(=9{r8ig69nGGXB+MJr@fBf z3B198Ep*1G{lN2pLys+VNlypEM!(^Ax@@60?JQ_C8skZC$X3y<#^kKinhZu0c^xNLp>-E@dv4Jj76m{Mlj{;EQkj>#zPX9Fa+LOTZN9-E*z51ug*dI?C(9AnX zuGc=*ym5Q%4}yR_=a|*nUaQsX4}EsOilT*%*X|Bm6R+o?jAy6%H+X}y-|03+Y&w5> znCjogz1FDR@EUBozM0MRZxeqwZcGM9^5nht>3wI=@A!e=W#6Dcd!+0BeQz`ZjrIGy z4Oz@dzuE6Jh7JBPBk6~BuRUt@f+o9JK0ZbZU85g5{-8JN`YjgCqx{!_KbXL9>$AK0 za+=k_hq3REJum2pukX*b=KR(gdLwT%7_lc=XIJ~|d933%g2}{(CN0*_PrOLMZN0XE z(~J%Yb$J`(?s(Gav+LPnx_Sw(XZK;WxSdV)4)dVwY2XFzNqZ1O&S#s=JhA`>lVPVl z^al)2Q1#kkxvAGuNzUpuU5*ax!#wSFx;=KON(?$(y_f{=uu&&yjQU^;G=$%ym+#9J zw6&h&(PNXg-=0ihKx!yBe`n3sa>(7&Qi9!PJ2VZ{mTe zSkIQA9X@Ti%(p4xfcb-dcQBrK`es zCjDMx?Du;vqCO`an=Ll<`mnyhvSaC&@nR0MOxniU?F_8dI>qlXm;v41sMTekr>g~y z0q~I2Yhr4neiJiP`-WbVdODz6kloS;8`JW7?BW5w;3&e06D@9*&kLxX0&}M}TL9h+ z{&JUaZ8uq~-ROI&mx#ox6vIuNq$>DR#-xz)K&|Yg6=?5u(}Qo zneX@7Ub{PDx3jxDm_=cBc^$Ftpg$US{B{D8TNp>IKk$ZL&~M6hC7kh2R9QiY0T6r6g_qu|u@9tEeK`zW}w=RY@EZs$NZT5jh- zH(GAzLN{7&=R-GIZs$ZdT5jh>H(GAz#yqX<&yQJ}mUCnl%zB>80_M(@8Gw(+bu8Q^ z7lfA!$6&?OQNn)1BP2n_ZH^R@aho26WZY&(AsM$xQAoyZJ`|F1n+kXi<;gPt?joA*>PssGiSl91||!bvoZnzT z(LU!*iuO5gNwm*-1EPJ-+YRk=-dt#(^HxIpoHq{I=V~^=LZXZ*u#hNY0W2iSOneK8 zGV|R+qRce6kSH^|EhNfJY9O(zxqM1a;nRYdduo}mXY_>CKIbQ__BlUcwa@tpt9{N- zSnYFu!fK!M6IT12pRn5JY7^E%qRfP~kSH@@EhNfJSPO|V6V^ha%!IX&C^KO#B+5)! zAhD|ndqz&!vw{hGW|^>XMQdJRWiZ4?4M3f;MgVov8UfU4YXndyt`R_;x<&wX@)`lu z>1zZiJAn&`xJ}^#B5sqofQZ{PE+FDIkqd~pP2~b2Zj-ryh}(2lh-^Qh6JnMroqV@W z>I5P;t@)Sa0-j~^p)od9B?_-J;LTd-J-@&?ULHM(p$7Pka3q3PbtGbF*^!8$WJe-; z-Ht@`aux~i?-$G42ow@tKnzd_VKPr4cTJ+JKD>a~{&2IJ&Nhxg`#&<2S9T^Gln4GVwyynh!6H-$&tewVEmukVx9Z!TJSm z#Qm^;f)V7QnF6uo#1vXIg#sghG6Xb*0*inY+BAg%^MDjOG=&0NffR-`g#yEY6u=%* zeF6Q=pWTV~SxQ(en3MF%gMd?KaNK_cI4#dXQc_|m-Ix^!9BYnF0nwCMA)h)C*^M17 zv(pw*lh_F(@#4qA7Ga%2rU^ATQ+&c?SmY!y2szDI?s5`_$s#9#LC9&wa+i}Ze-=3j z3_?ybmb;vUk+sN4U=VVevE1b(P7D?~2@FC`GnTuY#FAr?lfWS4G-J8TNi1v@ISC9x zPBT_2XA`Pot(MB}2e=pCfmuW(c22s8xOx`wIb}QpF(d>u+p=xb&bV#Y1T^z;5YTMI zC;32La92ixQB)AOtjHIS6PrTa+e&Euo=&+m2U;;9uZ+D_dL{P^2iLBji+ zqC(x#r+XT>q5{lj`%^n;_A|iR(Po;=#6O)Y5VjgPCqJ*irI~m*Qb(}6ZVW7AH*%ZGbZ}ZkmX^jK#Rz=?CT~#^W zkS)BqWek=j?xuCtxp~7>j(58vZ}VQL9PhZwP1$yvcM;`y4=c9Yyg?|(dsLA(;ZD@f zS_GWrTu$C%dS!di&E=>y$_=Gb`$~~6-BdSMrQTLIoNA3NMZ0Wkiw^93;Aw4j!bo=P zqR9^S+>NZ52h|%%tUQ)R5*XVwk|MipBZ(!>(ntbhn?_P(w{0Y`mRcG~U~JP!itM(H zBo=K;BMFRc8cC7ewvlEh2&ZakB!RI_BPp`mHj>x^SsF=TY|}`J?6!?0_F9%k5*XVw zk|L`$a z$UzKviyQ>T7IF}?#v%uSv4tGO)U(JzU~C}=F@G&`5Exs?K^Osx90Z10j<+Qk)#UX~S z6^9shRve=1tT=?)tvJM8iPpIUoNAS=eBACVG?s2CZrt525p?!$I8OY5aPipIxI1Aa zlgX;~lngOJEQ|?^GK`5?W?@WVlwnLvRSRPRqYPtWzFQa*7-bj}>x_jlfl-DrVXZ8T z35+s~36p1GOkm^~r)gK+#dGG0S6f)pz&q>QeRkdR7cg_N-n5)x9TtdKHtK|(@mloe9O z8AwQ(5~?U9ZBgNBBxw+EgdAlS9?8fJh2mLewTYR!;SgM5jufv;Vuh1Di!d+<-`c?` zGPSm-!@3B=ksY<7nAw>z9NAIph?$)k!;u}edYIXnF&x=ZYlfMf8N-nswNjYbnK2yM zQR{=5of#u$2UY6BXDF&Yy|q7|29GE~3Osl;V7QA?08TH(<2-XAe<{i1`{;tacuUy* zEkxdM&Tbw}SFp6jmPdc09IMjuvf4K}FtyAF0j3uFAi&g;9|V|M_=5mb%YP7HY7r0u zOf3aMfTfm=xII+zdYwp7W;Lzm=0wVD0L4HkNy=>8Dv>f9u1ciLMyV1hv%#rE%4|#u zN%6`HKYvmOZZb3jB6lZ_{$ZF?=^oJ$M?JqQ?3W9Sim;hE4|nWWveL;7ylSEY>&C7C zST}hEz`Efp0M^Z40kCca3xIV~SOBaW!~)>*X3?3Tt8sKD=xQRJ3A!3eXM(Qg(wU&E z(R3#0YC4?>x*AZO;PMG?7H!iVj8fR=nY%YxKz*tcfci8i0QD(O0P5450Mw^80jN)F z0#KjQ1Yr5;>_p6UDmxK#oyJbYT&J)TG1uwqM9g*SIuUc7wob%cr))~>HVMWn4I~k5NAAT6r^j;jY6Eaq*0JAJ2wh(_K`+G zy7Js8#5qJ71?l2*qkuauOL4p09u8m$aN(hHoX~a8L_Gu)XGkZVMeSf2DK+3#V{jQ6@%JMkYbn-jbfx;2IX!I_XehwJq1>- z*AUpWh^N5H4I2WR*6S2lxnx6N)6$#*EB9;&Y+8j=;2kbb2JP>VdO=6ItysD-cf&EP zD~kHu)}{%OK!aNXln2(J5`3c+>nQz3Y2B`8a%-f5K}NtwEe zB+Z6NjL3>4&6Z~?l4jGg6-l%0*ovgtIBZ4IJo^cff39+3xLM$j&5C00GkCas3YC_` z-6NK^hX>4AvaMUs9-roM%_aEl({#3CNAPI+=kqIkARS*$x5q_jjw^ZcKTSEo)AZ|2 z_yZ*1R{_xOKU0~ww|+fk7~ygsZNl4VeY2W9ZDz}beQ@Fu&L_eaAvL%GK!(vDn`p5H zcI(6Ndz{|SZVtohX|;TcR-2b_F@4O0&wkxne^+PcqM|M;G2w(2-t<6S;s#+6%Dvp0xJrz-78YRhrq2Rw-tt+1%^N-ouz9;@0XA>;EWqZio(0&v(X#+o z-{ut(EW61oBv^KfS4gnz2CtA{+3j5+!LpmXLV{(tc7+7XZtS>0Lt7Kh7I#a={t64i zq~$fys6RcgAE4ai&F_RMfa^>IP~8lWpt=ztL3I;Ag6al<1l6ZM393(i614o( zcO>UJ@g2#zPJ2gku9M!8oa>Z#B zAWxBiLImyxe{AR7jh-G zk_kEbZcv@hSxEbA&O+KJa~9G*m$Q)eshowh&*UtmeIjQe?ejPbx!p9jQ>!wI?bNDF zVmq}ebJ$L;$`rO!t1^S_)T&HiJGCnF7jC@h^*HRSPGzS9Pbl|1>m2dyoZl(&teMy; z@vLRpDeyUB!K%;v?l@FSFariAWy<0{dV;e#HN*A?EqnvUGXG&HyhI(E7cLIicrL=#tLPm z%+QWyG_!J$k+M`fmeI`0K}O1$?N~-LD+d`Vd$(g5&8!?`q)g(DWi+#Lkdd;QJC@PR z%0WiTu3P!`sTz{nmYz7%3)&j-aA*-d{jMs_D(jFH`* z7h`1i+{GB#jdU?a(Q=ZH5=B=JKlc%RmQpn@0NYYEo9u0=nvLwXRLy2_TdHP5wk=h& z>DiX5*;r6i!SxX??+C*Y2c==kLNTOpVwzxe<3dr*L)xk828g1XhqP1GjTA*S4{4{W z8#0P&9@0)#H+B@&JfxkfZV)M|c}P1|-Dpx&^N@C`sR=Bb!(key)u_2h=W3uSy`<8W zq2?l;tD$$3t_(F7>0B2KH|feybCJ$<;c=6$3^f<&To*7m>B>-Zk_Mz&sSwh%*G<~#H1QoeAa-*6fonOp%MmoQu z?~HVQS>GAy{Mx=V()k5`XQcD1{LV<{m-?NNPFKq^JA*y2FSA(hfqj|Pcn|E$EVp}L zUuHes1N$-y<{sFWSrPZZzRZ%hC3|^8;L{fnPOBLN+WGp5w!7;GR{@HQSK?L z%IJ_z%JLGLSrtl1*`*yzXl7L?A!WLDETNfIp@fum+p&aZR)rE$25`p`npqV}NZH68 zOK4_QC?RD=cPycqRVpEt_!nu-XeVZid-`|)W-KiO)J&ey!GyRiGNex#rpE#2L>M8< z_4A$WoU&IzzE7VBA1aU8j8-csQz9^atJjZnzr_j|kbmc09iKqn-Rb!|AkjEA;lB$nx|R?4(#xEk zpMAJHhJW6L;UABW4F7t3e8+z!{;vP|u3kTipis*6CK5@*O)xa_>4Rp*riljdKY87@ zqa*lN6SHONN3%6low{E{w+yE9Fj%f0ryG5z{FUb^dOUxqegxSfd}DbP*P9z*jRybW zdGWgiKS!-n;19_Uv@f>hseItm(iT8yMJ2vr|MR&_B@91dKyaq1oHbOb@s`W^DKAZP zblhO99W6jX_Y8*xsQH+9*{vxDSkgay4XYoAz=>2z?eFpEk$+$!HYd5Ud{oYW%@# zvT=Ld^d{{V`#fDOU|Ug#Nq=D6pzo2l=zUJGXP2>#?_TL{)j}qHQ@S9HW>AWdCe!7O1Gd` zak>!)iqfZvMguz@D29E$@~V%pr5v>-D}IA*%O~CnsBc*W0EeD19B4B|1xxEb0$1S6 z4qwzjxx8}0<+)f;@jsDPu9g-d{uT#CzS!a*%9heP06SSpYtNkG(pD^9D*feRGo3A< z3PV~EQq-TxJd%LLt#&Xfa51pj-$RtYuqs$o-q^BpE|@D0mr3ONO*_Gr`IFS!*qW4$~5#CK~<{PqoHq57clzchYJ+v zTguCouD;2unpx6~2WW=;a5v_}cYaHT9cJmDFc?@xXKu`Me2Xr_W z=nwpy!Tw4Jv3`ES5=l@UlQep~v<)7%g8(+Mx6vw7m`FJrTVc}EZetg_MA*@DrvVJcXZC(D>$rgP0lOAD~!Y-xc^4wvM2 zI9-z8;dp8JF3y+nN8LDl<>w3)H9ldczq22GVw&;UM?0mYAGKpj#r2vW9F&KyZHyQcS1O7Yj`DL-ZjqpT&`811eqVF^C1M({PtLK|dxDhu1VCy!|P<4L?Cx2dSUl2Pw zy26Wn5aR-?{NF4epQKk3_=Ojb)2DE=n$BR4wwuyTs>$mFdvAigCOT#Of+=&S2OD8@*K$4c4*vn7p_3jiyzE2m1fFq#{WNH5 zSA#7}5l5W7aytrPn**oC5biT!(*78IypBFe=b(59<89)l0Y?tD!#eT0a7gAp=9*VHh7Sk5rZa!#QIee3FCn~hwgEQ|gk9c-kIQcm4mS^<7dH>l&F>JP z4DAIbBD(E@4UZu7HjQM#k8slg0I7S%4lR##e8zu8McP3n;p1ar608w%b_$Z&F}s8q zJ&3=7Mm=p-$s?5EW_k}V(p`p)#f$vAShy1}9me$@+RtS7;wTP20D@+35f>*MYFTgL z=M{JcMMN`@Py6$AcvIA4H2*tZ5r2VUa@byaJ&rbb`f{^czPz5DujnCIz<$z!B*xOK zaOMh2q$Qe&NpCU3u-bp);m2r+Eil@gwu7lQnolvBG56+Zf)b?nC}r&8wlvNcM}0!t$`;0*ht6Q9@#H8ZXT6@`pm9zMxTkUSY{A*VsSC#X zPjew8`c~0l@qL&AZ0(dZtm%BK-auZkdBR~J2336&B&Zq-n zm%qu}z1!#xvPdA$50eHTW#k1S@rtM=Q+sEb0jgM zObT9mO3<54*7m#o03%(;i}?%YfiCVb%=NTcuVLWp8T=cf(32JfzKe*|_@g-@HU7$DOL_ht1SdT} z7w~wMc$Ihy62c{2^?K~)4iXo$S97kES)(#I?KpN3zeR{`ex1%YCp_zCVb#H_%?Uf0 zdd`JCE>DrRL&v$(P2s`{XLlj24B-OO=A}Wxx%d{UxXVZg=_-8%?kzYEftMp}tssr_ zt-trN>R^Q2tLyIoqFHdy@wV=W;A>gSK{K$s+jP9T?oaAuyalC0d>i*h?5XQv{lzQ0 zpXU}v?n{#qB7FGvN-Fk^g{DzEn7Uihd~=lE3dzZ43|7kx9<1MXGFor!#M z`Ho#&5#C{@chN%>NcjtToo2z<{P9U}ysy&r{Pp!11fjhhdH3gQ`$?0+cx0cLK0Nj?2~iYIFiZl0dXc=!D4%2N z85E$6tBk_TJ9LbqYBwN~kXO=v8`(lDU_VoUS9FyhMno+7Amo%sV$ncHlRe-Q_>edZQw zy3D{-LOM;-E83L)8kY%@-UA!;G9rjY3q}JzPcFi(SRB-3A9eiP2W+;8`sKxoz!w0k zq)LVM4rnb)_eorw?QJU*=YRafEA(e$Vzly1AR>eqm8>ZZ{Tzy?BhKV25m1RaEvSYD z;UlkTsI%T-JvE+~1qHvQDQ7m8U0L9EOEbs!_x1PYf|b1PT^r^T{CIJVX;E4lLWadF z3>0b}1!!HKog;D^rxeLJ8Muybq&2S2&Uv96S%lL`#BG^mw839qIO+EWy}+9cm>!~d z3Y8Ye!*RcZ5p+=1QHv%#?F~A9YuN0v_YfJbMtb&#jX|^9oUoJk`iFtn@cm|Mz)qT( z4}P~j>A>3r5LBm;8Z=w2-pKPAMBV8hTCGtt7>?Qd?1!K`2__JK`XT$F-57KSy$-8o zKXit@vDa^~^X!N5sOfcwE%saH!>|)Hd*cQ?!SGwA)aL1MFmC$209taY349j#{-oP$ z_t<2q2gaWD+rhBu`#uyy*VTXCoItqd1VT~+s8FntJ8yM+-N|U!Wi6t1f?RnSR~>WE^7`Iz z&|+fg(mzhx&3-2UC4PcysAs+DzqS0KKk4_HtRrh4Yq-Dl+xNR0a02&_FIQ~OxtlwinvlTR(5Ysz_H-GqwgEO031wc4! z307D{7SP2DAxUKGfCa5!986%^0TR5k5Vz2*jREU4Ck<$6n}Y|1;5~Snq#b}6K*!H)AbylR z@_Q(^KJ@%ii`_myKEC|_?7d5jWXYBw6y5!PRqt2z-s^r10_LeFk%p1xb!2?9s#?>; z_5c6VnGsQ0!;`!{BRn#_%fmh7?vYvfSRf=|)IuP!fW@#FAtA9rVip4ev4N40SO7w3 z7BH(`vI5Z?mT->QwR_F(J$B6O`X{3*t5TJpxaV)jjvYJp%aEvcqe^E`YPR8ck2w4S zZx4xN4hHDf0Eg*OYtS3d$1mZgdU+tGzc@R6lMK{Apwlb&+f5i80|+b=0`LZB8M1`V zpcR#7GkH7)b10ky!0)jpkQQ%lSrKc*(Yg_w65O2Lqm!ZhuNUFtUl_yGt6`08(5J48 z-v-^>Ii770jgS0nkJRz@NG0cqHwj*%k0+hM98Tg}@RP4$XO6IN6<m?1SR%ZJvfVM8SlY(~C>CRRUG&V@Jn^MaYGzt= z9bIf(u`@=Cm^)%T_p1~iE9KS@EXB2M@fky?mkM2tSANiPu0eaBFH_y$!5fbgkw=W+ z@){5tHUVjKaAWHUwx&3c5o5im#KLNp ze{U21G(`)0eEK7!yzu~FsPYs&3+vS@=-gT6^-VOVDdySB{zf2GS`v*VzXWu{g_y5xm4rZ@D zJopFy(~l4SqqCnJ{OJGs_~0M^!=E4g=l{X)AN-@*A0GVe%YXjh|2+N|4*r+_@^2hG z`Rl)N@UQ+?fAgUIAAfcb{ms97@V9<(cJNpKw0iKr|BJPQzxvl}2mjK)*Eskee{gW{ z@xez2KZajFjDLM_@O$vHpTMtQ!k@NZKM-GjaDcx)I`{y7{|Wr$2M6DQKR-J71^oSc zR@^L2#FaST5wyN1sHvaizy4kf|5L#c`TG5m(teMWEdBOF@f~GA9ex44@*KW<@Ll-+ zp_8w&Y5M1Pgl&EawnZCpzodn~1FeEkXbmaJ&vIC((GP^Id73Ec2M0fbUy>fj(e>>k zK?iB6Uq2InbK!-2|JlLMKx0WC@#Nn=0R5#6U9^4%t%CmeG1!aq-;@s8<-73z?+6S3 z9C`w3^)c}K2xxr}|3dihh@YpJ__v?IcjWj>!4v)WBY@NU!7qhBrL890LHZlEF7^}I ze%QW00bKP9TU}~`I6org`v`jL2fz{KL?7zPN%IFP0f}i|B{Ojl9CsKa&re6T8 zsZIW0x^_x8lt%V>q(WH?<&n~Ss98tiqqpKOl>1{L>yP2jpMZ?gzftNR0~X5i3;6XD zu<`fcD|+&W;@|kwAAtl2`4N0UxIX|&KLI?YtNin0_%~Ai1Ca732fqu@*iJtY|I2TZ zC;Ha!0@M$I!jFNr^c?&*{*OFRb{Pjggr6W^lu-6f`ER6$UW&5(0{Hzx=!f`{(=Wx( zKL)%X3ra}shk^>qgSJ3TK7ij5|NG)k#Qp&O{vrJ9`|&UQj;;C=_@?^AkCMM3JYwOW zC@KE>IamR{Etxtdj{GMA@Ga*^XEYG zdxGM}LT|Lr&w-Ns+0Q^Hp@u;*{Vq2*mioFwiJO67_ugB3LwXXVGmM8WSlwNU<@%nagV6;e0!2yx883&7M%Y%qT#@I8Afe8K`un!|QatpZ?VI1G zUW6lu{6)95)J-2x%y9?t^`Br1Vt>nyMd)+LCmoAinGeG2mc_s8oX}I!Ob~lBC5aBR zJ=vt6X1Qa8!N`~DF6BqPF?Y&qgMLrxfw7vRl%;@Hl|4G;srp2yy=5MnA8D0;;Mn+G zp#}DKHL4foh9k|-#CRxU?jHbUv;;kkjoU%wE4M=G*ar0rd@ z`04GEf)hkUn{3%)n|CfGZemDPxIoamFu)XE~nDe{o;fzn_)jDiCBSaro-ls#D zf5&KrnV$4V<$0*J^bplIew4s`FZMu;Y`+w}Le2$bZjBilV*U`m;Lp=~iOTNqCo(!J zFZf~N4~VTO$Xpw3i@6_W*uNv%6WbIsRd_l1?9{S}UM_seEqH2W##KT+6h{GIgFKWz zt5_Fi=o{OMt8j{-7(@9MiDa47xkFcw)QIv+>O$v3$#Qo$oVY<+`0~xt`@pqwqW%d7cf1XM^UM zMd5iG{v?HFys4b?CK`q3Y50;PkaY^N82?2HJ-D3nBpQY1Y50*OkaY;1XU>agl$hrV zPbH6*-mMUomdo+m)_QUa zhmGTNcp!MvDh!Yz5(7sG%YX-~fwxCE)vyDZYS`gOHSFNQYRKCqoQiN@rYamHsSJnU zQYU`q2q$*1E6u*KSRJ>{K7sY%wh`kN5+$s7ybFF{RSUj77bpFB<>mN8nCf%lv^exZ zbxrB5_EPxhoG=xI57HY)nJF0Q28P=xHA(RNfg0R`Xf+i@BX24SO3o=pnyD`Crjx75 zo9Su-FKEr7gmHfb2N)9t)br{fPm_LdUEJoHbvwMeD?SC;Y$}VzV~=4L_?F!K3a5@` zct7$x+DGB0X0Rxx-jO|fWT=+^@g)|Aa-L#AGNj;NaCB)mzSM2oeRoh&q%dYD?Z!={b+`N`#Yc0UpKl8lDkFP@4^(K7EY z7Hdy0(n-^LK|5O6i-v0OC*chqLcdtsdvVyV8^FN(%?x}(v90zPnWNzOap`S1<=$!X>j>4y{HL;Xx|y=EE8cSbp^4F()v<1(FYT zcV)|MHxLs&3pJaaUJ|?6|*)d8S1W zSu;?tLW|{)$L9OE7q!{s7H(&4&2JWweOf7EJ1`6ZhfCSLF%IQ|sQn$Y05M?$2(%BJ zTbsOGj%TuzG=`&*qrMp0)i#6?YnI`1aR=AfzxB0C2z+c9KNP2B{K&+k#}-Tjqe;A+ z!z`sGBZ3PWW@N&*q)lAVhmp%1E($V9k-u-%7|g;SVGJ7DW(*oS#27S%of(5!rX-9( zL)(l&Lx&iHrm!<(FpH{$F=%L;F=*%zW6%_KW(;Ntm@oznZ8HW99bycc!p@ArELao9 zprLKXprJ#IK~vb7F_`6b!WcBP%@{Ovh%smiJ2M8e8GtYb4Q(?94IN?(n!={Wcpnne zcook`Ju`ZT=vRwluU&TN*kVuCuce_+Yb*zz_gk#8yE& zh_n-Y_gPHU_mHV2gnTi3OYLcwS+Uj~-`UVka?nU}tEbUjIJ98b&{uHj#pnP}@gf%B zI2^rwuDtKWeK_TefFXS<(3{-UeVmJ>;^%7{tg41A_}T{!=q`Jb!R6Vz6+;WG8!&p9 zI}5hg0XHy>w>uiW*Qej^Lnv!^-!XHKDB-of?vu9!5@P$SA1&4Cyr3P4jTa4-Xyms^ zY^jd~NfDIpgixlv)suq5<-)hA(t}Gl9oFGcW%&OAZT8)QM+Mr*KXL{V&ij);0ot9| z(^nUx{&W^A6VGVn+)>-mgKb^5y(ynLPbH67PzSytyGf@>9LXquo+{J6JABrI90WOO zllJm3b8;j}pA9E?)QPW<<{|Mj%|pQu!Com$g72_-NPf=H%}JYY9*T!FGtoTsCNZB@ zv0%pSL4PG$!UE_l9E5if3n!=bX}s9(%uYMn=CAPb^!L2#29Z*oafKtD$%P7As_Es8 z`xx(gpfd+N6QF8?ag&+_J*vI9vX5{lmYokao1QQPR1$0lp}L@U$kmRh(p_iIELx&< zvo^abz;DBgLfK~Ai$iz#9fzvi2#b!P4#}2^6k&UJFvapB7T~TNz4xz>2)5q74|67t zGhwqQu`bP03-WN5lJZM$hu?9rM9IVUlRe4c>R!7QLmN{zVDxP@Gs65Pogr3n=~Q@G z(Q4-Qg2x8!T2%Oa%-OLJ?ohR30aQfsi*TL=HbvAPrUD7EvBr;<3K(9{j(pUMhDuEz zVkLGGpa5BA}v4yL>nu*5h$b2>*Xu3XaDrn2v10 zqXQesNLmet_9w*nvp*5#dUwW zG!aY9nPDE_nTE(&BRlt{tqfXxyTdBIcv7w1>A2>^9@`jSU_!X-GI?Uu3T)h zPi|nMVnqNZPk=bMV{zOOV8;T429CfPm%aA~5@NfsA1&1ny`W{Z2M0(?Wy;GjKlGyE zDhMcoz(tndi{`&U(ufw<2QxZH_N3`>U{5L`UKl=4qMb0D4(o#tb&9?fCkwQd?p^Zl zc^~s9$+(z55f2Ybb_h|Mt97Tjvx;4N1CC6%L&ifKBH0mDUPSHTDd#WrS8a`X zmy;+C!%*CVOZx1foZ0kQwx`*2lk{5njA4>HoG-`I^=fo8g|G*0$2{3M>c~*}7#^39(eixxb~L%Yn~8^e zJn!;+^ym_t6AqO}eiItyPhQZDIO;`1h14hU0vRO6a9&+SP6&nXe1hqHZEC)inyL8< z9p;w?-m*y?Yfd6vXc8`GAC^)r?J)ZpmUm(>Mk&cJ|GStq3QO9N2@`wunAF-{;ECbA zprtAxG@TlG(Rlb>TC|LpE^#AW%x}i?tG7|uUA>To_#q(RV;%y(Vzhj?<}5+2gd*fGU(-h`FmL&LlIIPaj!@S)+|e4MvGW%$tWZa&U? zmoj{4csC#CjYkN76fjC9yKO&xN>MVx?3-klS<<0SNvF-zm5N% z1PG@g)7Zh>87RU|<{c9+#AH`-#t&#-i61x(=f_;u33qHZI)th^^W|f!*%(Bd*=Up^ zW}_)dgYCs^^oZbLHU`mVHX5af*=S08G#fp@d6HsxV92GM3V8l{NYXi9rD8=V|_n2kZS znTz=J56WpkD)8kO|#hH^JcNb zD%x(d*lFz4EZno|N_f*S97f(W9JHeEHV#K+OXj(r+>GJ9R9G{Z%|>&zr$n4TxM+@N zH(-M;*gTswHIl#1`I&WdEG?-GB_a?1wHH-Ks5D9 zpXa>Xc9i~~dj>9RGYeSWJ{CY}3lCFR@VBfs^eA_kG-CrV9J9x{P?Evl+0|T>GK2qC zd?V$_Ox>+UVsLCmqEU(%iKet$BQX^5;F<68i~QN8Hq+IVkDZQ$7UoNrHGMeN;@%A+ycsG0Eb4B(ts(jG-;;T7&0->IbjI0 z;_fzWfJ&*0ZnWG^o3?VlS}$(Z1_be-xjdyYGH-E?H9Ik@xEH?Yd8_(jCXC%S^(DDe zgW}MWtC&b7GPWZj^M)e9VuEg)kl4F5z-)3mnXmbG;FDH0V_(Rl^&;TNz~_aQu=FsR zj|w|AA`aeuUPMCXy@&+!_97B{rv|XrzGIn9zp+B+4PgcKHinhLP7R_$bfJFbhnzQ- zA6`Ju@*}uYL&|K>uX9;o^Mk&r1F)UK{tTj@ zCUYA^hjti52aO2_8bqhCKZ6`=vpTmybZCb`bkJf3(JAcMAnuhRi*4M9w%X9wX>%$$ z$$;)0YtJmb@MdEWZDylUl9HNFpL0vSA8%t8V|cSMh&Hp)C`HUhQ_55#w?Cy#y^UF( z;myV%+RR3y6fql3X^&=O7HoL4F^D#^(I`dCMpN3O*_b69-fRq_&1^JE5wp>h_GmU{ zQHM7hgJ?4wjZ(yHG^IV7jala5&Bh?w%toUWF&j;3_h!Q?7`;9rjg_evGiy-!T-Ht7 zood)=>@>l^vQCIu?C^QB*kP5)-Da`V*r{3MWIV($97f(W9JIf2I4XtBGkSfsT#sIl zN2~Q1|1w!lZ{W1!^5s3&bVuvAcasQju85*9O3$B*I}yg$*HI->g&o*txgJm9P@pzj zOs+U6!!2Y8D2p%WfF`cQsmN<_ie0`TgGVAst(YV=DM@XMlGKYyQkRm{wb`s_o9Oo%`HmODke!wO48b*B)wvi^rR%cElScaCJEkU4^qHw_ISC~R(f$d zhog%hveOreIew(oRbB3?%_dr_D;{4kTayI-@cJx_y21+&9`y(DxPWz zq$;MQ;)?6#{nZ-pgA}Jax;|fy?_h82Y;l#@^``E8oG-2?@4_fhV0o^WWaQtmk?|?J z{kD<_;FczO9H|=yx7AKrir835L{`obdENnqz9lcUg9f!Wwi*xkO-p)nBn{z*iekXk zdZ+Ofbk`Gb@x@z+5SbV4v8;we5p{>Y<`JAOhU0qD(<<9av2f8;8#$Guu2=(>P zi9JybkzsIm7p^#g{Rj|V=R(XnLkiE-oBSl@2(XgUh;~VtGLfI89068R8qqE(Q{C~C zlq0}ON+a4OWr{L>l5zxCNohp8q)aWvPg0HmD=Cd=my{`i_({qUU?rsy?UFK;3qMIY z0<5GoqLMVekAL)HeDx(xlqw*NJFtpOPe6;HoF!6AiO`Wp2&{J3@sQ{^nb{NCPb}-7U3^Zv; z6W%yzl6Zz42EL>*$`0lh)L`r(sBr+qBB&0-2&#j*1vQ}af(9fEqS{v>+^3qlNY#+L zniEgZs1h^+at=X*$~pp44nc!TIs!5dL4(RU0ul~EgGxC9@(n?Q$~Xej4MBrSI0CW_ zL4(RSFc-kmrV5~BaAAN9pJL!>Z{ra1{o#T>j-K>b`nw?^4MGcNfhFX^ou=IIL4G&o zB0(&2(XfPE_Or&R&8#q{d{!`vjCOcJPTR2c#)rQ7%Xv5S>C~X*Ui#7}f zs|}6k(1t16P}(ry7Ht>|RvQ}6p$$_#qO@VaE!r>`tTr^BLmQ@yMQOu;TeM*?SZ!!L zS{vqoR5G?Or?yPV8DiO)z8q8-1Y&H&Z(q}kgJWXfuXvkc=5f|PZBJ>&O76@2?! zPCIXAi}8B2f|t^wS~Td@7t7o6I=iXstn~RwT>w5qz{;!p`IpflTxt&$%6RIj(diYU z6Hm8Zj+ZaSFLC$NY=+mrFXmYDiE{*)yx8hEMk_FIdMlWOt@(3~v=uTYE_Q2aB4ZQh zCM!9rBve9CI%sFIoKI%jj4>{6X-_{gy60Hh5^}9q!K(qgGSe}*Plh;YgPhnTRBS1@ zp}&88EPWda@}oOAzJ_~QN3X`vk-&E&oO=^?EXz%UuztVL6 z($*mjQL9Nb-AJ6vJ&IEcv`%~sZ&%jw5XZ32j>V}5S|>glxGU>;h+|l1$Ko^strH(t z+?91a#4)V1V{w{+)`^c$?#enI;uzN1u{f%_-8cV!(9aSZG1Se#ygF@yRwdl zIEHn0EKWbrI`Q$>U0KIN9K$+076;U13v4pg3(JZ8XsXjrJIR~;L~yEQw1gkcJ*h<( z5I1Wrj^@`vElX=X0JZ1>>1M6P(cDvOaUvA$TO7?jsYMrnH)}19=GQ?jOW%3`YS9Jm z&0342xu@3RL@3&~IGTG>i!R`A)><6RuY+2azV!gqq8BJOYb}oEo?43&p=jUYXzocZ zdI4s$*5YV>9n`Y)t$nFAgR9d5i^1k{%~T#?x6z0W<736}{*SDdzZkEkS9tI}s0@7= z#oG+0^Y!HAWa+cw(~3c@Yd!`oe$~fLD_-}Ru0~=BiCKlhL;Y&GDFL^$72qlLSXh>R zyp{#T6*NaarM;TIoKLP<(uU|UeABv6CS;E{LV`3ge2a&VH$A5CobVt|PX1AcX8_;D zk|f-@a9x4l)|1Q&K93F$D;Mf_Ri|*Rk$hw|nEgZTH4|-R{lzw%wcWb-TCT+jeig z*X`bWZ`-~1UblPyy>0jY``qrO=)Il5qv}Rh{eI2lO3`~eg-6xj>z03SC-J4|y`IIF zqW5+hkE*}deg3_j$d{t`dM00r-rK1>s{UU0`S*4*Uy9!A*?cK_Z>RI9`g_sm?^o-^ zZE~j&ti*rw3pja|-^-RR89N{LT(#KK+IzOCLFaFNTSJdtPPF6i+}nDY=Y2+ed4Kii7Nh2L;W?@q=3=v&Mt{R9msksPp*= zvB54;Rj`JG?d8Q{b|khmJvuB!QDZU(fnO$XiYzCuCrfyE=Ed9fWVBdb!>+2_vr*tx z@cL^hzV}f2K<<$v(|TTS`oJ!*X1EfEIUU}$M1)zBj&d2_C|Y}TsNVv{`+%?YV6U4& z|1rMR15TmZ`$#jD^20Mi6ru7IbGvjpz%-#x)TX5CxV?qRIUfgGD zx6GDhI5b~QOjB;Wjz@R`^hjYa0}?J+N-nbIA?x0d4R1);ZSKh(_L+M^!VYs!$i6ou zbTW33kU`&qV(?$5_K<ShEwB?sfAPHj!}hEng^4Jis0rZ&kQuy=^E1^xi#6kb7S;?#7;DCh zEvy-gFxE_0u&`z@!dNr?$-rg{rlS&lO(SMCwU#525W>jGi0{&WCSP4m z?!>*kmTYdecnJs8C(9+cK`@BQvO_aVHQi1hWRpp5{%LsGDk4yj8W4 zbjD!T?9wIzG}R@}Jr`zDq8C^k5Jt3+;l|GZGTc}gK!zLF0?2S#O=x&aKrDF|1*9p6RGCOGwMvRc7pTEu-rVEA@7o-W}wlS&ziA_BlnnUq^2 zEx5$|IsET_WmB<41cocv+mBu>*hyUbH`)mW1D!7EhXE7q?I4VRXcjx7vX`e=`s$*& zO#*JFuiV~&1~|ZpYwFWdkKRJ2C>*`mV6r{a;a+b{Af~%`U{|^9!D7sEI-W(=%V8l6wVfXxNF%Fu=*Q)=aBZvvDwl zkSzGAO%QrFoDzZlN-(zok{#2t{HMA~49?^LMl_1SnVgXVXL3UdoXG(xa3T|>+ZKetdKrzEF0r;dRX8*Sh&aKEHgKT zi*0sE*t+0ru=d7svL|1{GoFNdJ}6Gc+Sbi<&SEkmL7arG-fI%K zf;kyjJl7;|0df%sB9I?ZPd^*v?OoHuFxui8wV0;WD=sGv{YB=`kLuw3b?O8MXXke*5XJE(*tN}yU zo=p%Z6oB(3a|XsK&odaymTyNeU7Eo2dGH4mgT1bF)SHSTqN=o(y#cZx zYDCNmwx))ZDXkQ*$4huAjP}e-wOgYS@Ab=0*K*Zw4JBnMi(qDP+5k+7Et*0rVcEh) z&7cRG^EmoKlu(`@ihXS-s%Z+)>;RDuHma>4KsKJ&cqeYgaNv!VjoP#{ez8vC z!UCCGKv9cx$>NzissRPLswb?WE$}5YyaJsP3vF8j<@r(24E#)3U8osS}{u1XE2PF5W{9P(mRnXV>5?j zHCW+1Urr_?IKCkFgn%XFPhLYYA1bf%AFJu@-ApZj!cUV`A^_iQAklLG{qJ#H!|X&% zd7j40S|HFRT^Ufhr+h<}S;&#elSXg@4f9Nk5qk{hRd9#%({yDhEeHJ>+|Dj8qc@d5 z0*94YqfhiL5fyE~e^QQss`*_%0YQD&&plAz_0ta2cm0e5^<6*NKz-NGGf?04Qw-F1 zuo4?lHdr?Ex*kfIjk*8AW4O9r^w2*6_K_# zi&Emz65YochwhR>Vv6BQSz=CeU`jm{QX4cM~P6I z?2pUR@{7MYtPO%)mexk3ini-knEJLh;q0*yKBJ@aqw*)E68fR_dl?Q7J0Myvh>D_7 ziAL}oQ-9bmmzou*8pGyeWR5?6Tou$OXqEZ-u-mLvJJsmg{CN+4 zTCFxq(QEVP{ZhZz8n(JoKlAfJy;Z7I%h4P2=Yw8j&?t4Q(Y^WeVZB)g%_`B_`1w(} z+b*{T!+!KS`(aS7lsb)W^!m!gsFa%JX1xK8bCR*fQFYK6_WN~wIn2aqRQuINrPPaF zogHVs)H{RTpwkq-QE6p9wrl;`u+)HN%A$2k-C?;tj3&7+y>7i+?niH4n6#RWQl;A+ z)}!-f=0mdt?pCiwXGd9mnyp5)F&MU^j@gPw&HkV?=ro2=$85%@fi2Hh%jf#~d$OjkN;cbk=3uiA>9n2vbV z0c(I~wWGP&XO24EE;wDK5xt(9>^nX1pH_7kJvMvaQK#Q*)@q$0ww2kFk2=F@dDsCJ z&mL8(*^k{)yIL85g`b_9oVw*wrBbbRqsP_Ehf1q4Y*y;garQ&CR%`dmmFOt@p;qfx z>%BqrB>SP>8rFx1GgVC$k8s$a@dRNvay=J}I9>CQ`XP;(*+)=MPs8-r_Q2xlYO0VDRcdMlq8o8ap zIxg3{<#MIpif+edPd+Ypo27Cef>-Yu~*^hnApwCFSSy=R;%~oZrRC1 zx8qv9Jm~amRfrm2W)Pc|O1WQwurbf5d|Yb{>Wvck737f_q}H(3ZMDkSolM6%u0z!y zdSEYFPOeR)dZjXKwHxhdxG;O?alO&5R=X_`)3W4Rm3pNFBMU@<%%?^hqC>Y|j}|Zf z!sOJf4ZHneD}o$6^P$^q4=U9`^!V%q4&Cdfg{V60Rl1c3-gY#wOd0N03+Pnlfmlu%8k;n6kWX2U|51d`6g?W({imn1al$9oEE3$dZ#n&Kc!59%H8%xD4UD@>!ER)^h6r-#8E8JY$-ZImJGc6ycQ zCDho>;R3$F_zg}S-RD~3v;jeJSZw_$70Z-RoW#cXQEi_>AHHz+}B2cl#Kw$ovC03D(aZ*nYV zi;P`{oo2NLfh!tZoY$Tj?4FeSZ3re1g02_$aJtX@SgCghjdp1e-L7Y|scFzBwR)-1 z>VSg%#qxG+2Hz+3YQ5X8b{Y{}=>*6o*?PO#>31O2Ew}omr)EHUQtx$J;8PVC1nx$e z+~i3U`fY6p$#dyhrPa!~@RMe@0|RcQ6}_Io6Q^db@T665v<6^@NIt=8O4MrBYt1ek zv$@Z^3=`;%_1+<^h87RfDdCfRPS*6Wwx84>QI;=?-c==v1}n z`u_IzZDxFWGHg^k%{mOo&){;c`wZ%^UFkOm5Q^rLH#zeTJAhe&6brjg#$`W&lzY$~ z^g6M7on~wZ-)j{Z$8gjnTIUlO{F=>bs~$~fv-{h#Q*$oyNu%B9*V^@JbhWs}J-UWD zK516UkmL1w%AL&73qE(-{Z^$GP2_G}6S-Y2wfh4|4sOuh)|sL26S%&!Q|UHgz?5yD zq1~-?hd61Gy)kQ)Ub$1P4&)yuU`4?+ht<7@%E&7|^^ezjj~LI@lVTK)59 zS;+>K3Uo~f$^ti&+kOfYugb8~u10Eeuc7s);355TzuS-QmWw;k%p5yEtqsATkU>OH zw>mq;2b5aVEbg95H#CS%&>vvRdwA3~gnUQE|3FpWsNtNo0TJ}cLuXIJW-2+wsg zU=5hDw4qbTcCZkulpu3~-kuuGY|zgtwdSA)6KH6$?iVngX4~wuY7078r#}G2CKknD z&rA*GE2U^Mzm}moqj_TpiP{k2e{aY&u?@J^p|U=; zq5wLmLnNs|7>R?B9KazAW|C(h+o&`XlT)Oi$kV z&<)*LbOpmu<)~Z6cmWv>%u(^$S?E%4;J(8(WHiUv3R;#6BJ>8mVXxWNqK6W}3xlQ(e28>&&g-Kf?uisU5DPE3I? z4CKRl#qbB29G_CaP&6ArIui|E`~__IfL;zuw{%~xMv&Y?p`}raJ|8dVaK2rPDyPGw zlbB5i@K9obtgizjJDxIuaMU}8-v-to0V!Uy(WrI1Et5qrJ{JqEZ%!)8wFnBM-Npbi zwVZ8oQyzeBHz6|{LSIXvW8;v}kk1bx;m3^j>@ghj^iiQxgJh`*E_1cGpFuE~FTku2 zN5I)}UEDNMJu25>1RX-DGxmcS#01zRMD?|LRH+U6{a&S=7e7BYD%atT*Fn47sHR(0 zxc03_bqF~Ps2fD*Vkj4ar%^2zrRq_;G8i=bgj?okRUl2TJ^+CRjlA$A_@GrOl^~1J zz~f*==-P;2a#4nu4KrOCuuMBO_Twi=CgZ`gr35H!#Ab;_LqUPq1l!jS$87;)9&V>W`oe5_e7^*gX6VX*je z^7aj8cp~(f?$d%WGK5|Rxyp17d(B|ld8!8DyTxjXm)B%5`mI{I3l$(J{GJ}3otz#X z9uj{s#v@3#YEY=}!wLbGp-v$qeftt9ONU0IVP0>bv?It?>X2K*STF}T!l>x) zW^xJD`6gsH^-iVftz(Wt58MQ1O;Cyl_Q@SmUhKP3t=@vFa2qq^vr{9Ir(sqIo(s0! zsMYE8%Vn6J`iqhEWY~N`ls(tk=RBR3l&I zDjyI&Ykeq)g3qP7!j;SfMh#@FrA3%k2AIv1$R)&C@Eqnk+s1dfHs0uS^ zv5tV{<IYZjd3N+M!y2rh!VDSKO^1-R(5~!7qX#AX zK14bphPu-%Ob#gBLut5L6*Q9FASsQwOT}qB(X&98cB5WySNkwY0$m6iZe7X|RHquv zJ|w=7YRIuW862=BA(DwJI^xcKa`q%yYKBnPY;;S_o|t{UnBXL6g}KhzsWCf9rZqZd zt1@iYh67+riyo^l2R9X2QUdULMQhk@RvH6Q&V?Z@c5x9k^#YxV%Ut;}D8cv_vnLsfCVQ zgIZg^+-^}JyEO-Ei~6*P-a1-WEGffCF@(Vg3+m@EGdLb!UyG~mah3p;EZl_ybBybk z1|}5f2V$Q91kZS9RO)BSN6e0s;@6@EED8+!F#!mGatoP-0#s4OkgOAE!Lgl62hvJx zYZn2PIT{4&C74RWq6HF2&S+XBpa{T9Vy)T6sR|NM7ZnB&=s`KVTxmesC0qQ>E79Dr z-RW9Hb~%2EpTX#$%RYd?5B4p{u`AgY7QlMg>6fYvXm}wz-+s#anzup{-ReL=5{k`6 zue@5!VK|ZzUXC!>ai^*1kRR8el-RBeJzNe*>6k5Cbn8IvgBl!0Vq6=&x?Y~0U{xkX zY(!9oX_f0x5JP1NSGf>3`^g}4H-;x|pgg203k0A-+Jj{mhqbWbAgU~3Q4SJFU4mv6 zHkrU|QdnDEGnsF$I6k4xO#D{6*MUWtvdkP+s$iHt35W*cR;S*B{XEi9K=sctr-Df& z6wgGCr8=sWa~I2a%|RUo*2!0QGBbgE9rRp4B$O#m>bI%R&8Svwx4Rv{G{mGmTT!#p>B4%07su1vhY*P~XYQX4j*?5aEw7ecg>)f}En z!{`ZNOVq4SbY$2UQg2pq>mV>Erdf5U?8Qr{O7^sOR2$I{7Cm9-n-%|31OmD2s|ck0 zn-OfNDfQamq=LVm-Gjj)q`~q#1Vo$hVB=UH=0N>grkEx(Fbsidkcy`&DRbyrok6MD zhDn=X9zT78DOPKMzmHmj-grKKIa!VX077yfO!!78(18UoD7WEk3asZxARRPed8XEZ z!bT1Dik!cKHo_Q$+D_(BSHrXroh>PPq*1umkIFUJ^-zXwh{%~3Ig~Ge6|o61Q=Bal z(QAXK+8V$TtsL`w@G;j;@arWMpj2vs04iOFO$}@#X|0yUfj6UyM_YN_9n1|S?)832&VqFM&?n$!T@sM_elEDA~l@g4x2^%#@- zF62VhVGkBZaS?44kLvogA0g@ks3>CUQh}S^bfxp_Qr)Oo9hRWPEjRJio#1UqsTy_I zq=(dN4)7kd2rN?!U?-~{?{#^5Fch|7yBzG!xt`wKfa0TUxx5!ab-x8ZjinO|IaAyi z05&vC(}OA=4CJsF0aatT9y%6Hs%%!TVKnJh>%%H6ZlkB_%Y)g~eJD<}hl73tR+?^c z^N_M8MYbQ|27`VL=fV0+FH?HxN3AX_l){`b(KuHF??;_(xd%IbV6$DEwTK~7w;aF> zTh(3())eJZ2ZXX*bp=in!bVVtDX^(~7WW14UYr(Y?AM2-UDyuNfE`r8Qs(1wAv3e; zGk{Gftt#xtE<b|!%^@UTPgYmUskp`5;5m$70$1)1VB1*QvcjQN+g8=l z1g{e+c#`SI-ysnabIX!!hg>bFZ62M#Za)04 z7s04nD#6W;&s*Xk^e7?Z*H&JXHc-)rzF%8JELXqe6DWGAz zohaFPn0HFsxqXV9tQzO91l5N%#gaP5pQUL%&rbnL=9%}4^MID~{S=@lMf$vdo*;eh zKL?i--dw6A#S#}_vhd>p=%;hC3&TOtyeA;5s_YWE&Z5d!d0$NSFVgWdcYi>ZA(71G zK-l{PGSE$RdF80{c=$wQZ*Y5&O!l81o|P^{cWtdFw=1oOMW5n%Y5WdhL3M}oDBU;) zFND(|u*)xb7TE%#XNndOJxR2H==q@qL{AMZAbM740nrme3y7WzT0lb6Kqnc$4A4o& zFZpwl@yq+1Wc*S-CmFwN&q>BF(Q}gV%kc~{qt;^eLOmvAe31bO7b}^>LdG5n4{``+ z&PU++rF#_O0-pA|ID3Sr@kZ~T&*+Vd^GpIMdrIos_AqYDLfSm+~!O*Lxh^lY9NXSHILQ6tW($w z3_0&IU@Q~Y42+u&JzX`(&@)vX#5PIIz&NF`O-*$=$zGVuWK)N+O-MBub1rIpa9mrb z!DeQl+L!5KB_F4dC7g7`$<0bNBw|9Ue`V*Q3a}FYhtlH4?ND0WcpOTL8)rjlapPwwEpA-oXiy`mi*u1~R$oyPK&VOyl zev?@%wrfVqAbLz|t=JoBEGK3>2_rd5?>Dvy>0|_GghMxu}-6;;Ah3I)vf)kQrr$~Nb zMThrJs8ggO+H9PSCG118<`k)b%$w)P346(%$!$p&kTzqm*z{FrUUVHO83MMQ{~mDz z5?vjRWnq%sBmAZk&0KCPzS>h-@!6iq9x1x^1op_0w~Fsf>IUE0ELD8x@wuE7(79Cf zXvAlr;ycTo&o_@oe42SQ;gX6;`op82~J3sl_L3NSvtITmX#tE(MDzr zJSLkoB)4THiSJCF0^ivzOMK_?xhxCNxh(70 zk!6YREO$Q3I(B4P$Br!Pn98!?hhACMF_~o@Q(4xrCCfUtW?9E+=Scf`Hp@D(Wm)kP zaZe2ZJF06pI#0rZTE1kiIX5+F3|auD&$yBtLPGA{=azue0~ z#4r1D5b?{u97OywFb5I8984n;kZd1ooGXvE!3dip=9k{&(Y7grq!pfc z%3-KAO_!034wvdpU&AvJ zn#&(uXmCeSIYGy(mVD4PI2~QRvf@J`1FMrUZbM+zFdzkqhcc+Dmp$(v19D|N)sFe`k!8&8+fBe)w8ZY`6W#gC## zu$4m>056PzQ}X~V`3dF}E*`Cia}+popu>jXvq;jNzu+8m=${7O9;ze|8#yHZ9agiCcFDtiq zU^k5EN7yUU6Op>(ng-zL>HQ(Ne}uBx%tEpY$=Q}|_m*LibPMpMdI%!2&L>p=0}2~3 zax}^Yls#04+p<8Q+e~S1(KcxR&rdG#@d>=@HL@0QlgQx(?Fb@XG*mo!5*B7Lo`ld3 zH5|N0qDD$Uy)0V}<0+r#UU`kie5?ucEP0Hs& z%(L4}NQJ=7@|tgxxwfqEXU~L->1ojj@0a(e7W9Iq#x$)2;6>xzWO96$Arc#E$wk=; zMuFmr|1cN~mW6+*$%xc?GZB zOh)77a;%kzD-d1N@;sNMWM=5V0J?&3N@aB zqtK07)OiYysy9+-@Dv;+aHP=WDLCrkNTJ13a1_UpLXW55sFWiGST*4MK}96BGOX3X z3{PR;C@*Bd-SWspCAT`CPPcNBIWcT9IuUtkA#8}M_eEy0FctLzmWCvAL+B7h$cfA@ z?umR9IfO4=U*kj)7fxF9n}v8!%CaD93Lk(-8U7*w-=RX~ezjiQCeDjxDmhqW@+VV% zUo291Uu1{m+5&g#EvA?x2q_Z@=@MWzfrqZvqUEjSy^KIUD71h+m=1x-qK7FU2|@}) zLOKMnc5+h)D;Oz=71|+;^7)YV^TQ#<^h0&XY%HwUyxsytN@aoN#emkbEQ1;CXa}Q2 zu|tOlqn9lhVRSIJFgkRIFvqrBz|>U-a|@$GJB5iiMle}#)<|xQ+-M3USS;5tn&LB= zu|-Y>gOQWQ@|Tmzzb$ey7>t}WmcN`#mT!@h!C>U1vHay^<`Nb;84N~F8p~f!X2xQX zlfhu*q_O_INP@(!(7mAcMgONMm^jNRM-zfD8sB zAdTfAAU(iw0x}qkfHanefb_`53CLhD0@7F>0@6boCm@5t2uNdj2uP1*oPZ1lBOs0C zAs{`7aRM?JjDR#&M!?bZW(2Rjj^@*u+99!<{jMzx(GUiqWaqcxRS$+fQUdJdF3#M>S1GRLxhi2VAQ#MNIPA5n}lq2-OLhtDd1gha}BizC-UHMZh0I}z6K-oiuIK$2FarJ7&eaKcYO89M3P%Y>MEp26OD=!-M zZ4qvRhcM8sR-0eHSx(n@5JWbZ*JDvA&!{iXXw;Ul;q@VorMzJ8(eTL|;u}6~K>c9TqsA#z60-9kt;us~rVHw7C+D1kdjSf>1fRv0tH44+ly4qU zJ_jy9k*LiC(ihUkg^D1%m}B_EIKjcY0wZxg&Dg*eTt2hUJdF2~eDQ{pdvgPAkS%%4 z^;PHlCZ=Ux?YLX>ZrJ=@dDlZbk;?}YKb4Bu?Lj4NwC~|~ShgG#4jWJiWvN_Ab#KL( zf|0g{0Fag&S@3)g$16+mEUYY@Oer<#uY`gYK<}J^+)b)0)tIcu$x_o^Zdrk|7?{|6 zzJwcGL`&u>$VAeEgPFR$MTjr*FKIBCYl}*sw<<^g{(oQ@Um?4INBgOw1*%O<$D~-w zx9uR5e``nc?1-xHOuKy{!{xIhBg5T^xw!mm-+AMfjK-<7Jsa*e_t6}814a+C;)f&N zCQZG8K|GTBEqRDvs-~LR3)&H?ylAMXMc)TgxK%=U7aJ;xobBCJ6@xt(M|L)M4Icjp zdr-Neaxf(T1w;513r^>-LB7M$hi}iNNb&Dpsg!09IzLsGpuZ9}umEmjytik-oFB+d zI&ppq>WttA;L0ZSLaDoRs$Ft2053yjunJrgwCP@$MDmO>fo=@<7s=TzDJ-95v!oD zhMbr;8af2AP==T z-4tTB3I|zC8xM-HKCSt5og596ca?;{;u&v;FT?$^O>rcpySVx?q3U(u@B)w1i(N?F zN;K@KF6IA|d+G8*r3n^jAVB3!wMF zPA(+qdJOK?)5U!C4BmW4ajKEvNJK&1fOvqUf{eWYj6a zJ#NF*__eqP0(q?O)=LbNSMU_o)$4UstzL|JFIJeits|qlb~LP&FK-Yf5^N?AUu*E} zvxOe+4vN&~8ZjHP5`ZmrGbFj5j3!@=uhui|5o_%U_z%w4hCZbIhgosk%Ph5Kn^B|TjXFc!sW0RJx%U*xI$qI z!~FItqux=9DJHG3@zCq6csE^t*k`us#txtT>r$8dFc zbfQ-su}FD7z0N+pQE)k1B$qKccfBCZM@B!!<@^qd>JpZ@MSOp_%g0);mcqI z@MZkn!k57a;LCIx3tt8!fG^YYEPNS^0KQE3weV#y0{Aj9z`~cou<#vSCo4|L=B7e> z8E|Wz-0XBQhZU^CTcw`QCiBfCc^1oolwPi10Wo)6s@QOt!On`qL=`Iz6A`R9OmDX0 zFg?+V!}KC64$}jyIE?pNaa0DZ#<300MYDY5jCyCMmaV)Yh2G;yV!Idt4`CbeslcgQ zG0(P3;(MOe6vG!w&vxuGkn5o)LlVT3y3aw-3^yMXKknr6tI3T7@uO~CYc)Ao!Th+W zh_KtUmUjQJEbp2+T7bMX1WK0rvcba+R)C9M#$~wZU(ln|z%4VI8gY=MPRsF@rcIUGKCmLkB=g(UE+^qEqlr!NeB(8UYCmic1{YyK$3Jgq#UQ7i%|@q@#(qP z!~iMEu=|CBO#)#cIT!&_R-b3*T?eNGBIN`>a&Sr@Ql!iCjzqFHYyzQ>#@E-Q8{F|R zT+H597V|lrgP*>huHR~2gk^-YlD-B2js&}HlL6E`Yhv51=#f|9p{}A5!Tw)U4t(Bx z6M|W4hlk>!>7w%G$r-|(FQ*U7{9yvQtsh3uX05-tU#&-r`}NDkbpCSmYCOA{;3M@8 z?|q&nCrlsj>V{&J^^$XS^`n^kVn2Y|MkRJD4|HRLd5jK+7k#;_3mA3owH$hS%YMwx z$|!}5uUCvA>kQ5KGQ=3N!9d3A*D++1fs8L2j3HYLWPB}P4B2BK<4gQv$UXzfl&9oq z9n)ao9MqjfsT?0C2E#F=6lE~>L`>pn>hP%}h1Zc{>xLk5%7+z@6mwrJjx$q9Qfx>N zmZpEbDBMeY3HjxByAmxr|nVT(Fese6{Qbku^}u)=E^!WI~v229aqeu+0huD z?6?vR&5p+KWXBb5Xm&J)Cp)fOL$jkXJlSzY8k!xA;mM9G&Cu*<44$2g;eFb$1a)NzXyX9PaKW^Xtu4ypbF13cAFi3(S?_k5OkQ)c>r8_o0X>#dgIW zb*h5u3Qp|8VcnMzJn=q-%2hhQe+JW`a`p3*b39B78k*pPUVX8=9k0!j)E6;Mb$T0B zUfs{X1Vr3p2NVB<5sz7$udzN+47omAjMt-Q)89@C5@^lWlb4g_CM1Npvf{6%FE=a- zG9I_uDs|1{1YvlMOsgA}mdo+m&SW{C%rsX);hx7G0UP_pbUt3b9j&k-a3im*TbZtM zQ7f0=OnAK2xAxWDV!56yaZBc9e7sz4&orr}<;~G{$kpqrqG!}ri%OSNBDXrU~ zoK{oZ205+TSdiS+cs^QA#@ErPHRz4!aFxI^)2iT%rBPp&Bjqf*&{iq*Nn~~}*`Z6y zqAlS=Tjw?!q@{DiP@tAjt^_%%RBj5|O~$uT6(;Xjug1&KdO4o1SLRg)8D*^Gg$wUM zo1{K(D5JP-stivZ%hKEPgORofU?{Vtma&mnw%VFDZkQr68fmxZ2$I=ey6me7 zY-_Zs)k?Y#LU04f71Dw0J=T-?3hpft6si8NC~nv;Vj)5DT&-u~siJ74tpep-?X2|q z349;LnbvW<{<5i~WBxU|9P#1Fkg-l!Ys3Ol?6d-WZPOvb|{7kNt9u@}SP>1`0}Mpt0H2qALYMSepgU zAGY-rRNv~7R=bpE&|eAREP(k_vpKQi<&Qm`9?Y%)y0_&YJd}o2p zoXi1iW@ZjxGe2_xn^~Fz*v!=&z-Gqg05A&zOm1Xm~Y%OiQ%K- za82>zZn9iY;VE&fA=2ww`c6S%`cY8xD1$=03)PQ;djHy>5bsX)qo7`~ zHYmiqR{bcbx2O#Y@orW>3SfD0HIf=@v~r%DqsZS?D>2}5SAjoQnISM|v2FaFh#``| zG)>I^M{~F{JW}dW#eDb{zluT$7Dz|!tno7!O`Mwa77@})XA>boWO3ph3meV2vxNv} z#ov}tOifL;Z&7Le2=7J>uEw@atvvZ`QAye93oX`rKX9@^i|@6A*^`iAynK$D(7b&xgJdE7pX5zK2Jy<2h0-MflAjeih^I>5`KwY$0sK&dq_G@q zA=z7CL-^SkH@%q>d=8aeNWd&A=FF}%*-N&h4_>jS8Ef~ zV4D~;Vo@=;Djh2ZjaXC+uD-{LK_eCwgR2a(V$g_1#o%g+tQa(6Q8Bn`Br67uSX2zI zj>(EaBL<3LKlMWfD?4~lw8GJwevX9XY6lPE%AFA+`Em#Z=XAe_c4psJxJ`kzWBUk9 zRajGC?c_cJQ^nL2SUbFrz*OBd1=h~*BQRAWO@Xx|{0K}{LsMYw6h8t}h0hci04!T9 zL}yUrmKBU`7sRq=a^{G{f;yR4(xp5L3!sYuUkuiaWCL_EaF%a#y11XBVVTm^Q=byA zQa6wS87Wgoq^Vh}utca1q!1(z&~_GXX}ef43-h<9>XwSKTQEP8Tas8$^s`$YrI$l6 zFcuX;74YP+i9UNPZ8{xYcQ9zjy$M#>dcg(IAQJ>rFQf-}B#y1_7+l1mix3aff-L8F z_BuPRTLzyhC*9gUm@fVS1x<6b4Zml{Si#f=Ip6YShQBWwKjM?c%M2$H#zEGnE}3QH zgTu2W{V>CZgyG40=BxI+mM8C5SIns4hr~0sWWE_r7ATgqJ$W#R+u;Jp>q9$7UWW@H zuNMS4@;aQ0JX`Q1q8-?YMRA0=6rHZ^u^ed>Z;o^skL5_CcypvHb}UC4#hW8toMSoC zDBc|DIvmT9M)BrIm)uy6G>SJzy1K@4q)}WP?IpELf42kj9UjLVuGpp~GnaNio`H*Nf$Objj?xH;r|vt8)}RYM#A<`+QIU zxIJjRzF$QrN0Gd%6o06hPab1D5W7SpTlW*x?>Vdy3kHne^$c7mze(8E=y=8R|~|ocJO~D;i0m+A zr^7=$cEosmh<4J|{8(?jgB4-x(XALGs`zII`L=9Z?DGA- zZ!Fqy#LD|Kr<^g$OB-%2+cFz1Sc>3I#&P(z5ep{d8#ba>N8Ii94lUenz(}SA^t1?U zv;k%BLyI87j%Ho^Qosz-z*Q#Zn@#H8jqrZaX}50it!FC_vepycjdOghJ=-0!{kEei z@AQIpWV~K9R4VvnS7906^@!Veh5-zL-n1=Z_SOHeRG5NE;Zdsw&PD0cB;cL{bB zisCoZC~im5_p@j#s&QSP{z^E91<+Yt438fcPWeva5jkjD$`$CZUk~N=hTmZ3f=hw8 zb}F7W69&aiQoGx4gnQ1C4NmlaBNV{3->6ce_ZxW&UufscUWDJxexrvW`h&FkRJ;-> zsvC0c`gVM$US!(&lvIVH%@}=K@QSeM(u!XdEE31@9_-j$PGLg>z9}bj(#-2)ah72Y zFq=F^CiAx&a4gTq?Xh2E4|E(w*~JYRo{{PsdYIw+4L?tUrsCftAc6zfy2&obMvVn9=svPd#}$;FzLd3ef(JAUZ0oa zOV?j^xpG2Cwp z+TO?8nU8X>q3*<_+xpq-F<%)r?f@^QyWxa6Hh00)9ob+Rb zrJ(8Ui~GRW_Ig+lMR%DkuEyf@KeC+8ua=YB$$Smx0poN1mFe>89&RC6EJxyPTiLuOLK9t(3{IQK77R=k`3I65fT5gl#u8E5kHeh>wRI}&pbKN?{2B9RsI!mCD;0;X>q0Rbpr z`o0khFn!yI1(?2T!~#s;G-3g!?-{WG)3=ORfML~;y>d>j&8NwUv*A*Lp*M^;B@De^ z#7Qvpb`dAR(7Q#P1i9p(e^j49%m`nMD51eyZZXVISP))UbNT#sPsPvk@ zX-twKS|wC3x{ z%gJ)|Z2H?tRC#p|S;u48VIr?|n@`@z)YUfK^h-BI9d2gg&2+#)Zc=QBr85o7v(`7%7|^TJYt_j6-A< zc9LDa8ZXt(wfIR2%dRMbBtPz^2zM{WS6|+Yr?a9;ewCb?pLqi4#lf4nM?*|uXa!~ zk6}U0EQSR&a~KxX%wSkhGk;-0&FqB*HFFmhG)**oZ%6Ya=bN{9lJm`4JjwayES}_i zGZs&BzWItLIp1u>lbmm^LXeXKP@yO#wp>7a+p!%Sy!UDc+j{>V%)qnWrxomb5q56|7w>)A!M;0a_jYjc-k%-f$zn9J zH4Tg%rRVyV4xCFCi5X&&g@eTYShm!NDpuq8?f6FW?>VZ zff~12|K4M($n9PaM;x_m@qjFJJAqo~!?6%9!A!n-2m)O%?q9$*vdqTm@QJtkk+XZGSdp|> z!4kp-S@Y5di?lYNgyfOzEBgLVb~_&|HRSi>!Pa9~upV9C-_531=DTN^&}wdlwMl2# z#Re3sAUFJo#R?(B1dk3lRDeCK#;!n0BiOk58nhP9W=KvY6peZ4&2hk+CC*0urTT)UBJSq54nJa zQ6F*v3!^^d0v1Mn$OSBn`j87)7&Xb+HyS~2mY1fe{;WE_ZG%YK{c&rPU!cfB+T%nP z(jF$VkoG8%g|r8WETla~WFhS#A`5Ac5Lw8yM+fYjNZQ>_tw?;ZQ!5f4?9_@x2RpSQ z!NE?gNNliED-s&))QUs~q~;eG5Yj&`EN1uOMj`L3h#>U9aV_`Cr0c%GB_>XZr62O00+>rqOBk2|dh}U*nX07rW9L)+I?Es;b9r0rFz3q_i zS;+UdL%wez?-wDBf=f{Yx>%hi1$>oL#1>8wxgfe_8EIA?GIDWt%QDieJY?iT@s?$z zS$W9FMe8lgNVD>gkqhWsmXT)VAtM*_w=5&g%0otOSlF_RG^?zPO|kfHIfN$msE3as zMg)%cUyQEqA=urHuE%Rw)Z!NX!}-DbnOLh(b4$3(cGQtVtR|B$7dJQIXQ;##k~en? zcyn{qd$C$WT^`Q0!7-*$Tb>ciQkI7WiX9R2VurG)^HW|&6qLDB92nPm?$UfQZU=;2mni0nbK>?V-?||v&nJ=(|vizi*gid zRYL6E!k2<97}-hxbLD7OjOrc~(^U{k8}puH(odYIjmDm^grR57lrK;#{Kaa>YJ za^ndzJiyQb@YPWpmy}mfDjhA5r7cvcJ2LzrWjUXMHNzQ4H4ka0YKA+rQSXy;sjOTdyv~PU!e{NO{rTO3>l1$II

e5$uK()oOEYozl@-_}UyGrz5o&ZmD{Bc0Cy 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

6c|g}uWavF-(DKu&=ki*;5%qXmi{P0RR}qM z1js38Rjj$RDb|(D;61B4yv!0F>Pj|;LX4?om7H+pRC1N`AYnkllhoT(6~3Z_g@YnW;T)xy+rP?b!r1XaaU3#jQ#b%L6~)CN#9nF5h< zykY6Pz{1=M)TP$1EnHT5F2cXPy(3xLfgf`yU5%emC{4S*o`092w7DbRRZ76F?#|AR zM6xv2z7b5+_PWM-v9Pdl#`{ZAp{2F>8NqoZd|5ov1(wpPv&zRA7sT7+iC8k;T)Ju_ ze#}Aqn#4FGe9_!UWSmipA8@#+Zb@n5qWX^zJ|AGu)B zLQthfS297r1Ci|LC~fO#Ut_ekuZy*{HkZotogH1RS^Ek2i|4vxZ^Fm$??@h9(>+VL zKE7H6>U^fsG1P&ecZpK(GT{E>W)@A+^(tN?jkU4Pv%BKS^Ol@%8;YvUdeE>S`XY+i z&#}}=ps0hjdnKnN;<(dw6({)kV#Zn31BN8R`C<2fqEzQKKfbSWDP;M*8Rd}-a&L9n zs#sTRQxsJkkF8zRy*gC8w7RURC6gjf2Zb3S>34jo^*C!A#o&dhhR_0Mb- zb*Zm0MO`W-3C^GuoX%!IgX};$tMsV&yJtzFJgjf=RlFH?_oeLe^S!W%0$A8YJon;7 zl5_|8;w>(Ze9_Mo`GOJ0BGW{lNP!~yM3O1` zL^8?l6A4R)p9_U6$c4fc%I(akd86{gXiw#hXT8XUGGGZblm3&rJktLJrbvI9t=Rf24r&fH=mEuVeuW~7LMrs$y zY`#k2Xxpu9@UvU!Pj(Cal|1@94FU>`P!oPj?X1@3hhn1&XxA0irdG#e$+ODKw-p$h z{y%$f0v}a%_K(ky0AZ0tMTv?UH7JTg7FL61CL4EPLIQ+EM2C|31$-=bkyUWkLw{_b>PJnVB=s z{eGY4oaa1ey?5pc$;it3stW(IDq@k<1n0jgX&fUf(akMNpFu(@TY__|ah|@6^jEF$ zr!VE@J9#j{N&D4(k(zWvW3Au`%nE{YFO=Xcm8lnNIm(bMHJ4_GdBEd=fKUBixXNIi_*Fzmff-@cOWMOvi&pz%OriZTLB{*qUib}Zd zq}ENrdPLd#Glq7RNl)X+_u~ed&^*&lW`dLUSSdf><-Oa~Kg)|~>!-oUI^bBG>bajXFJfioqM}zf$LCOAh(%!N~rz9<}XS{#_+ zjLD~WylyMM3C;+$b$U!pWi?LoFC0XSQO{U$=bv5;)+5?7 zjLD*Ryjqvcs~j1WA7LwlF-x4{N>{6|_?d7$nT*NCJK4JXo-ba@2-Cw>oOA~PwTAKO)a#7(;PN$NJCke_&yCO1(;gb1>df zG{=lvA4O+FxexXsx<6pZ19YtYbX0^`9gi~!P7fpSdxnlnkqXtrqkt0)m`iiQ@IRxb zLosKwp4j=J7LkB^j0C&<-ycVajfrt!&SA^~y!Xbd>gm0ogy-j6#_W}tU(Ve)BOH^< zm_784*JXo-JQ0p@F^105(R$*O5o{rRQLfmSJjVQ*l;EiJww@AhD<5YPoLAwU>i)Qg zPy9R_Q@|K1H`ROOe!h?~^?0YY{LQeTUx(`{GB6h(|D8V^Gl?;6c&FN~dZBVzIEH%N z1SdrZVTL7t{HJgXMOSB-$&8_S9rcgkp zzkSh^ur^rC7`lg%WU*erC(yGLnJ>Blcb_;&~c7!YqpdeYfFAACFj}_ zx~GMXTw5}WIu0C@YzbZLpd-VU(0&~q6KqK-bz3-cY{?x`GSQa&O-hcoCErTP3AW^D z>e_G|WlP3N$#7dzCMDDctDU=n4sr&w@jnPb7;*M)TcYqAq$JJO{AL&?rLRVUp3bV3volUK1wyb(rL{Fv*Ak zN{h$h{!X&STNxqSi-gYgYFT3mnTk?Cm z6Hk+|^iG(hLrR9)tdnU7;X|=*k`kAVc~466Y{_XfpyD{ymXt_|i08wd%C`b1-j_?v zkv8kcQexSXfmmzM;jtx`OUYbYl0?&L9CK{RDk*W>lGmifC6jH* z^-_{$OJ0(aakeB`PIt!Jk`gINwzs(JLWw!q zW?dyEgKWv4rKHG~OrR|#9LL#`+oUAfmh6*~<88^gX-smQWJ|7)65MejBmA3_1ZJQu zS$eXN;CI#%Gca99`r49l!-V7%TXHod6lRH#i0J)TVlr(>@u`9}%9eOe6OsY8HctenB;%MBnjD}tfRvur-w<-F(gZ?mR8iQ z4Auh)?hguJ*%Govhb_q*i*K*vMODH%%*@0#8135$3B-<>DEndf6fFg%$jp>kv{|Dm zbs1h0@M1lqWtD0Pd+-RHrKqU#kBO75K$)}qK?bO_7w(_EGorBu&B=vtfS#pVu_e%mMp5kkc7NIM;>0BA0@yn zMM^T2e~wg=Z1N!;7GBJp)FCG zwPYMbLdGlnteUdpWQ9?t zcn3w~S=Dlp!elCtEt#NH(}adu?6E!gMpJDeQDwI!O27|M(Y8RqXs%cj;Gj8ZJGAT( z@pB0rMDZiWQ;L=evKa^rNhr^iV9|0#u)abTsl|yg1(?iC>3V^IWI_hQg|76{QjPO7 zL1Apk7%DsUG<_L^H%BA9Ncj|Lyf zr9T+s7+I%T7ch(RiGXu_HTT|p&3a9;7~=@Gb)n5d!ZGZn^M;*n+xl9v7-QJ-*(|a( z=(!^v)U1 z!FZ?R`sAVy&$Vs+QL-3g*s1_l+v-TZ;Y`iSIh$2E7-QI~WLAne?RfC&l7Hsfw(gcJ z#u&D$3|lW9pEyCY_|hWIGsdvB&}NZ2s;^15t#S%E9E>q+ErL{+YuuyxPj4@bCAk|maKJzBe)~w4Ui!laksll34 zw+Qo=-edsBtCGbSgH?mG;tC!0FgK1&+@x7&(Ub}YV+>X;qzO(c7kPf!y{(?%lp;yKWte{?W8A&B#SYItxIhdm5X|8&3Zwy7-QJFj9DrUpZ@*()6#5P zpGX#C3|p5Qwq{w^+@V>6@^BIdV~if)3P=;2)B`y2da?EW37U1LWHH9b;g!syh$7be zX;1xGvx+5)F$U`@W(~zVwXgCoC;m~~8-_2A8p&deQLZMO)v@v2lrQemtUpQ?V~lcL z%`7Sxc|QNKzu=}k)hcuHA;Q5JBZt>OD*BB?r1q8l@Egs#PqG+eu$q}gqaJzV>Z|AO z(X1m2Ai}{IgS84$-5*lVrdgLt7Gn(7YG%#B`vAO7@ADOIJ5=TRP_h_fu&!m6iYV&Y zG^?}_Cvh;w@ca)T)t=vK4WFf1TO^AyhOITs3a({wCn4E5r-y&+kQF<7kz zi)vZ3&bDw82V)G@4Ui@{RW1Lk`bWRltotO3F$U{KW(C)>X7%@wC5(l5nVw%u65I1s z%bInSWHH9DbrZA579BME%CqC}bID?i5m7e-t8Kmg>T9=ZR{msGlS7uiPJnY zKh?H%vt%*Guyw0p%W>t<`!s8#WHH9D^+RS+E%(B!Hm~+raUUbTI6jjs#u&D4!&zOf zK~D`z(5&O95Eu85;RVkJ&Ax6Y3HQBZYvs(-{;pY;WHH9b;W}oKH>kI{E$#pA(5z*W z#TbM2BW9)2J6=ye6PTr04@(wf4AvdYQl4+F81%Gdd;U$yVvOO9A2Umhurv~B)-*3p z;$Vzn>rP1ZXil~~wyozSi!p|+pD-)fmS(w&$rAph3om#+Xsve_Nt|hTC(r-omie3Y z9Se_37Gn%sKLu9T^2YV+N;Jzm6(?~p#;E1HA=S0~$kxPi&3aF=7-Qt{9%cpCvSu}w z;3N*l7_56C6}D(hcYo8a~8l^&3b+&adG!KUS=&nN)qnb5|H}M&pb(*_0%kga4^Qm;jbVSIi&Nn zuGFl@W|Iv6PKTFS%a4)7zGIWtm74X7ImE#oB6yjs{~?LZqH$TX?mCY+4hLh59R3NU8VQW3Jl&zKzT6$^L7Rh3a(X;)YS;O&8<)ZORv%Zon z#uzz#oLLm}YW&iyj0+*g!5D+}1f;qxr+j<;>zcJhvKV8qo@ADqi=LI5_l@{<1KGG& zvKV7{<0)n-Z=^1o@{VThmMq2?-guf>${Xwc_QP7u8s#I478d zj9aByDc?nzco;7-O*hz%13s!fUjKSK%tW>;H`?_GrV@Hd7Zt=yDyMW%sV@l0(ZG}|(aQn2Y zPS>m(B#SXdxt?bhm5XfsHq>Kl)>#!eiGwi)>qSU)%>SY8 zw3(W3iGV6`_UHrF+3)`^v@il207M%2s9Qr;MM z)bIO{3OUYu4;f+_Bm4tVS zLs|uBmb(ff9E>qoJ0R7)=&85;Buleyk}Sp;tk;-D<)VXjze{Y-zav?UF}(3Qu-fwv ze$(rBnw7qgRmnf^37(n%ky%tOI;h{6W!qXJS&T7ky#cJYMSHNC^;^kej8U#XF>5fr z@+FVe4&X zsfaq|>bKTu)*F(=7{k^(%u2^QwdLLq)c;J}XO1t96BpAvo;8J+*>Ai{5_=zDpKIqc znpGiLj4`73|Clu#?_`UjSF;|FEXEi){4=wX@UEg)vp$k6#u%*km__{|`S7OZlo^^e zz8WGNj4@a{Ar+pd^KYGzGo#dws4FFlF^1>=!Yt+apD*3}N6p$PS&T7k{gqi1QFQEB zc!F!1ZOeU;kTS-w^*&B$&zBF|-mF>oNfu)aTYs}zr1#i2zV18Sw$H({Q0RfHR~zKVvJF) zkC~N*cWRYYoB9pNvTY5hg$M^@3|pT-s$=7mt;P3fR+(fm#^?b)W!7-KlPy}&Yu25T z#TX-ppD`;5@2UsTtPdrNF$U{j%u+o-!plYLHEVnwPU2vU!TKCh)AQ-JH<~4jF@`t3 zuvz5!A6)PQr)F)HEXEkN{%y06;94GL+ZuQY$s7*G7`FC6sy#oVW)VvJ#HFRm_)Zz0Fr7 zvBwnJ3Dm5sC5thJt*@D-Y|*Yrk!|Zk$zqIAu5S!mv@4=nlN)dn2V)Fd-$H8k0LR(3 z9+51@7`DD+mg)g0HZ<#SKUu>62;gP*039UZ{U~ZFmk$_qr})i2zBn2si!p{RY9QK& zbjN~b?UXFW7_HLDtl`j1wpKr$yIZp+H=*2AZJQ6&s)U4l27Gn%n0<%=B ztlstaRLweL8CjwdgxX4ERtnBh4(TfA@wVr0mn_B@-ssIN+w;pC7HHPrB#SYIH~KJ( zynzI-+B7R;IYc-ZW0b2evy?Yz)uvfjNfu)aRuZ#Rxo9vPFsjKMn0W>GD_KjMF%?QeTy;!062#u(lh#4P2FE${y}O|v##Dp-s$yphZ-@&@(T zcf3~Lq*2?kYLH&kit-e{X7-O)8 zF)O&=(5$vw1dA~S>r{h95v5t5-zr#)F<7VBpICI3|M^SI-SSZQ8tUpGWxD#pVqAV zB#SVjr0+`!WzEcU2J3M_PGu5@^87JB7E;2Ptjrj!36ez^la<9R>UZgQ*L5LcPvj3z z_5_O#!kDaVgLQZ7{Xi;~U$O`TmcF5t|HxU)=W#0JxIwZ;huIp#wwi#ao>Uyl8=Jr) z9}&jP;aFy=zSm^!l`O)TtZ~dzUjIktduw#LM&2p35XNMUXI7dx?fBVcPySxBDkY0B zCTjw-vL)+Zub+F0W<4ZXgfUt4d&30hv67YWz#}N4^89Ye62D0dZaX>58Y)>=XD`1- zvrheq5EI6<#lOAb|6U`+QJ4NHQ?n{0i!dhZ9JbY0+PbQ?6&$Y$u4%pj z<2CE}yM&l9CM%CwO8dR(tA40i=Smh~z*^AIAeB4vnWf4lq)NwZ$s&wttAJUmmE7&S z^IC0di)0bTWEC=t`guCW4|@(Xe`V`4$s!C`L492jvnZkzR;Nz+DXZeA%$Tf6%%TyN zSUd^VN6>dW>FtbShF{-mMp@673BHJ z%!=&!2PBIyUvIqlKP%TemRsphtgyV(DbwM+Smn4fYrmgABitLTP_dpR2!kDZX%!=%d zb0mu}Caa8D${V%sZCOAFaWqI4Va#&PWL6$vNH|hXE`C6>9+ND>n6_pyOO@-ZL6cW$ z)-K5+jLDkKEXrY`$QIsJ4u{?=M1(O}b8Hr2*C!r#qh^GcbCoyV+m!9c=s!}u@I zg(zEVB#SVnt+~un<$AyGjaV-z*3*(j7?X8Av#7VBmLd+t`be?}W3uKkOVyY4ao@$s&x&Drc7R#=r0G^`K_0mn_1VvhQ@ zjA^TaS*l!SAN8?h5yoUyGAnYcOuSFj7hz0R6|+>i%s%Q^$s&x&T4=C-cjq&|AcQz3 zNETsC)*^$IHp&$=)0-t(gfUr*ZB_ydnEiZ%WDy3epopqw76O7Js`#Z9|I#`9xnvQ> zv~>})l;_Qe`io={#$;V=vy>0Ct)uQ2ULlOhTEeV!oFe6sNg zZR=XeA`DnT-l$<#J{U+iW`Fi}yJr2bWD&-+Rm&{pjmkkgEzQ~^S%fiJb<8>wc6#F_ z4&|2-=)LJ6jLEu$S;`x!yWX3jZOxY~!kDajn-v}#cS#muOjZN4RJqJr{+(nI#$@?z zmMV?T;R}*Q7?ah=ELASEmfw>s!kDaOHY>bb-%1u?zzVA6<;*$@{zby^_vGua99MZg z0sR#ngfVTcV3zWR+1t1!i!df@C9@*;HuEKmFed9#W+`u&z0FmUMHrKHnav9K#)FbY z7_fr8aXGU_qRdD*p6c~J)(6TP&r23zOj}nlOL@bLjeklOVNBMQHcMI1whnuU{O)iN z#$;W^EaeR|HqMeP!U&zSq=aS2uI9(?oFHR7+?%a<&1%&uYDt-Q{`lZ!1 z_#;Dy&sV*)4sYTqO1`@C`tqe!IPI&ct*%*E+u3=*>Z|;X^)(Who15YD)>d3xEuV!n ztqW>RVl-K7)Ty(Pw-M8>*@D$}6DrxxPtZ zXWblh9#-rtjB#3)+c$?El!cJ3tq|EmnA+vd_03sQRkO&yn4+Mz-Ud(xbo}_{)HeEk zwF`aq<*0;EP%i66Si5r5eY5M!>!dL}K}w#1V&hp+bndPDi#D{N+$mIdnJ`D~Qit&s#Jgn$I<=QtT zgCfJ1kHGD|QrWlp%Bm|@`YNk}D!Q9KrU(?V*S$>6;8=zxMCJj}l$&8bR*u^;H^ofz zgx!WCGJ;#bZ&Emu#tGGgW1RIBl~ASxN;U~E3M*I6`*VBm70S!iDQlI7(q8!#kQ z)YdG+(@iR?Dwg?!p1_4j5AI=etEr+S%vDe@(^tHp!H?d<@3I?op4&nr3_e5sQ6^;c zNj*n4r`Gum?9Zt!SU2UlZCFU zbGxmeXdop5*i1{XK|N1;Nm{;wGkAp_pT-(Q;KBX_jyO;xU>##G>sRC;5 zb1dIfU4rG+l~vjqaVW@h7X}%Z>=8jc4kDE=C4NMbD$GT-oez@l9`rCiC!E1p1&YN7p(26B@|Fcr8 z%Y(MrbvKh=Fzy7!C9gg9Tam6cUr{wZo>vX72*8=X>RNh+Aa%9{7CA9DH$8W3tcPo! z$MqL)^=DvqiQ;6ifgV&(-pZ|Ax}4Lxs9#8k{;9e|+fta^D~kQ--S^f;#4T+GMw#%DV?)|AT^gfrB@sbYm_EME1t1iExzS$$O%mM@i6=#8U4I1}gQh#^96JJ5Dt7d6m^ z0(CYm+tV<; z4vOn(*fx)+!D?y{7nO2MtrVTPo-6Ye0()ZKRXyAqvC(vK*ECQe#IE8@z7nvXY+Nv? zU$~@pdDrO0FfP^!bqmTXE?!t(O|5G|c|&ytU!>^tf#h02V@>6L=YU+-xSzQvE?tYM zUAVC8S;tOJZu&x8)^P=I+PN^;O%`q;&2+lUPKl~{R(2L&;zFkV_9P*sMwl+gwa zU+&7qrZNrQ6s}$Kojs-U&FCHW^}1a#vSgT`%%St1(rYw?KNOWa!HlXzp}0> zo|Q##@LE zW4x-4LmeAt2b~PLW-np8P7c`zWsVSBcN2QDOQfA0Ro+U>$I=f@2i)_fq83c`NC&YV zjnek;ibh0Eu*L3dR7TLI_fmc4szk1a!YOg@z=lzM-P;KX(|15NLBq9nYhN);-Tv?L zg{g}3YGyYt*T-{pGbn4BJ=vd`otZNAeYJUM{{Xc>p)Jlj)f=F3?L~C44%PIo2XCAS ziWq6_0J$++#9#NdH7u@OzO=k%rQR^^e6N`o^0Z~_n@k%=D;jWjhrWNWOMJa)y<)#^ zi4?h@aZ=n8nZII1+2Z=z<%KIMs`yS5+&v6g5&eEeY!TLHLo{iI{E|=i)c6W5$Qr6D z8nI8c(#QANV2h{r;%fSFhFE7E&^y-CGqm0wy>aUx7(!BaY=tp@kY=lkjZ(_wMW+4y z-Iy}gO)Yk2dh*v}c3ykbNDmdoz9!K_rO^6S0ea#maVqmYqFZJBKyDK|RE`g<(u%q| z@$X6pbjIaK=U=JJtQRZFg^1FQ&or_(r#y-enM?u)sHef~k6J)E(ly_e7x?J7QVe5!|R(G?xkpa4Yhyt+9_vkN= z>|*q+l^}QYtfA0hs7IIoj&wCH^{^Rppz2{`L6O}-v56bmmv)vw?n}F<%lmqnJ zP`eBV=BK81_HZk8JU=B>=HrE{YR2D7*+1)xd_hL zVE>3#RmVZM8(iRn_#@un@*YgHsVjbU9pmBo`_?F$sw}s|fz7ml`$V#w!EHPwe%s zTNi&7AbwS0Z~g4oZ?5@QP^ujNY1vZl`medO!0w&?i%P6J!~dc}hxWbyMMYPe8vjK_ zHuqTmiwdrX_5Y$mt5HkrK>b(#j7m)?{+nH(!k`QP;G*2t6^b4{yTS?`f4aiejk+r= z+a2AxaoL_9=|BFA|DOu<-@v2?Ijwuy3G-w3)CIY=dy15|59kkRRCpd(r7ElXpMm15 zQuWtBDp&i>56?hc|5p;-e%I(hv1tFPQr9#DMa_O{P%bziKQOWz=>gKF9dv*chBn#* zq*hnM0aB=HrQ3g6rJ6|h6{#$B^S`K6hPtaJC^WkDBew8+1iPEFpkU}`&Xmi$`}bYS z=iSz$GStn#15^3wu9}L)<<&KGlVo=li5t!jfFhBjtOJ#!1E9#Rvi<)DHoLmIp+Yy; z{r{0@cvJ0;F5OJKqeZ#5$Nr>FIlt!&1Q(%a{tYj<3_WB)7vdoQ@18E(!8UC7eh2-( z24$JiUmkqZqSTq+hiNfNd@rW$@ZRq~d9>qn|23#g9H_sGR9QM;`cwwH`R5DvDyG|d z^r+WuRiP`FZY$K|U$<2$zvE)4`cJL6m$B*(ELAXcOGku^#J{5uBPaWzL}z6`|5;Nz zWPcUdS?JNf=(O|MvsP4LqFtzt@>ieYmn`)2h)(|yR28HLEvQ2DY-Sdft-mt$Y68Tf=^tco0nL9{(U1vm+$4`~OmF$H0Nm6;#UyLS2wk4}?1Hw(k5d zuXb3sv;@1VTZ%#_FWvjs;q+jicPn4Ex9z{RJ@i)|2mP-+?CJKQKUDcX|4cgg%IKly z@IC&kcZ8{d`WLuEz0>#5JE^e}E56UMLd{^s?RJO$ zy!`urDhL1jr&@p=s+Rwhhoy*WQO!jUAF=-#=RiF;Ma9EGw;QyCw>#>CROGNl|G~~c z_{8lXl|0&1j+s(9CBYg?u)P+X0Hklc`$Ad;&G+ps?^hM#64|e^IY^4 z(|ngNBQM`oSW;5p_7-|wGixrcsa;-^JI03Rrn}uPJbDHXCidm}^4tX_MMXkIwr_GC z=@>^(EA~~_EUb08q}p){$}8~@oCbfGvGIkalf9N_@+21^xnl?;EI`rpj9m9D+pwUz z#yfoZWl>Ld_LPUL(JJfJmH0dBD38bHf5OR{m0>@P9*;^zxuX63pekh4zxoMsZg!!k zq-c`6pwxwb8?;MGZqF_($}5>NwXndo%zv>w8u@Ag#58s9b6I2~sBZdXxWVd>Po(md2ek=OqBMSPi>J0>@qqM@dy)}K3u zeg>I4hHe6eoZ}DGK|U)ez;Cgq7FZ>dOQY%Fe=V!e9aC9b)sQ=e)ipHgSf7H2?|Ms1 ztm2ZG3Z(V1hV{H+SLxJJkJmfd0y)1RcMR3sn1XVDc@gIocab(!*COlLxuY|3L&%oP zTkP>n$(vH*np9Oo8{1WA01H;;jwwNLi>n$IhcL!klk!RmOG`^!?iu+WPsmxc+R5%I z`BU7;Re`(AJ)^KJcT8!C_dNO%f*n^3&rc~X&Uc|)OKQvgq35R-Of9rZ^IfGSo~dOs zLYzJ!ztAcv_DuEQwD-J8B~wEInfcx+`Nfl`ka`u!GyK&x)qWRlBhAI_2b4<3bLOin zd~w~{O^;CLJ8pf|wF?>-x?HnIvzCQRTv^$8e7$S*OkeQ=UN-n$q786Q=5|dkn(8U> zy6K7K_0=_ta>w{n#zhM)U|gh-;&p+8!ns}9MW|-k zf>XZ;to;dO071d=T2tIUuRU%e(6`FEY9#bka9Z8ruPPQW2b*^n# z;Icvugq%!P+aX=% z1iP!tWZNZOnvU_5SvfO4W~fu*V}*F7E2MC@bcH?I92-?EWSe4{y+}fBKGNCId1#um z@eI$ZdUK|&3{lWU!zfoqJ1=t;`?StqY~1MJnZKvRrDl!xqKji8DoEuuDnMqolk+;a zF@V7jMiq}l#UDP|^L@3lNv9cNHKtydR@JAQ&d)9#>z*@bZlT-Je^mCk@o7Ov=9sK; zW5$op%rc~DX_*-rW5@(D-OrYy&ZgvtgNr9@Gq+p z-yDvABTXCZYAa77a96u35_FWm+XhP)J*N)zV_#SH|m2AE4b!KDMY3Ydo^u9vVI zrjKw>1G7`&5)>|^93vtB4wy5GkiZeE9Akl*Y~sS~QhCdOSuAm}@^?8fcZcHq_#5{0 zr8S%xyiLICx4`@}2$z;pI)7vYoO6=HaW-CbkljeQ1voJkn8!Q}bM%XXdld5ilO2x7 z@uGwL7fIgH!w-EMMtZTIWTl8FjtmE(x=NY1gCEX=I0V;=1-Sn z8&3QNn5$+9eX;!V956@C7Px4Bp?sesF#;Lv7j2i~-UZxBiH%m?J;2=#OzRw>jrx&D zex^9+eV)T{BwlnxEAN>&aXc`dxdJx;ACdH32>I`UIqH0Yi&oynIDHN<_eaF(`k;Kj z1k76!7cGA-;NA!3lzB+th~}3Qan23Qe2I$|S7U+m1M_evxCY>!0VeYTBydEtOKM7h z`9&wV-oQN%%*zrNt-PawdlQ&}c#anx(Qwq?-!LEf!;6k+xO|*@X}-geQckGo z@kh9kz+4g$S6R(uyiuIq2u!=g^}%=TXR}?Nw!q=Y#)}R!e=946)Zs`*ViGX3BI0zs z(71OIF!d7W#CL61<0xB~1M`0o_38X&0rwd&r&J(;BU-y$0z+3oxH|flq7mtpM3i;igeevWhJ0n=+a!=m;tZ{qaPzzp}0pN&ccRn0@A~0925;zw=v|UqQ z$F&Z}fFB54G=1N|u}1-O`1JyJY7Bj?tq#YJ@S-D{z75d#Ghixj7PwRJ5iNfkZ^3*L zFFK;>8-en^2~5I|1nx|HMAP@w9S+A9yy%FgkJ{I(z`WH7t`NBQff@c|(iYUt`N{7> zM(@;)CQ6Kwx>7P+Bl-W=ltkbx;L0Qx;fVDwa3T6AfAw+dyA-%ThlSLByj62m~eMT$SF zkA=WpDzVg#qTyBnv#t|d2Ke^^vqR#jzvq3Q2>Baym&0)aUUbCrOBOKaN?f!!pg5f; zF{}`8(fnKqTwNUcZirLgZNS|dhrYHr^=$?2^*HqXD^7i10oUiJ!Yk4IM{%DnF`fA@ z1GtHu=%e_X3(Q3l7ps1+1m?O>eG%gRAz-#koQTu#xaa-~n7?*{8;bmW1WeN1qO`H{ zHx!uR5@-7_LjH7k2TY!}d#rc0O8S1TuQNEC8;w6Ma;_HF4@&2HZ7q z=({^keGdWm+fMXR-0uM9uM*b_-=ps0v*sW%!IZUyF{PH;3H{Ti6JC63ks(fa#=_cbnTIWu54we)3je9+S9O_4X_<+e7t5@bkyO9Q}YOtCDg90(Y~aFWk@Mm&btFCULR+vJ;q(LiI)POaBK^UcBgt z<(DF0rb=8azsv!qPU52Z#e%IHfO$jWVwK|`!0a*f!7mZYG58_0U%cpuRgO|%=15$u zax4JmQi+RIj&;E7l(<;s_<}IB(Sbwgi(HNqfGLu=Sml@t%mRsvRgNXVtdh7`<+vA^ ze@I-ca(o9&|A#v-$8cauB`#JuDuG!dak0v=444}vE><}n0p<&di&c)KUpO3t@uDME zePjVMSK?xoqXw8|5*Mo+O~9;^xM<}_LY~%33}+B;(Z=&-Hcox#0ynu6eH1T?fmtDOvHW~JFzZ6~Md+W`1M_Ez6LApPFS~&Gv=bc9bAUPG zSHgj@@^>mQSrTXaFGBuGfmvbb3(p_<<$7T5G;rbVEe*KGfY~l_B3>fv+bc1mB+=V> z(qrha@S?*mM@SqD$GI$E=1N>FztjM8X{f#kepv@ho1rhf929@A1M{xL#cJmt0P~&1 zMQi5+p>OE_;4SEg);@*TE4r9t1Pz@+>R2^_KFJ{_10iL?C|A?~LFv&_&J9;f7&>wvjg;$p@9 zoxuE7;)LCBedL!N5<}&nBbuN84BS5qec^FW`jXbO8v8ApzQMqyNv!Rc2yt+3ocfA@ zn;wV0x;XW%0B%(r`tFTW-^0MIk3-+)xLuv-qxnmp-=iPLi;h@vngz_c5@**( zggBiC%ql})cwAAOt^?+7iHjAd4+FDN;-bYV^)EYt`BdU!l_T+Sv`f6`h*ge}z|4|3 zk-y00m=Db2PH>dJdSI@RxLEnS4VZf+E>`~9fZ1i}i=4l2fJuCUiyL)+JQb%00duOv zMe{S^3V@j>ak0u#2h8P$zR2sIJAm0};KIwn^(!%=B(fh0=?@0uU%~Ee?G9mN4L2O8j|S#kiR;aFBj>LUm?nvf z<(FH5xm)6FKQCx#5IGU=G=790O)0Ln(EV6yzt2F|8-_mQFT~GB0QZH&D7}0gCj>|O z`uqXoC0=yc?I;A-59cOI3L7Ve8}5n2iw?Hy2=`wT&K0-e{!YB;p!kmD7m_dC;BZ`l7ah^^ zM|N+L7zW}kl0L%yC=ML$Yuyuu3m<0)_h1~jG~j+2h70#ImG7l6T)17*_evNpTpyM9 zlQ?iE1NUVdxMP7kW+UE$j!1q!2IsTmz?}h{HxAs9z%7dd*B`i+IBBzc_e)y{nb$5E&;ApVte5`+YQ0dJmMZ;eiw=h=_gMC?s;H7k~pW( z7qOq*1I)3{0)WG|yPxHy{Ed{lSRvkYJJP=+rT#e&xP=m%5Cup2Rspk4;$%5wy=i^4 zPQDkIM?1l#1NS&E?@F9qULKFMKEizp%;4vcz+vM;{9J%@!+}{MaUy@Ea$ME=s2t0H zxz50;xYsx;$F0EJ-3gBJ_b@OoOI)=4FfW<7u>4V+{t1}(JHe6Ne*$y(^GM)`RgPi6c;dia0L;~K;C=|q6B1{~ zL5N@Skf%QZbIc2zy_oIe6kx^~xbXHt_2vdf;e$wo9BHFCjRJ(~p7a^$HR=WPcFW&IvaVm^6ut zWp^|%bK<})0cNel+4;+#UY0&5enSSs%qVu3 z?@v;@0(RP{hZ7R85t)>IPWPdobE0wneHnn%$qsM=PjI7=shPAa(ZKpzj|qv zw|YT+dHu?BiVJ)ND{IP^R#!}~T2h67W`Xj8!Xo!fZ<*JVclOCk8IZMVZNuxQ#gGF+YVM#JYyCJA=*p41ykL{g)>f0qoDW8Gca)WMC_m*OAq((-GU*5Tg>>nYFjukF&rKij3LKenS&#xXL+pWHBzS`9^n zICM(ae2Vq?F7IF;0_XG#+UJT+?u#FI?{dFKxw2n;RRsZpvBCA6< zg*W4%LLx+@dwu3V&M?v}CABzZ{=4Ug`-*h6rd+ zI1}$@z;>b|er1P+E6WR2Hgnc&>*|l@L$kG|AU)$d6w7M4Gkq-tp1?j&V3!wp4SZ$= z=B8TBU#Haf_6Ck?rKE8z6B4({b`?TyShn$8}Xd~4gPHvh2f=NGO`UZ2?C>e%2uyCA8fvA+eK zjUQ#Vwf8=*t$C|+b(_DxCufKMXshFe_AQr>FU{)RcPU?YJjShI04g6pX9d3X%&q!1ZbHn4_T8bAkuHZS|(RxboHp z`buwl14mndRq1z=V<}j?(!1Wkb5?6vdZ`t7+1)WcEqVQ$#GWInesx>p3045gycO<5 z*6K;vTA1C|TH33F!)~n=C`fl%6&B8NbwKw(mo03)$wKwElntC1q!jAs3pUm8USwN* zOJ2Xp3W(6Lu6~w6%6H)fo36z9H_?O=9mhiQ4yW!!>Jq#X9dF~kkyGE`y@*qX!7r~c zZWK}tEIS*iQchV&6^c~Ly!0fiWl4I9)#6W2olR}bjo1o&Y6ZT6i{@B?H@vO*^aS3r z0=wBGh%?`p38m1{ID1cmvk^Y+%cX}K=A-Nr(jfJp;3XGQgGlRx?0W;7t-znGz)P&6 z9j=dYwpUi06_^K~29~5-R=|&%K~wf^%7CH^IN!9Typ&TnA$2jQT$FnkTNF)j9(X9) z94gv;EAX#BlmTl6&||#Nv6k{-1$HIRZu>m>s)F?4+3#5J#rV~2R~96n*o2cf+lPui z9I+I5xnpe`M9q5>8v9tyTe8{*i{J=sm3LWX~&rbCMng%WE*}H$x$mHa?Rt~3Vw`w@2XapF+sWiL~;}o6Auv?X9oWAuBvuPwSRH#qWbc> z#VgZ_YU`Jl`yCDbC73WQDW|su=s>*bNwa3-Plac>!vk-HH}Dm@{Oory4m3ftr}^a$ zPsirG@k6s3zeMLP+RNpc2$7B}(IJ0#WpB@j@7jB1V;uN^;&nIzDAS?<>I-;BX%c#w zKE!IiJTt}7cody3rPBkfoR|H5WM2{l!GN#^gVCzC#{N%H9qp$3I|2onsl(b(%;vo= z{~2WaB&jxeeOV^L1vZ5$j5Ge(R>v#tZ?Ar*ajpav2R3`C5!)zF&gRC|T?2`;#m@G^Scz-uCZ zYsCi@&lA`tWu8D{I{9dFz_S5Q-M``j10=lL$&v=#=Ya+SY>R34|C zc+cn5aJ&oIWk`u$^%|s(!{J9wMLi3y8PO2YdiP?ZC@-{1g(N^TO zBR|QDUbJOJ60&IJ>}x#IYH@SA#YvJDcS`%Iu2p;dDc+W3E0AF2jBh;J+mh6NxVNPw zg#{~88WX)OR*EO!N%90XG_6c^B(L6wj3P2uAS#P^vpdzfIWHCFEEt}agfufOFn0e8daN9GO5+rqg1rq^puYuU_-I;rjH5A8WEaeq z$)X7EB#aR)(~{bcV1+r(#@<%T;q3r|-_px!DFx0-BCFvRry-xcJOSu$L10@c%EmNs zCMS7XD2H&co!zG-%cx#z-QjTF`htvQgPr#H0!1nh=?&(U?{|k;iitdPLpjtPT3+|Ga$! zwHAgQqvkuP_`?K)RB zcnf=&7Gol1sooM*_7C0n(8Yb#8x}o1?}co2#6=y2C#z#_%{u4T_Zac8tQWv~R=6J6uwV16w?S z*Nu^Pi+=!f+DB2aVfgi*6+=G{zrA_*#mFlhB!<=Sk(bVTQDMq>jFI>u~&Q_N8T7e>TG%HdYFj~?uHFTeaK)MWJ|4!42bccViL=pte z-9?bS1VJOEmWtF=tonGdDxsJRHV!4h@LgGZH}uz2iH>T>CUELjq|W8keMn_+>K8~I z&s>`4iarB1CH1|A)L6#7hg2UJ5+MtgJk>QDL?EQZb{oXnpyLJg1h@ zikmn=O4KgGgl}k>ie6HN7MzPxQz&3OxZJTh{}S|kD(tp2H_(pZE6AEVc#ngZl?X++fTz(HVhZhso*i6IQ;_;2r{*DLv4>Y6 zRl=zsASJdV9!4scW%%ueV;eJY)zwkJGU^Y8a4r5DDL=~&$GhkSTxvQUC`@bKNn2S* zHCLs5hdJwf!^6lPX3|#Ry7^FIHE&3hbqoou7xg!JK9wi$={O}eMJ6I8HcBQV<>Fk- zMM`X=@WPK)e5Ew;wx9Wfm{(h<{tVIH~ka50@m7~BCvFbxgY_`#ciiizWw5w^O zk5)VtrFtuH71q2Y6(@0~p!FJ(6tt}BUqENB-Y_2@A`)5yi%Ep|RhDVQ5G|(=DG`Bl zkP`99m5#b`oMluxiuabadWZjbta(zrBQ|_%Kcms|n$t@OEmdJyrBaO2X9yzkxrELVPtL#n~tC^@J!UCG2T1-by zMoLUaR1l!w{}FZeR%?Lj)r^H>MJzP)hY<_MQY-`qfoz!^hjuhjpAZ@i(;*YlP>z)7 z!K@1RH`a))cAr2O84?lqShZ8nl}0Ot}Nnm~zYq%95+jkLcQUfdorzzzr+O;lfs?Q~fq;X}y$C_{+YWm(_|f3oRXcS@?=}hRunfuNdce zcZfKqL!Cwycs9=xX?SeAIEt_#Y~Hhn=8*n%uNTNl2bH4RjX0#oAE?o z2DX4{rWo8G?!z^!@0RspjoZ9|OH#d<#AAMdh9X76dAYF)jLFBw4U zJ`I-%mfM@a@oeHmy zWdBnymCmWVkrH)G^L|msf3RgQ*|KkuqJbdMF@)YZb()>xbp^``Y*{f<9mIFcMoMt) z%?S}bGqDc9s{>PqV%b1j3RkGcz;n-SG^(;8zKXGhjaY$aXHu{PK0>_ISz8LXiiO1- zL{c3l-lA{Ge%5L!{FEk>%_|o>l2?5MZqv$3koqf9804B?=;$a-r6pP4thU{+P%e{U z4SCu{Q@i5r(7ZE=B&~(p5s4|dUc6zAl~kC$#~Uc#g-makJNB(Jx8tfVoqyE}tQR;S zc6t+D02MQZg7h@2b++FMlq?qgD2CPn&AXh*t3QDH_QZlU%P(OgP)Vw#GHe%J&}NNz z(?5nzDxo)UV-r~3z$P^^3!N%YxGI*s`o};Nj9-39@+wMUDVn@`7Eg$_Vg@yHr-kWS z^WLOomszcI(G|SYh?dp3GuTSOnvC5?gW=72u>mf{Rp8?799F^%R3NXx1ajFxRKNwS z#%jJ|7x|-b`S<{rmM7pUwJNY<>>6(+U<-IH>F~Dna|gDP%st}y<_(wNA_3uA zk~XQinH##^LIkDMmso**xCh~Y^0T9X!?>*dj_!r>vICaEA}3 zD0F($=EU)E9AAV$0H)dc5>P4A7$}6(x z8LTrwGp1!>PMKiY&HF@uQX(i(GMrPQkgWk=;ZGT^j4pDQd3;oT6wI`*a*8 zkU1*&1a~}-i_5?Z`*?HO?E6!uv?exL8+InxUGB!<8(pXYZw$K8g(fb+H@bWke51>D zsylR8Y@4=bMAtzpHj#4MscCkKI#_YG1}WLqQa5SemlK@Z$*qa20dxFE<hww7#v;v+E;11Tt!wa)Ja(3W8(68Kq zExUh<*(+v|E-Qd??x4+J_Z)A9V{$9*Jk5Ev;Y4?<)zOk<1!lPDZi`k6`}O?`*Wk{_ z&AV3;wV9poXzXV-Z|&H<5F&2?HHPhE&jd#!GI0y%Ef83PEP6;2RbkSIS7|pH6WHd< z76ax^e&%IBn}CrKguB3UHoKDx_v}uA&Vn_KAF8$6iM)2}i{cJRqGGoe_BGaS*c5&l z_l6aph}A(~zTpZ>w!X9o@nYF#wa)BI%Q&1Ig1b|}{)Coq$P-mMHa{>M#ArY(I&W+7 zE>J(jMFFhrrr0aH4+O*{62Ux{swa~lB zYP}Q-y$)LFT``25qViI(X8i7dA~3u;uh2s8Pgv;n<+dQ~LLV|8OyGqcZoUy}u+Te^ z7kYiy4D7r6J}6@HHg{l8`!Kr8Gd1~{;t!3=!-|_~j`S+09N_gI-K180nqK5 zt3MZ3e-^F&#I0)=Y&sosu>yP#sbp?HwCV!#}TZ9scfI3K2Y2&RCQtHPim3QM`bKH3@PO}nvHU{b0zA*tak zzTZ4~y}Ki4BekSSr5y;GN#m`Kr0llluRD?pgGUZ4aC;N9QzJeXC;bz!4~3>RD0#i? z*JvLEbq#)N39j`d`G>5*G*xUy8)Fa}a?toebAZ9@tm}|!<`j)ZDRhY!9SwSMo_2Wy z)1cXni@v+XJ<+uKn9!>+#ofHmNjKMHkESuf>UdcV9R3SAkT7h`v{vuIU60>7{m37; z5nOJ?gjaM0SR{>>V(Qd0Y$>Lma<&{mpO3qU(SA#ktSz+6bF@R1=>G!nmW3PQwoD@L z!-IU!@e;bx$&by`7TUMlBFB527gM=vr08;LqT?#04&zh+scSg(5K`-Tt5|vhH-w9O zkHqbLa%jXV49jYCd2f3H8MIG@UM0i7LKVB#5*s~csm_Bl{Aj1V2ZY~fU;?ZiF)?vMePD@cd<$rqQCFL0?#gaWT@VCNCvY@pn(VtKd z*sSU{dG(J7iFK_-^Opb*GBlHLt!cPKju5zwXDUq{coN~_Tkk0v=a4&HVs@c!77)KM z2%1UEK~d4=iki7}rh zaAM4tTPu2X;vbIrg}p~fvki`Y<%5;|s3Bq=dOq3XPudz7z^2p=sWJQ~%i$kQGh~-^ z98K5))X#7ib0)^~Qg1~s%-x+<&en#Z?p9X^E*k`<0CBk0nuk#yzar_i`yupa_7I;$ zBm8ZU?8gX?O{}28p)2wy;kP5Zi=eIf#g5(Q;*)k=TN+QpxIQYG9Jz*iE0YxXG*5VCzdk44q-LDXwrw7PjJ^Ztgn%6073gtR?i-Yb@mW>Cv%@I*yNL}x6{ z9)^^dD;(F!T*2OyMe9T}<|d300-aVxik0vxHuM_$C9ijiKElE!KU(r#j*+r-d|)pP z`-cr^qYj=|wdcc83G~wh+<2CTfiGB&Tc_m})zv$&DY9`B4W+*m16|18wzxEHtVAB- zYxP)+z%_KwgIqbzNut$A^67P3lTTmqctP^%u7~hut;1XC8oaGrfq5-H?_MlEADYAS z+@Qq^CU$RP(~j#Iv*zI65sA`@-za$lJO4lS-UBeJ>ii$SAuIt&KvYn)QKO<#Ou|&r zyjc)-WC@7AWI_azGzrU9RNSIgt)g|{o>jkAEp4quYh6|AuC{8aS_f_2TD6Y<=kuI( z&%5$M2>Sb%1NXis&-r|w=bY!vyUjC7IYZIaSm3jJmscN-vsSA&pd?u17vLCEAEG`b z`pQmyGwa-YQ32}FjI%T4KvenX{PiG7x10~aMBGizgV0jkQoMQw9QwziZx8SOQE66o zcInwo-Am70a)zV>S9*2?x3$c8+F-J>^RNy;-=7siz}LLUVzu-yJ$pH{oUq1}iRZ?k zzR!%6AHzsZ?ySE)w2^QEn}yQVV74VwwP&6dY>? z#+c^CB)U9VGIB6!U6Mq5*Kke`4$}4yIdj@`WPb?dbVWsqGUE$jx{<_Y5iv}UC+9c>a#Y!$!{MiI^?UYbEbU7 z`O)jm=kqWihv#lu*wgZGOF%j9=qmp;h7<-oQTU)e&srXP=CZvH6v_q3z?*~60dZ8C z$D>kIM9T-*9k-z@Yf#D4*iBfE-LyNgJ8~^{)#qckaAo-DbuQYCny+{mHWk`B2g?zA zO~&LC5St@1K8^CW$at+s$rhng-6yH+UY#(Wb`BmuOr<`F*aS)aGh*Kg_Z6G^FPr+A zP5rM;-3}d4ad$wBpBwEQ^hZo-J`l0)VvQeYRkBjV6k{@C%GxxWT4_@k+SDeSdZJA| z1FYr@t^EUPGHuax~DQh3t)c+u+tbJ=` zy-|<=5gKF%RzGD#kOk~Yg zwhFN?M0Spqt>fRK<#`)>)5boru?+fCa6J%H>yiG5*>e{;Xi)atg}y`-KL2>rDD*3w zf?NwFob}7~K}fr2eO$-<9EZ*cXMO+5q8TVTr3(_Xy0U?e|Y88PM z!k=PS5t#px4xC;^V2z+Kb``N8gy^oOd#lB)B5pEyx2uTrF{xq|vA|zN%%gNs?mSsV ztW~RsZlzdFubzQ&{0XPOL#qfZ4REUy#<0*TqSdV;WMv?$h@)0wA#(c(ZA_%e66i^iLzFzc1A$(n<8Q}$68 zWzG3())CLbAwt9QGAWH~TfiQoA^g6qX)nN9DjKcbq^(`&tUcET&EETFI)*38DV+K zUXAQ`A||78a1UZ?WPb{=3k3HPVrNV2HN?hCtS9zrhUdAa{vx{%AY-Lwl8RtladkL`*1h>J;-bPI2^h3nd9P}AtDyLr~rskk7;3+LTBc|q{ zA6VHS#MJe0&S`3vX|l1EHg>*^U14K4Af{%cyAfL_<;B&oJUArfZ1g$Lf}HfP4IpgM zW6%njjglOLCY&X5)GU$bjzRO7DISAnWn+fL5l^48AS-+OY>7_FhBQY>0oa};&FV8L z57LN|MoL%XkYC1Sd$i&#W9coANU7UIWG>>Fh&psYnT>K{XQNBpY~+qH$F$gv#=&+U95c3gOdH5-v`*DMj+3(neIP@%5j@PvDJ0>1urBmBCg}%5 ze=>Ph%-?5({s#OH{+|!{e?H{@sczj;nW65BLdpDljr=|Iu~6GhJoV_gW(en+@BARI zB0QyVtm%j;r6-r>fq#(KM`RCRKu|HhgGR;vY-6w67;hw)gxqzO>ov0^<|Yjuyv-Kb z-ZnPe#(2o4Qm5Nkjg7U~*vU5b6B}D=V|UuvdK-HZG2SxXIpATJnr2=@OucF64aC$m zGr&#;!)>h0#%9=9m5nV#Oidaq5VMm;4&3k^P8#3YAO!v>*)}PC$0u61O-j6si&NEGYElXx@qD-EAitC8iAOxW zWqR6jM?7k3>(R_&c9029DqREknh~*j+JtbPjq9 z>l*YZ=-Na=33odD&azaDtX#!{hdUQ5Se1d}_W{dLF*5d7j2*iNJGNr0=@#q=dpj2N z*+Amw-0ARp%T_V6`G640mDM%K0y7KDtb(4B)6WbIzYkfaijg@&F=NWNKE!(1vQ&($ z(ZU)quuHH*Rn~^>n|jUbDc)4HZ2a6KEIymf_gkVJBP@ce+EOv*QR&UGu|YOAphqXRvI+@^@RYD^|bBOU5%TO^gZWqRY9WaJX?Mf#}V2bN^zZMJ=DkW9zUbWg(jGVg#nP@&> z{W9dpUe!MtzZC{+alOP?iw{f8v;_03iPCalS^{~$7j#4k?4Gs4@%IwRCB@V;j1h!c z*ur|ve899?VK8qhMjI-|yeWM-HkP`TIL{S;VS>`Zx>hmTdQ3{ur#~*559=NDxInF1 z$Y3c{T`(sv2#)dv-0AR|kHH{mmKM*{Vst_~b?^d&lQS(MYZi)v#76#i1Z;{Bf zzF`?}6brORk6n$w7&3q}9vp(d)!3$D^q`7m^y?n$@~{u7C<1 zcz`$>@n1?lB8c^~p5U!4CcGu-6sQ=>)mxCMJW;OcAd4q;O;ngC}-`Cw77-c7`YV!xM+V6Qke>^pymj;5xwf z#9r1D^UNR)i|edP2oI#uG)>6A!T9I{eFeLdEC_ zUV6?9QuU75Ho)#dnaT%wnhvs9nJo;Cm2)L#N=IjN=711^ zQa%;Iz$bAG%2`%1`as3{3D0OnI5U5xYZTh=>m= z8A0GxG9(0dV8e7JFUW$yU?&KTuYM#*XBF9%&3f`k~F4iZN%W*_^R{ z!ojqqQCdhvWSl1q=J5iFnf#ew@~#t0Y%A)h77?lMrx`)`3LEw1U}t!(!V%v~j3rVs z+ETGZ$8bMJstF$nlQ~c^YU9b|%wPcgwNK5i!Jfl*LF? zeS@Lm_e;xGF|z-x*wO-f@O;KR5{kIf;lGxpVr0E4EY+U26P#f%RpHp4RE%X*45I#m z&4fg{dEWxtlL|&Jz3c2d3ra6_zO5PjNu>8(RnpLzp^^~es|;GD6%}JS-dBv6-dPc1 zeQjAPM%Jgo8Zem0kNtvOhV2mae%5cXRX}mfSM8N8DFcQb`o1-YU0Nr(S<`wJ#(L#n?>l&zIa&kBZU9DmEakmE_T46Qp2PD8u|ZpDLM( zQU5GK($`3oU>0iU*9dgQFPnd#2 z3tzUQ{HA#fAH_Kv15LC z+{dFQ&Vweu_%q=(tP6lq^N5NuPbx;As927T4YIL38)IG-E`pfKak-6E*jVbT6Rx(Y z&jh87Wl}NL_8H21Ro$!-|}56F?yMg61dSUTw^4of@EWywR5eYBm6TI=ry*OOQk-UKs~0X z57&QF&JgbT7ugn|Vzi-R%$w4eV`Hgn(RnTx3=@Kj(ENp08){s-Xyt)=2g>Gy}M7Og0te#;pda5dGa;hs^S}oK>_!(uZJkruy z6NyL?3k4maU@D8Q3I`UJ_d%({T3)~~Lw^{x>G4NxVWPG$UqelX9H^;S4*uR-WP`9* zGIm!LV?&uMTtsXbiI`t9o3xc9r`QsnYD>6OV)XGciRB=+Tw*NY3W>3V|0gk)@K}jO z5Ias{<%r!Su?oa~A+cGA9WSwYh@Bv@1&Ey}u_nZREV1Q?t&|udap3}+-=A8{I*qys zzeD()QQ21oN7_$wAC+@(&a&qE*4muPmg@TYoH~5YyhpGs22owv(9qbL)7VtoAc&lx z1z$6*!PEM6mDRPaISu@p>7tyy>(u`qjZ5&s)0{<(jZHm*rM1niwaat%9+IDjWVcVA z5@Y;`%H{@sY`vke;fJlw^_30t7uDv}RJK;`f#ccQh8i)0U&%_305QoN62sZZ@w1AL zGwF=QSX0iZs&A-lUSYgZ73jbDxmJ28r=20jrY_;ZInx%_H#ODPBrK}_u6%1_BOKdc zrr@|{AOiOKe6#|!7|21($dm~>7ERnflG+`y2W6ay#c&M502So`wb?_^USgy_bQegr z7FRYM*izd%dir5Gwm?W|GjL{6!&x?B1)`Nl+8m?Zz!ug-#&9nc0tutyq-GF}XhitO z4Wi0wI4u?LFtNgt7sc754!XB6x2m$GzB-C3uB}{LwWKamI-@YRdO>A#w6(dizO^M% zsyv_6|FI=5O=#;7D>c4KmGkj7=aVciTIyBzWL?UkH#W=^H0x=$<%Kcf($+VkMmDjAjK`^yxtp8NO4uUfQ9-eU zRT5(f8!Xe5D^)EfDwk<3sd%+wh5lGz?com_=nwcIik4fOv{{-AlEp$VOsLA}R7GTA zT@jhaLZ`~=k8D<36Y5u07aiBwQWYsrnpfi#T4Y|ACDe6noODxj7PiB(MzF<(WX`82 z7?SZ~JrTC0nDKj-^)x9JhtxAA#vzsKpKzm9%y2j0Ot?9NRcxy`C!r-}4;Qy2l_hq= zmnl~&->WjQ0jn~Rvkn_IB@6V$PsJX6u|{I_1=m(>_+m2#Kx*Xsj!dBSpCzE{xoZ8eCp-9cVhTXTbjvLXO)<4SK~(^&LRA2(LOGT; zm19{I%CW2pRRJu#!m%n8E(bAJ0j8m*a^#)Xk-tb-I?s`t;YVaB2zNA=>E48vh)fie zSExgkmi|$tr7pj;^i!(R#;#<{@Bv!VKr3q1O6|Xsyt5W~6mLAN&UzUYWIX7lniTW< z2T5g_+}hLRB~||2>RIK(aE#tWzswEKI;wL#y(Px{^T6HZ9|E}xCL@ScH!f}(QeX3% z$}Smv<^=b%*VR_G4#~^Ix#^WkGNh)twz_p`Em_P%X2z$CdSOTn=7jmV(My%JeQl9L4T5^g0Zz+|4od~>IO+>My|;5f##(z zAM9*hqFKcFEVgpRVwv}?-TNfR`kiJG16Ifz9I-MpcvmcQxFNFWNXPm+Bn-s(wm9`T zZ=BF=?_$U5qKit5&yqGJJ~TdXti3gh7@tM&Id9C{;j7;`R+(lIqjWZC2?ScgE0QYY zP%};_wB|0B(``J1n3=&VfaG2@V)-P)!OL1SYx^LUCH=v&Dt5jiR6CWrV7=p5yss=X zgLg>Nn~jJ3aD!_T&uCUw9E;;eX2$K@W9!#{z@d(H6h#QxaV&myA~S<0>}c!yp5Lr; ztd}*bk79*-Q(s|4uxBe#!CZ^r6-r8p@qM@hB$*iph&%|6p1jjB&WF4@#;}9fVvMg- zQz0j)&w%4}9T{o3ceAf$W|&KT`yKn}Z4Ui2t%n%XT9l3*g~d8zxc7~FcXF&JHH#R( z6ac~2gYX#p)!{+MJJn-nSz2fxjEtmxw^WS@3!Fgs{4Yv(mqj2N=&QBe~!>euCjlMa-8!Z>fsM>@S!W?yw&9Vnzvu z;}27QzoZ{JcPvJFUxE=k+%`BeXJ(XekL}{hpX?E@hgOnfYU+_J_xr0h#+ju0@;^Tl z)}#9Jp`ypk;AdQtGiP+D@2seyp2GygIh3V2|NWCM4eL>Tr%*6xeA33As~AwEV&QT{ z1XGDU^{hK-#dBdjDnFp1T+%`iTfJy*O(c{bWvf^)i!#(z$kowF_s8oI?`5zR(bn3l zKY6Y=PEV=m;eB1~8)t2}-K%$%pEAMFKQI^k=d^_@OXKv65sWGO;BR01M>sz!&tnC{ zHpp=AhZC#gF>J|hT{rEb+c9-8_hBE76AXJI!}%W^n4lewM@nV}kqifado1>`dL}@Y znSstJrP+PZYpCg1%tXQT!=7bNoF6ROpraW6Rv-H zexJB{pDviYs05*A;_AKPZOuSRX2y@PXWj35%MU(|$IKKA%S}Hg9_Nn`Of&ZE%U|t1 z@W1hTW_g%}yM5CdkC`o)_1Lq%Y9Fsz8jqPH81Xh@YjRg!9FI9tFe8y+w)^VmZo4Fm zQ9hK}&GX@raXvgs^ze@G?Gd}}z^0;jJx2@1)W!79mvuTSPES-YH)GFojlFfppM~|P zJ~&S>FJVt#S9iT7!T4M$m<`y|&-+}}@MgRow$jXux3OoP9{KUEXmqq1?x)p)DZ!p~ zdf7g2zY~u^mxCVO2c3=BUk*IS!zdrt3MO3knz*vp31&X_4DbK+%lG1KF*P$|2ke=j z)t5hq0m(>31`Zzrc z1;eKi_d#sc>9=5Njn%Wr)3ayUqfHCr^eh$(pWE6CvE1k0x;|b{gQti2SsbUQQ80WG zZZKlK9{u|Bcs)&VdK%;O{75kD6D*CI2c4f)J7h1;%qYX2DJNZa+ovjqKY~x#q$K1> zDvlfCB-Qi-GNdh~rC|DYGEBTFuWfs?1#rm*2hV{jg#!p$yq{<9{DH7Nt)v%SI0@7ij#aDCpo-dtgUO~B>&NpoopMM z$-{btAy%?NOQu@MBU&=uO0srRtb?p%q?V{&aCC<8o5HDmG=x!gabBF{VJ$hrYMzNB zCWe_-@?R~9Sjk)c6=sZ;JU2i|##+f6JOzlbx0Q6;RY?xCk^{74p_TkvOX{uU5S{`= zXta{YwPdlCOu#CXq0mZ>(~{AUU~!0Wqm~?ICC_QeUY6BocYy{6Sjjjo+22Y|(vl;s z^Dxy#Y%48Pf7Y)$@BXw$p|ai?Eobyfh1F+$7@NEl`J2uFaxcm z`w%4=U?n97s%J-cw~~jnWM?ZGny1cFJIU2r;#hm+E6saa)`ePq!>ZF0NkO6t+c4(~1}gZd(mYT7J~5SK*Yh6uA>8+cGpm)|C=n z6G6bHFA|G6#7Oe#!YXW2ti*tvWH>~hBfY|6M(Eb!B>7r$xWODm^XswAwh~=kPLj_` zejZz~!Q|(oZSef4l0Y16gvYpSQ@s-9%FowXw5(z1I>B++CSX%#*WJQNq^0&n`Xq}% zM1qxA4BL?JLo3nk5?9I%Cg0dP*hnmf3Pn!=W3y4NokW6NPz*Q+H`RKjTw>o~C^3y? zy09QI0(tYIXwD~zb$*1wtWc%R+-0c971Yli)>T z!MrYbJEp}9(}i~u>fsrLMvF0eoP^eSCT6k44AX_T64StORoc|4HYMk8#2ZF{m5lMB z?iTXyMCCEMlM)VXITU8dLt0Jhj5>xm&Mlxa~GQ?{XrB0%of|DRg0<$HyOd$e7 zRVfq#_tYDSF%{$(iR}fmti*t<Rd*v(;;gy#Il#DbprZV!9lu3DGViS2{mAGL9AH&9je9zHS4ig=4;n03?v8T zp}Fu1|1QF!#9*vsILnR<$b(Tz^L5b7{HRq5Si?;X_7^=vmb?3-S|CwpK@kc5yl%wR z&2qMof4zJd_v&3YnZb}I$7+RCvC!axGoLu2(y`vvEWrd}TT6sxPOMye)61XiXKj71 zS%UFwE%j`DIp>-Z$J(P1i3o!6Y%PP-m22-OXYYN8wKYz&1moFSZdoi>??3dt(XpB| zOE8|T6~Z#*dgh=%WKFTQF4io;c(#u9Y(0GAQx`batC}Sk&(?9m>W4kUIay=guCTWD ziil8VN58&~M}n)bZ?n!F>{w@NmS8+vCkQKBDGhEsY0AG3x3=EXEWvo?I#F0Wi9;Vg zxm)Lh9BWDuLr;Uj#F1%@kg*gvjpSWI$2nzT#@^S?%`PXYnEWV`wveM77tOF!xissxY4n8 zD1it;FkTK))u2*zWb4ryiv2P}>`=MCxnd&fFXvjpR@&JY&M)d}0uYa+88>p9I5jOY0? zg=IW{<@Dm7j&*Pu5)lOB**Xi-%nZ{jIoeFH(TDq5Ti0rqV7zku#IyD92d~)AvHqx8g7Iu!U|EO+ z9I+3!wm#A z%e0M|aZ`Jd4*sQVA`M{u8J3C1herAT#ciN%&cE;HSZ8XMV7wguOjsN@I%E4{`cJ=dtdBHHFdpl2VVRNbq?6`+=2(^Ek%%A| zk97s4?oJhsY>xG)W(me)T`8#+tz!wW(mf#b&ar$t-n0;+(nM{SIrWP zSFUS?#dgTR5#S(eYyU}FiXVTpxsDP$+5{&Kyw0)aXqI3+Th|NA*y6}`gtc|1W(meC z*A1Sne_y=hJ;&OEhw=!5@oe1)sjIKY4}H5%-N8llI?WP{XX_?m86WPwwrHSZ-8zL_ zybm6m-&1a;#P*b5TsyA2V_i`}4&D=i&9CKKD6zH7HGpGXa5y=5b_ko#x|I_9353&7k9E7Sva#nF z#h&6=4Kox=FrMe{5SH&k zSYK+EU_92{!s^dGw)^fsd!}Oz;n0O37>{)iq;5rYN_Fr1wzvIju4W0w^TxfxGM?wG z=U6XjmS8+vzl^ih+uE8m8;J;l@ocSw)Ont^9P1C7B^b}vuY_f0y|-u1ny>B%qK(mW zxX06N*!)`lH6^x|-@o_pE{^rIW(mft<=+S^T+5DCeIybQ1morKK1h}4O)Wdt7n&s) zkM&z&_2(Yji)VhipJV-WE<^}|@mTjms`@h1AKPufifrro1CF8$-*Cd_d*gSMSa00_ z=_9{$tUEMIFrKaT!ZM!!-k}*RlSlS%UF$_mHv*$Y2>GR0N*Ez7khoRNiBb3OTLR&4@ zR6gQZyH!GjAQ&%)k3#CVL&v&TvjpR@9ut;nhu2IiYj&&|RkVb5h7CCk9c4dGiM{WA zMX%X+sr&1QeowOm<9Xwc!ZM@H!1JCv*|C;YlZ%-Ko9~S$D6!r+eXj%FaI9}NOE6vz zpA=TOZ8+9hHAqAdjK_KkQr9+Wibpg%)~>Ze3IyY^{v<5ZHpcy5_jem@ue?FC1mk(* zX<->}+<18IXO4Afow6kuuWdXdtU=hbZO|Kz^_*r2#>?Te!U}uCu@=ooB7$H%)^m_L zZ`}6a@A^7c&jmsX1mm%u7gpFCi>)`V(=5Sw-grS+#v8w`E-7}bAJ!{dg7LiZqOb;G zZ@l4H_h^=2yd3^nSlzMDz{Yvmu_DJngdiA?^%A7c8+ZNn({~-~8O;)m$9h>+4`%nvazQ(uAgzhuhf$i_#^nOW(mf#^$Jp* ztux;`vy)?es9A#XJpZb&jOV!`a;)4%w21fmV)Mt1*C>(mHpcUgHAk}q0amS8+@{9RbRxX1SM<8SZoSbY~mgdiBt z8?Qs^#;CdrF2xNQT?C8kd732{FNbdkD+l||*p5168pP^)>)b*7|+(*!ZNnl z<`1wrd`+_i^@?T*#>?Tqghg+V#j`z*wR;mp2!iog|AthJHtfqs z?R@7>>d6J7=V_K;ymGxKEK{zh5C8Fgj&+A-3C1he`@&+mXlvs)=hZpZ*P105FNYrp zD_gU84C`2ve*`gtU_91`kY;A&V9z%HyQY0-IM(%=B^ZzO5wPxfnP)|2*joNfvjpRL z<6~hNZ;U>rX^CS+nvsYg7|+%xkh;D+a>rkGRnK}5eWqp!#^K6|rWyK#ItA7hE;@$Vy{898jlz5}4V^wLEV7zjDE-W*O?sM@K1&(!>W(me) zeIYECi-Biuqt^3ZX_jC-Z+r=?8#iwJs?$A=Rn{u10>OB;{wpl@6b6nPb=KBu%@T}f z>nmWLEnY!ztQRy(FrKZih1HLHY^Q!Oy2!BxE`bO^FrKY%Aa%Cx8P?-M$EwvV!Faa5 z6_&BJ-`e-PIM(f&B^b{ZhYM$GuajP0<5>UEEWvoTGK7^2i|or?ZfL$%J*|U3g2+F%!xWU%zSdVCyV7wf57M2+gx%zUf?U$(>3dUn~ z5teDaKRG3Pnq$q@EWvoJuEL_{8D8H1kZJR5i@Hj)1mk(5o3Kn@zIpNIFF01la-~Z! zo~`blt!L|Yk5pP)RhlIj&(?OHt;)ThKE<*Apjm?PZ1u1#=4O`{|J$v~+S+%8%AsI9 zTRkm{ZNBBfk^gY4t2Ik7o~>TCTx4DO?5kfm)-J~?TY~XyZSUEd@RMCfJJwG%OE8|T z-ooOXLR(i2nm5<6vX4`?1moGt@@#$j;gyAsb+%>+# z+x0B9wg#U75rSYmTRVET-hXt`)sD49vjpRf06PiGi~u|ub*$fNmSDUb?kueE2;f-V zPgFS+jK}IPEHeURJ~ifE$C|BKg7H`bY`LhHo*!wwah+xf#`DH5mPOB>e$?q1j`gl) z3C6Rvt7REmqpYnT{+Ke{SwxIyYoKM()&Wy)e95tzHA^s_t=)tbZoR{;t$Q^~FrF>m ztLNsFzun$*jbr^svjpSW`aztn9BXUjN|q`J1moGt@oe#YuVY=gQb_W}D1U9Uhi8k| ziDp?_oljCM!Faaz^lb4ukz>u*EWvo?+RL-W^~Mjat;aM=FrKYk&lcN;V+}c37ID`r zF%Pgtf`*1z+Q{*Eq4K@w{<> zu*|%C`m&ZP$I3WW*%FNBjlsgAHxQAdHpiNzS%UF$_(NeCZ}6ziu`bsv!Fa48!ZPLJ z(daN+u77HlV7zi2C@fR1SuZdD(y-*8S1zu; z9P0ti5{$>|9>4ic8}e6;hSmpIl1=PQEGVr%&~nk5*|))>!Lx9C?P zR@KjxEx~xU#(L%A{TuzQt?pMSmS8+v<(@6Bqa5pyD-}yHUW*zhEYqTR|Au2NzDltK z`UJ;%;0DDKOfaOXMV~Xm zQ%J(vZ#M1I|W+ zMJX{l&l)pJSWH7CCY+#c5#!sMEv%Kmv*oE^>hvycix{6ZM_8t<`mDD#ix{7Eq_9kx zmef7`5)mp4yhZ&I^td049JHxS#(=1|q)=|PTCCR(`nmLa37tJEZXC3XaKK|%D zoZmJ%{Euc4M|OF+QtGSjO{n?|<$=$GTgyi1As~!rD`p>o+iTW!i%&S$u?A@tF+S@UVHxe$!yW{rB`)GEhXpjpI#6`D_*g=M^<$R>w3YZfuStrlUKad&O>^3$BH z0e2`Z#DEo=Wm<)0*8IM$63rsUXDtyH*FVhHRaYMJFK27EW)TBcXdYZDti8ZMBzWhU ze{OWFCe0$ox3x@IoIPpFp9jy>EMmY4`Ea?g68rFB%_0V@(EVB~gvD|(TzCH04azG2 z+UZX2)d#)|OTAJ2SYa`TY*qgIx+iEBF+S@!YYUN>_mEd>7BN2ScwzMdgDe$H+gPDl z#Q3Zegk^l_zlZ!h%_7EUotT1kyJissR;ZSLEUZ#w4UypS@lBx>+P^i67~j@PVbSws z`EO<4_x~V5AjW5%B&@{VI7+jK@mVJe%Xp*lZ;wdxqbe6Qj&-&!)GT6r zTdRd-yy3q^|2EAc#%G;tS;pVa)&rVFjL$kxSjHQluI+TAW4)+Z#Q5bp-?9)1uKv$o zA9k!yG>aJD)=z|G%H{XU-girN$rpNk)&;^!+$(c6ix{7Ep|DK3{4wfa%_7EUUF5Ou zx%_^tB#k#`YZfs+>!%(o=fKD>9c!s(5#zHiwygMZ{zAT zNHgnf$12w>Vtm$B!ZO}??Z6M~9qV|_BF1N}^;lnwfBqfE`juu816IfzR|~5IIYcD5 z=&@F;T20OUN3)3WZCxWQw00CT7GTMD-LzG{;XNV__l5kmMND%S7xnKnI^_(-6$;Pu(N`M%2lFS z#Q3b6EQ>xE-iXvo8&BIp+i}3}*Blrp1=E%4yktz5_?WEe41(8T(lt6|iOIOJS zsgv`IB87QHk+PylYTU4>{iJTx&&G&im(`>olh>pGo!K_hU2anYN4BnLs*Tn+)HOyT zl0SUlH@YM$-@Z*+&>3aLMbXJcWyRs|m7-pfeP9i+%0-JBt1DX@oACkDf{6Zx>71Z& zer;>CrnaTJxn4e-9Z8y7+Vnq=y6FaIX@mG?P;EmCnomo|+f$xQS*$JK%AzvW`pcF# zHR2=7&5?qkk(pD(r7es{$45~1H1py$+EU1(6h=oT z^{MV>W0L}Alob_Kloibyr!GqT+}us^QypzoteT3xhB%QfG`^*`xUnI+)V!p- zurN0oU0U7T8eLimNF^h+&GmIFqLt0_mn^PrXpM42jvQWATpD5RTc6?;go_*T#XaTW z!X*vWl}qL?XpPn`udY>NC)`X*bh72BHewOc>PEc8P*)K%=*S#|TbmnKpbh3(yc(vZ z<~i8sdKbzC@x(w-%qf8I3Xk4`=evync>MaMQU_RWi^KTskQU#TQI_hx@XZ$ zora32jmS8o`+H$=eN9BB5#3YSL822>8Dixeh0HiHwzhTtqQ)v!$%|?|9VMJ(XL16= zoEbs4aJm%v!XOCQd&AAI;jf7dTVVf z4m)IwAfX(cFr32iC?7KZa^x5)@uJWeg%PSl^e$;=Sx{fMdAf^qp2PXXh~A2IeH(e5 zh8jaTQQVnzYyze-3L+E@!vTSZZmxBRw9Lk z*2nm?cCv#$)%s(+i&d5M4x52C6|lR{DvwTfEo51JO|5fA8VZVwN<+SM4XjOSOw)=^ zX{lRobDq|*k>uVDE`=kE7U3P=aJ1ZvfSV7Y=s< z(g)Q!1RQ0?gUgeF>lQU)hVahFLHDF&@FZDbF->il(w5G^+`FK%IojG>S>KAGNV!by z+stpfG$tw3X6h`=EgX@mEUK2%Eq)$W`{(puP73iFelvotNQFnoR{IT&l7v`)`d zFQ~0vnDqSNI9Wq6kF=ERoRwreIyQM`{6ojIaO0*-s%)s7AA5pWxi@N4qk2tPxTFae zYHHQ#P#*E~yhJ37^IA1Zq!#erv4uX&z~LxrI6A$#wic_)np#v&@-x;*n-y-$GLNvs zY?=lh@6nB3ev%&4Zldzg5wOZ?J2M$AUb2FY$-{WB+=P=Sp`-8UbgUjsPfz7Mlw(nC zOG`=zs~mgB^r=)vhDUO7@;|mpHm627E=R|p75qO|R-T94#1n^bmM&K>&jMP*wq zTG#`ZP1PfF1kO$^+%yd=ggO;DLoP^cCL327nz6iHwrTW9Fs{npR8?8Mu&%P6V}6yK zyiTk9PQj9fn$6AuUAJU2b5AZW2{qQ$ZF<(_;&dIZE=9s;`f#y3I$pVjnwh-GPD!eH z=FkGUB!^75vYBqOW;R9PEXLaNn8SWaX<&u)kb<=!@5ma}yY3<`|Sb$iIp zayr9uQp=k`F16WChb)H`Y&eCvwGB0kQlD?!%md}PgQUiCP3(bC##-u{vd=pBkA1H~SH$W_rN6R z&mP#GmZvZIMyKJ@bn^;zA;eT)TBl(`YuXmkVY}KU(sQF&lAtbd^t^!QpO8!FPI}YV zjOb*{Kx+A|4=5uj^!My2l7mqpk2jhs>zh^nc!B^IpITa@ypv7tnUZ`{j@#heS%el` zyjoN%_Y0(Rup4eXI5(Cbk^7F?cA>uNZ{3eRo8n3|8oc;?GdrTYkc_I*^^KE<|39j0 zTbCVJ$E;fpO1j;rdA=z>JvZC-pwHK|#X^7o|Ly6VHeIGpVwRZ^Gp%Eo++h_eOp5S+ zQ#aw`LTmMc-24%^5fw*kTkxKU$guLFpirqFs@4CmoQ(^Y9ap01S~v7;n`%_o-HKC9 zxIRXi>ex2aV7_i+62ukZP&c-&)05~{nYF_iI7ruB2VU4x=4!C4&c#Io>9||hnpvT2 zMdx~@?cjxfynowqDldUDcd{|&NeO+-5Kl?_6lEN>ohJ+8^o6gNCM}0ND3Qhm(>U#0 zQz8zAhTI=RiK?=-J%oK=|enLDd4HOeRpJu#K^{wVJrTpq~D+{D`ujj?uW zv6<<}2jpyCJJd)A6~$ge>7Y_L{iXmN@zkHme23^Z8Q+p;(QO0YvP!F)n$)}cw&+qR z$dw0iX2`HKsj?||3v0*4;ttTdK(4|!Q*+*y&T)NHfw*K#>orZSW3S$r-qOKVOkq0a z8Cp|_4$^Kj&!@!gZ3wB?O}Jd^?ger0E>TbF+Wc-Yg)WO*=n-I-#Vw`KWU-AWg^l61 zU{+nK2aBz;lpw1rU*9KYZ_(k6GFC_8R5#2PCI-0iAql{m@6d;NY%x04O2{1@YbbUa z>d@o%AlJ-G9c;#*s5;nKsAYC+U6~fHCYh~uh0nD3t!&j6cFR1=W=pY!)S2wz7SePc zeKY3Mg&XzWqhoF++{9ap)NOcnINq#hiR4yFQ;hFhwv4;}XHEv%>GXf7#BNUfA1ZY0 z{QN&ubhB3YA1boHZuuW7xLZU04;9+XT54tWKY8b;Sy22hyTCMqG@eX0?n(#hrpt8D zvGYti9M@^nL7QUYGW%A2=dAJBR<|22@K${1ZMeK!)2u1(_vdCZyGZ^%Wyy8R?^CW~ zyZ`qoZ*G|RKILi?n|lY`o4BdXyF;>I+^|J&$h9Tg!dhM5+ro-tyU!L@?|Q%%R%~id zI#!x@*>?DSnzr`8XSs5%=X;j1*w*(w%bsh!-?NNuPV4WGK~&w1q+jm$o!#pmir1a12Jk+GyL{QHr;1nvF%k+IEb{TVdZC)$xkgS+?i%Y;Mp0soC8!+c_(#AUjX}?L%*+`$_ zn%gG4vM%m+$4%k7O57Bdbw@j%F0zxFdu@4I?~ve)*Yf&bdG}aoUDZB4vE8eE+Cpw^ zmy3*}L(d_$Cu8yup=p>~RHw;k=;eg!F|X7wwK6X!Gu*zUT8)VgZeLJCc-wEL}@riZj&k;zg! zUxsNi)Lu2ArqQm4_~UQ;Z*R^*jiH@6GcIrM`$LV-+pWiBsGaX4HTh|;8hq)XzJbp@ zv{#WjZrB2fRE`R^RF1ZQB3osf{|Z=JUF}fey6fh@BqP47wnvxirtQ&U+}mMq$u-XJ zI0NA#bj<5`!)53o3$74b`NhAkY+Ku~9sRcY%Z_!KFugUX5Z_X z?tw5KhL@Ljo5s*C9f>lM?)ijN8QEkVE+d=wYH#O_&E(q*bm%L>Z8kgBiYZL8XIzrJ zYFxc{nJ50*d?C3hNC#Rlh3LpvpPOQIs0~|?4u8$MEl$TIjmh;!metUqS%E?VSc;Rg?-*G zMb_K)wffuMZN1gsZEcs@+g_jc9lky-e4E*}iug_|B5t(YHadNWA9)GA9K*cXeA^`P z9ZVAbL%7?9sPA-$3a!Al4Nl+X;AB>?>Pg*gpK5Vm3;V9V3g+D?wXIsdFCS}D)ndAf zn?6#%=x$4WxXm7r+tG3>*$o}SZ*9}bm$6%^?B-1+TfMTAEmgKsxf4y!TgkNPUuxX@ z?mo9<`rCJ&591Km2Dg2%Gpml6V~K6< zOUHc)&W72e!fhT*+k=JCDNU{QjSVf+@Lk`^`Lz+;-G!%a<&FM$K~PP7W3;KczM-`) z+Nf}m$U%`|(Fyo~d0}*9t@&V`x*KjpafITMNHnjwBvLkIN@>x=vWbxy4GS9@mo*d) zxA4MTJTHrn$JH-xiWWwTi%O@A8KYDTjgBuC)m4=>_-0*8YnySlk62VU*3?!nZH<(c&WKK`lGRCT zB%&-8%*@kYLMVtR|0H`=xHu~69t+23DO)QWs%sM9v&NjP6qTe&#(6R?^zYLiGKiw(TK4IB9pX(pSizO9eFYV~Y|!;8ztS5#Dt zofIh?#`o;lh9Zfj6%$J)Oqx)k605w#lA=g?Ny)e=V@pd>>tiNPn?CUfd{(ix8GlSJ z99}rIaJanPsBm~?OLcvH;cz}$TR6hgkw1CLm~llVrNxnDo*cTzj~!DyzI5{VWV)*> z8yXs03y1TGPpx~nr(+~EPZ>XD(u7D$gBaT-C6RICD#n+WjGYpxtE{etu7<|u z#g&VI%qhOM>B6{~Pqex6nk7xg_* zJU%k6XhK=}m?JtDHs~zhn2&lxs2U1iJ_y8nLKXF z#3FPvv@N!?*2YG56GYVv;)GL_Kx`%wsg{T?54!|fkhh@GxO?cWa`iu`6zaXsRaq8`9=6da8ZPv&|h09l1ny| zjhbuP{P3@$b9u0dMAQy*J9HCix{RB}iZ5haQ=WY4Bff}f(P9gj7AdB9o4`TgiXuZX zq!`!KH@2i+jl`F$O-gK;+9br3Crx~OMQt(>geV5GTGb<6QGK~7k1y4kP9)49se2JG zJT$gcMap9h#3UFCF=FeN1X{wSPn?X3Mn_JZKb4ly+%VHL(i+>%C=>46X%StKH(@5R z4%uW**j<}Ub}ngSZ7m}~LYJgNjB`mkq*#}v&q?5t_K?xg(m1$L*$uar^mwtpNskrd zoJ}Fcd#9}ft0dDvTC}+0rSHoE(_hmvq&$*eY$tld-h|p4<}Zm%dmrkHweJ%Noo^GR z4lBlptPc15BXSywMq6sDm*7}%MYOuHabbNe7GUl;-5km1a=BVxxv2iw+U8te$bqgd6scEjQZe3cd{tALm5t)9Z`Ah%y$PR|o)K)E-pF7Q@Jc`J;x#lnR z8ws+DhcxrE*-qXc(LP7HzZr{UM`v|rpfVo8Dx>J^* zT^#`V+raeIEu40xT_tFz``BIp5Q3`@^*8sOu^kqN%ZqEz^MNY{?q-c8FHw6Y?ipZ4 z)ggkA3|Eh|dB8lD2JS;(=1?(0GJSWWLQe)}1QjE6!{+k0Tx8r;U^^a|Cp0dZz6YW2 z6JYLLsHmy*eFe#;HT_2KNkjI?)vdEium1>57t<FS{VE5SUVp zOIF@tz)c3`{5Ie|X+t0DxBFQ^a2z&|=)VO5rp6$8s z*+H;7HU_0HFK#`~`W*z!T#ZZS7tZHRz}(sf?f~F^2h7Gca3#Qf15D95h#(|u&%{N6 zxh5g5re4U{SAWyxoy@05C%}E?Iq40(U4dS0>cw z#+L%%?gHjbjZ0SEI_BxzAXtEnA(`DpNN5J;weu8id;GZe=j?L5G4K2!xDXpdvht2Y z!i~UuaDl@0#7`o9y&ymO!XP*X8$+`E(SNPL9Nz|x^>muXP#=S{>-sNoXQhGb2i&>9 zUDJl$Jm79iL*F>yUP%MTX>#w2f?zE+29B?Z%EA0S3(Q*@m&|{Cf%^cMPCrEiAz8f< zw-Ydf(!h-dW^x<2D(I^M<{^zsR*vI=`wW=oixENSiY-xjKZpEwU~agCsN{a(`sF2H zo?0WYq~ihm&A&88A;WfEyJtInAGrT&Y%)LJ1zeX)jVAS*s2o_j1iu7s#AOQOk1wvB z(qBgdQ>}5y>=L&anC3Qc&A=TG%zGM_%+EY5+W%)*mtbQ^hNHe0fEjzaz>?zDBl#3y zO0H12RPFBwjZw&OeK@~VAh8~}UukTz@oyv?_Ge&vU!}Bh9C7vG*YDB59HVi`{5%+j zT7g-6jnbEFoMe01^I9A?Vq-|A?`EWp0_N`;m&`9O0rx2|PhLlD$=m$~qxSr zdA+@jv|Vq&IB=uDlCF2}Me_c@Y|yx5YB&(0! zw*|p2*cg)On~$_yjS(PrPM>QpJ3xLma91YO=eL8KfVn#%&gpv>6?H!_H{PMF=6ZIW zzWpH2`aje$Hil&7SdX+~U^;OCLGb{cV~8eqEoLSRXcqs~O~1Yn*|1GmfFL2xZL zhHlsr`R_Ey-vy@e9-@-ZAH@EPV$1gFiVPi;!y9)!< zI$(~uU*V?U$Cbm?2kU9&13_>dHU>1u5YGAeVGO7b0&~VA0t;A=$@J~{SP+cC#*j?k z<4C9hX2_EYHyJ;oZ@GVdoa58MPb-YsN3wA~QC{w9Bw{L$#4^anb!s`5By_*xlH5GO`$Jw{$2#;Esaa%moI_o`WzG?B&#>J(_D=a zAa=?8JQ%o9Y3Q4oroN+rJ0=Z%XQZj`eBdrmL*K8{)b}88Pqm?sS1DG`$m&z}<0kclylKHtG?7Rrf#x(SO z15A%sRC%qw1b!X_Oohg&{Kfm3?XL!yMH-jPfBk`53e340r|c%ycbmqj947C-cLTTH z(}&}QnDK!5do4|UZvppF8~O%9U-qj(Fc=#{s(On6Gg0GG`S}=NF7Wgv_R9^x+^%t{ z{JajBr!_8_pV?mC(-E2^)hgM~t6ykTw{Yi5i#6FY|y|6ss>m`#TGm zyF7h~{qis{Pib5#zq|y@2O5{mFFa1}{Wq-FurZ`6#~5IyYMk{;f^swgv&PexxE!|u zbGODND+kB5`+<2X4Sla`j1&aBWc9ldxX(1!mLsNqIj{EHU^J=UWcqS|8?3R(^s!%# z*BC@4B-1x_1LhBG45{=Tzd;~&mrUO(;Lg|BRQhh$7^5(mzI%atFb#bh($x13aG#{1 zukYUjFC@#~F2L=hv8l>inx?*qz|BfS-_kVooe11nZRi_}lHLT&^BR|`U%ms(C$ahx z^vk}l3{0KICG+1X;8p>1pT_ZgU7~rP<>>SV)(F@bI$=vzZ^gh& z*0@ZAOHhtQz+9wpN?+n~+yu;ejmtFpV){AD@ft8Yy@?1yvU1Qbb2UbQ*d;4RD{w0{ zHkn@@A zueTi7S_8~Fjq8lR#m_PImIwI;V6xvr1R>e^Ci;1z#t0C*Wc4;3xOp0D%MoLj`c6z! z-)X>I(1t$FZ+8N-UgJ{v`FUVA#Oh1n=Wl@7=WSKm3@LBCpIMGPU`DlpW4kW~W{$?C z%3lL8$7-DQUxNIt0cO3YFFt?t%k#jz>EYtnyE(vp4ov@d5J6DwC9%GU#wcX+c2EJ_ zT#dEmh-n9dpyXI!uF<$uez_Nz2Q|*>OW>Ccz;u6Ckcu!xvUFPqyH1%Br-0f}XGv1H)&j|c5ojskH+dt&<@@LruRQpIa0NQ zJ%QO@<5IPQVZcn(xMb~semO>Cl;z~@;6&ig^7O^G1M0geO?~$P_h=jX*iPR{Q{P9x zeba_M=5OG?Fa}~{ujZ4<<>6cyJ!!8t(`DGvA3N$vEU#PDlO?`8LThN9+miM$Y z^_>gcWohVJm!`h;z&(+MzKv<>`v|yi($F{X{ZM5fnyfx@fy>j_RP`}AO?`8Kt7}6a z$Bk9Mtck@X=;!wW^I$A4rXO+K*Z|B2vA6{KdVhenij5&zdD&h@X^a4|OXj}_a1-0m zC-Xv@`c4GytTyy9e>bJ6?@r+EOGDpZ($x1laPOs|uh)mhbLuyl|M~%!qp_*#cQ+H8xp&P~X96 z>KhN-%rx}1rm1fgaObC?@AfqH-4ER3Y3O?=O?{sO*ZC9W>tz1p_`D}DBVut0=8x&X z%!|dv%t!s8??hlOh{Yw)cPB9S#o}W0v3~yo%*I$;0)5>-#W{Cu45`XnpfL)We101P z+|)Mo@jO=(Fz0Aos&(vIU~Y@mmtYti$71p@$YtE9#2Ex zYrt%b)tA7}-T#Z@GHeXV%8`e($-tbbammi})6X{m^J|Su)_;k62$+}Jz|8{gbzlzu z3K4{!*pl53cM~w{G%l5&p8)11jkEnIW*le#{Y+zMmm%44#W%q9_*!9->0@~ZX^cW9 z*Ebrt@;3CbUDW}zRO3>W_bgy8j@6f-9o!AfD;_R!fBRBnymG|&kLB(04X#IFV@TBw z1_3j=4IJmeF~BrvT&j6+EiiX#Tq?gj1kBSKm#p6C=l6j5CJlXkzeRbmF<5;G{5%?% z8V{G)&nIh)(wKZ)y8yTwG&Yr=?*!(dHgNRwQ^0(tajE<~2(>y&YBu%yU?MQHG%lH6 zIG!#A=3Ea4zr^^jFL1YMjPpx8j{5Eg?!`9rZ3o;ZiS)(1XNT7fz6NfO40_nKXS^>+ z+I{YF5n@N&0l-YrIMx2*^G7Y!8e_PT?CiMmMvzzo+;tkuaY@#HRV^)s$KR&#A3DA= zs8}ECKi20badzY9->$%Ykp`|CaNnkZqrR@4lO(!g>4>5~SIc6Uqz z$8zkN25u#AdjfZj#&Ud+`iLn9<;9s9!BlJv$=U(yvrc0Kh+QImlOb=2!&St!mr20g zmj-Sh;I``=TOaZ5l=(g|4j12Eh|5m{*8{krakzN9^vj`X;C2A6EDhXFz|Ben$9B~a zhl?+7AK;qfaPj3}J2)i`9Q9q8Chod4ardNw<9PaTnz)zJ#BEFi$MSxaCT{yKZMRdl zgWc1>?Fd|c8aS?B#-xFxzBy^&n7_s}aMX8l8aU?fk~DDCcWWBB-oUL-1Gg`5Po;t5 zI{ni$aMTxcZM%N={{N_Z6ZopC;}85k5+JNEAPOkzQ-elP3{7wqRSdD*}r6mM)&={Fox}SdPnlI#{D6n zTMW9u(7OIUi;m^?4bc2Nn=Z@WI0AGVLGyP*M+;$G=+NKz05pTTs|{VcS@LL?V?lGO zp>y)G#x3@f2}1)=f{aI5@{UE!bkGIa^0MfT1Kq8ld14>vo(0XGeW1%Lhdo9=VgXV$-!MwTdu zTj+0u-?OA2dk5%#X=v4Nx8qw#M|rP;<{d+4%ES02AszSGcY`LsXNFyJ=$LL_(2O*6 zu0BgW4dsz;0%$JIrpu}a6`;EsG*1{h)zA9Hp*-f}SgV-} zctyAvTt2e&8;7_tpt-`(b*A4+(A<$hm#ZJs{T6687`l8s@2z~_0Zsqjo$L1{@E-}9 zIfhR4>-amVi$HU2CS6YXvY-44Xx19Kz11t`V*_aZZs?r-I;aPqfadT%o#%u7>4~5@ z&(L+2kJ+GEl1Z1757w6zpt;r1b*A5apm{EvE~_3ezkdcz*S?yM&h(3d=7>zX9Q{~N zj|0uvPoZPF<3Tge&~=uND?#&(eW3d}XnwyBbZwxCMm4{#9%R{t?c+GmEH-p%myX-- zGSIYS(B-xdmfP*1x!=%rmfzoi=8b)z`w%n-6?UGF@knK-%kN2`xyaDD^2m}$`z;5}8bhb~$kmT@cY)>sL)Tfl zPk`pleW3dYG>71u*bGj;@e?N%O&vd3khsyWI~g<;hEDYJ%FAQ1*zptaZ*CG3suJf^ z#V3vTPda>h)j8v*pIbTclo4Y~N)GQJJ~63sVtmqB6Q@^Hj+=bi^kn6^mB~{&qMX>U zD7E0yn&g66bu;Uhol;dXy<*v-nU^k@J+WqC4L&#y;T4q=;**n;l8JFA9e!#3<+E$+ zQXM6U?BI*z6^XN^C(b!*`jkXP<@9r^E5|1$Bq}GKBWb4#sygRfFl0$TD_L=7ysGk? z!(;6Hd0yjDTvvJ#&bhqGlcvpEfd7{@Yuc=a1q%$k%y4X9(JGozE7FJum{k)#u<1;3(bL(?r_-;L;Y8Thz z1MG_zdFAK$P5&qUOcB55dIgQ}m(r$(Fl|n7Kr70rFEHO9XFBU(dao zbwK8OcLVx5mfrHcRzT|o_Y9yL1bPKfvp|0Hw4wsPd0`O@lPVfC1;rVQ2a!au!w)_} zj(k6OIoX0=*vt>!6SY>hMpu3d5`tdAx^+7W)<#mtL?3&vpt+YRl})DPvmRA-W$Iy= zdh8=pUh{+kKj@yEU7jCrT0W-GOBH8H&wA9vMz*&3yYeCpQ9r0Cs!lXljEUhfbx@F( zq>+=sQ<}x!`@!=fpl$G8qx@i6QHdWcEE?knDHLVXld2AeK+4eq=zGF(6CmYa0V)SgtsIX7QjVtp-6tHI0V&6C0V&6; zfRuwi=r1L;BXNIRpzZHjHUSGgu4evli4=v2nZ_-{nObx|g=@{4&^n zH4rlWfbF_{&33{qCzt!{-s%z$x~}+dzeD!o?Kidp7od)x zd_((&c-e<_ulvEIqGEs5i>U*WsAgl5!=6a2+ueoDSSzXImo@$rn@X{&f1Jehg4neY zM5UtbYtohMYaUzFY<^4r@vMY1SPAE|64s&;mdB^ZFPgrdJ?PuGIN)T4;rO>)d;6Cg zLdgYTaGDT8`YA2;h#cxO!%#eCV$plahE;hcp*(TQk>{~Gu-nf|OHHCXywQCgCe&O2 z8ZHoBnqq-)%LvTmbT{Hn&-|YtLYbLM_V6|^r4hI?^J8QAJ4#|{+A!bNPMzgj^=H0S ze*ph;VE!ZGWR(d->+}(b>F_Dy#c=1gT12eH1tl!k;Lar|ZWwyrV1Z=xj@bbT9ei_S z*AtOc&&O&J&64DL}*sTRtz&t9wp`rf(rd9?%k z90Uv8u~+*fTx^zoz6gc#m;Y}HC5sBqof4na;aIh_BKpu@;Et5O)_iwSBXW@p_V~@{ zZ~Y)bA0ZJW3w(do)2Z%2v{x6b@q=#uY(Kwg`G`WV0V6_kL^Y#(`DM?ix|wR0MiRZH zbv1lOIy$Y8?gz_96#Gr>k!$ix+uQQ|_ANohh(SYJVc7Vu*)25fE>DeK^;&e*HKbnE ze)TaX!RSMiMoeXLz9!PNyFDJQ_><8Zg4&)olyF6VyH~B`keQCWoc{hlB%{we^$0O^h^X>3@#CLr`=8ul4H~CSqOV> zU~OA!2cY=0=@+eE1kra(WqS$Gbprj@LC4@(af<+5FR=}{UnJ1AxUUh&Z@HdI?!*Nr zBMokzR8%;b{;41Q-47<$(i?$pe%|KzPa==87>v@kLqiX7;reF_5b>c%=J2swpi=;; z29aK}lpR{!; zZBGVo(!)R@pcZ@)b+V!7NU*P8IA#30kx}T%px?n zZZGw34Gg07?=?VL*CHry`mgyOeJ;ga2}nzywNC3F=SBZl^>18Q|71EHy5+&EG8%Gf z>CfF*juAfDQXZ>cuWPp`8vyu3IP^EL$(icmg7GZ1X4?G~$ z^u~so#O-kHH!m+56hBwm*&{V`C3H*3RQcT`NAXwuvGIbszJ3e64%6hGr3=iLz)@}5 z#}_2w9yc#7fQo+Eo`(JW=D5JkaB_R$p|I`9@|C+%g~?{j%kuoPF%1VKn+w|dC7aJG z6vWcPhWuo+Uzi9I1&Lr?bp&`qtCm}hqN0}pi~C@&;a>P1vsprb3CYB(B2w>AGe25^dJy%;`my?BGIbJ#>{1A_6Y7MHUi3q?T+e|YJ`L=~ z(SQ2-XKzDV{}l^!j918YL?sxl!@h@yU2Koj>2O;W>`n&G#aqqX(6#g7+AZ%Pz7Pi4 z-IrsK-K~SHOyi5;`1ME|C_caAX9rm>uVf6er&{B#YENN0E{;?OUS30AJ1A23Hu!&A z+MX3RPFbpgjfo)L;Y*ZlO!X3;w&PjZFqWr|>qNc`zg=bc#mK7$%JlNWk(aSa6j-s5 z=kI;wecp|{A`FgSy3?|kf%iJd*MWB%ART16Yp4V77(j~ST?gJ4KsxZ=1?c~3;QgkK zeNF!u6Arm$n^S{1z;=%oM&i+aUZSbB&~IADVW#1&M9_*lKW4qF-LbvZZpcjP2+1`z zSOp_@SN@c~xPw0;20fKmB;6Iq;`4iSe zcm~5>_1FC;-+z>gSqM?T?3IRYQcs^vwpp|0EEX3w0PXOK6w?2Cw|Ar!Vu-XS5F$kHWxQ z7}tFqyP!s&JrH3>0AeqwTVdLd%6g1hIoo5`##;ImfYi#_CVFC(EPJ;lcquE!a)|%5 z5j_t!E(#%OzATqfk%Od?vFoW9MTP>pN1)>Y9U`$@1l47=Qys(wB;9g23y^L(gkDzq z)*dPL4{;7_DYC;VWyA7I0$Z0VqSOcCgt57~pt+i)eu`qvtl z7I~=wCQ~GVk5f*P-6Vk|x+j3n^s!=(*l~bP6^o4pv{Yn4(LpQ{Fdvh@!+>p0qpEryl%`^1)G9bn?CB58fEO8 zRaflVPgskPo01ERvH5WbM(KQVvLK%0+;_skv~wkXZ8L+_NMR>`nwbE8&9%|4Ih$#hZ3_Z>aEt zvkJ_JSo)e9Pr++63j8r}YfDn-siu}-iLm#uWUwI^m@u1rJG)_AjklD4bl=D9IAJ@OY*R^3pXM92L`!kdK z64_eHKW^F`iC)(TE8?LY50_U$Sg+`+LlEDIKz6q?An{+(!Xa%iPB0L&5;ft@Hz2JO zRxAt;$x`O0opV&=XitTi#6Fi~^r8G=!J$q6>6SvrE#1VYR%31QZG+;Ez!V;`H-i;< z2Ie+lXIRaBw5hD{*g(5zJ-2Ao85<2qow0F%)ES!v=;x4??|m7NIy#)$DII5QO7}RR zUkKe6KsyBD2=tIZJX-sAfjCp5Zu#C+-2WlaD%}4g(9O8F3G^`Tj|%h@?mGpdRO0hx zHB%k82&%T~(i@QKax5Tio27vAq-~A?q-}FNAZ?pffV6F%14!HErGUOBX=H81 zyZ2PV6$t*-w5NN+`KA~Xn8@2E`C93Vduf!>hlZ5dj@Pux=tD2D`$6A}0!c}Mluwt{ z-m(Jl@lpTDO($Ax8bY)f zlCtcvz7u)q07iA7x0BcQKqt(fDa)o_?ff=6Yr06@J54vf->3%@s>wI93o3cE$r;=-q>v>kOE}Yg%4Z>!sX2F_v*x ztfK|BD_uh}XoJm~=>?UgPh(5TXEnB4NI145Zm~V~lt0#BT5jZ#r{+mx|I03>*ty8? zw2WVf6|v>shVhqSxUlZ?#->Ij#o)Zh@hN}f`1wRNJ>R7wc&>t*8a%6^QrN`u1NHK_ z4xyeNFvSoXK8Y9Dv`)Wh$--(xrN1A%4( zS|SC<&C6>AS_Wv9K&t_*7U*U`fk2#MepR6R0Np6igMe-kXg#3Y1wsMMz=I5Av>&$} z^7V*gjGHLI6MoA%aIa-7^P78>KJ7PSkrk`qEq;MCWfl5Hyn5F{KrY40BZM@oyLPz#q;W4p;v2#_Zr^NCl0hSx~SH@%4WIPrddESPT z&_8?{cbCq%-xlt$4A$pCq#ohv7@4sQ%IzZEUJsJ}(pJ>50xS!lX+^uP!1O{)Kr3fI zKpYdWA-T_lnaL*#xK(}#7X90+ktX`b{>i|53^Gw&Hc^K}drVZxt#_t#=Sc?at+}p# zzfN+5O;olCj^6p+;egDNGzKPnfC=0GuV4{41uqpFVep!8au9`iPGJ&Llv zki!lNHaLw1iTt#L_nO%`50;d&uCLkS0{MqsU`olK4?rfWuF6>hv%T(Mt z+asy%S|3UEdF&1Lwx`wFY3P5Htnc~^fu?^Ho1w+j03BwUo-CFUgj?cWEh7OBKmJ6_$DyTFpdo+~ z0=d>JTBh|NTxe1OhD72FhU?PV2N_;@v=}VL_FLsZ0~&Qhch@@6|KZ3ihCeiW9B#lP z>OFR=(;hKovh!b0{U(ThT%Am+rkMvH%%KN#6}kd|^FqEPp1H33W8tN@^h1G;17x=+ zbI-+N)fiJ>G=F({K)Uk6+}1zLU-u>sCH)(Rqj5q29YNm5X{W}UuSBEgLaelfQAkf4 zyR1!%J9ds)0!!PILZVF{eR8>7kq<5#ltc$q%l+!6XQDV9`N`$jeSWoV1Qv7r7k2uO z-2Vd&{)caH#lCFwt>(yB%jB(zrag>*AqmYOnYS6NaB?b&Vt&h%6juM{Ys1I5-m7Ux zB)aNNh;PfUSiR&jNdzJ(+6cpWg$rB#VcSwCFw!EE!3~YzN(Sq#Tc9$nPJY?8=qj$v zRg773S#%{KYzstJoh!cFCb)!?w{vH!X?MZpSSLCkUC(O`Xju*0(^IKfU9$54a3sr~ zsmDC>CBLO=s}zwY0};?Qoq;CnjY0lG5#u*qwS)Gk+`78=pqRrF|Syj7bT2U=t8p2VDdaSa)fhKX``omzG zCuOesYd~DD$oKgA9@i%Gy=AyB7HA{x+H&3kq_zJ;2X#lKRNMdu9Slfoe+i(YanUEd zz8uLoU*Zyx?FX9$laDCn;G9LT=0+en6m&PP=6Y7p3xqEzGm3a^f-?#~xN$XNlEDg2 zEE3KAWGWHoqyoJNXB6v`JO+hHND!%N@oN)h>rz7!&5h(r1m)HK>_YsE@$+yFX$@s0 zn|s8AO~l2AJ>9hKGMrQ+U30;DJHLoS)+?w*g>`57K@T52+ZWY`VO<0LF>=0fyu4kv zA&=(-_(l1XFCQTf46c6 zo0SeD)K5$fII7Q+w73hUeS2sv`nZa_5RlpuooF#!`cS7w(C!(qAHFplVAlO5|BKW1 zHlyufPTMazsKV(;ZB@sG4!6YN!WH`T!knbTVaoR|zYYKbw*hgZbt zJVvkIkUs_mF6aDYVpKvuqMQ{UC;Ws-d$MP_c(X`Kn9DQTLp=gW$Jn<4)k*C84hk)0 z_SXM}eMTGu)fW7byad_o&?c7}jhIh)T&p_J#VR+9V?hgm(71!BuxEf8y~t_O>qf%EQ{2={1a z0_=qz(Sz4>yCut7UC(nyOMW9>V9ayl%MT;GVlLWhILCTez2?%2RUT<>7(eiU#Ftz2Jn_?S?iLKJe)0Eavff4 zifqU)L?j#>H^r0=bw3~-rV4&km9n7EjYyxH7={J^-k8m9#JVK<=N_i&yWW{^(dPCn zBD@U3)4LmKW6!RDniop_=9Y+d#4BbFYX2wKV%M!m4Dw=FI89q>fe&Rzab|Y6YJh{) z``PWCv^=1ZW;Qu!Xry z_4C{Ms)0hY_esd`*Ts}m z0I4Y(0aXj`7l5>1dj=5CFywo`1*FBW9gr5ohk%qfd$?IHJUW@x_x)Pte-qzsp!NVTwMSKmYt!^mdqcm<()O|!@yUjd;=#t94`QAHe;+1AK40XnLwss- zws(3ARIVp_t2cm-n+U!S2o}V-k~W zzh!cFPP!2}Fp;+j-2dcc8#=Mju{4I&K#Xjhe^@;0eukTeM^_(?V!)Y# z=nen13Lq&aX(!x%aMeHkVY_7(E=eOv%f| z(N*-=;3-8{oq(|eGx34QZ7kaKJ)+@VnQ8gOe#;e@mbY_Se$_x4#p+VAdd$wZQ8AKb zTR1KMJ*MT|r7ft9AP>r?Gsv_Y@9L-+Ov?|IX?ge6y}R%H4g?AFv+-b8+t8-nc@2Z2 zzpi>KqwwU_&B|SrYmM>+&(`TxRvi^i)bB20EyG;B9CLLXC3%Cd`r}Q@3)deFyw2BO z2Q*pQ4`=C(0zHGf&fIy%NBzAKggHsUWKGBp;fhG<%SqYs&WjjL8DYw)+6g-ykR)WFqnxy?)D z>5|Zp)5Z@vFz1WP*8_UVDPPD#5a?*oi^~il8JrEt@md^3ohcnZ$Db_JNI;!LJA9d_y^4huKh zc>V$Ue0(1U?f0w#ePd{};eoKHi_(cpAG4Sdbe?IL}tje%r_1cp-fRaZ7!~ zt6RDN5Emiyy=wqX5-0%lqCjf_&67<579%Wy@4@J+O8PdS85%L8!~zJqyjK%J30D=- ztCXac+H5cOby+SmSLeYPDYR2rvBTGZ;LL}HIJrZXBNM>{WMT{Qk`m!4WowW#U=UQr zT!Zw2uTa1UngO<0PFrBhO&ydmW)gV<2-G5H06JH4KOd0V=4wD{o0|ZsZGH?Ww9Ozr zJrlelZdr39B2mYqD<12~lazS-%cuVm$RI;cqI`Az zWoCrHTR&&gbr2__oc_a97Q|GVvs~(Bh9?13=t+Pw^dumlLr=n(1eS#J1&;z1ry6D{ zxoEu({N{lsI!_G4(;_-shy zIy_OOzhRL}g{wfNx9*XTO(dMhFKr!LF&H%f4J2A&n#Ap(*VBz=5igu6ri$SoxfOAG zOVUVf87}L=js)%M0@_P{xx6${Ol8;OGu)S`abM7&YS9AH+?UaGI0N>R(nTH%f22A& zy9;I`5x;Cx{Scn&#im$r1}OUZE#u&&M4}IM*|`?|v2#%h=%L)kzWTF!C|E8{%N)8= zcFfy$PJpzgXWDmu3BO$9Z*DjWe#!As`(8Y1SMzdVKZEG=9)UAFBKiFIz%f^dS#aD37-3P5>OP%|Yc+@nNlb>-^dH zO3~FNd{@wYCZv7KxahBYchB%!VE(JSQQNldloNgE!VlZ}NQa7zwaEif(0)*PysTeW zhl|&z?5Z62KdmlE3hZ{PMt9)RWb8f+g$2}`VF!ASG^Kw!Xgr?Phj{|fH4@twHB(pq zjt6v>;K~4tUmf&;gCZDAG`0^Q^>q&V6ko?J|D$!H8A}sJ z`$nfbyU@>j0gJ2kJ@9!s?IYM1amuvrSKewmBCL?j$G~12lh5Go zz=ti8!JjKj->zt$|46d=m}K+C1-J?~mOlb%Xw|{|*vGqLlB`#>ID`2nbyLJ$15E&nv}4HG|=qU6&kqAMFsny6S_TLDvNJrlnJ z--D6n%)NX+(X^q!pH1&dzwhV=&q*X!AQHi(4+`yriI&GIxN-^I4yX!Fl+(F(>d|85QV7kcpd^sV~YVPFSmyD?M-gqYb?D(jpbBJkCb!5rLot$*tLN4 zE!H2q*hgLLHb6zNY`*upi{0sBKLVt0^M)^U^g=z;bcX=aW86mo(sYk=v6BJ)8~pj+ z#ejY$9Yh@@Ada4T;5|B@X}mpjN#k1skqJOAI#4!68p z#(j+9fw#NlJZ)&k&X{Rc6qUt;r`PQq6k55A*pp~#PQ=E#i5O91)p5O2o~IrzXH zzqYq#JDI_V_h@!;lW7KKA4$HSS`|bqu`t{+8Sg{mTheD2V4bA^>u=4Ko1(=}M~mNc zqR@S3_)>V)vH1DuhNman*=2S#-sP(@JwEm0M|>}XKAId(Ic>qIK%`b8scj22*8yL| z?@jbRq`XaenKD1^d#+0v%Zo4w4{|W^&yy_HpzJXq{oFJ@HXL2~B&q>FSlw&g&fdu5 zT72ZXdvxVXNN3kNz*|z6!pdXX*Q^Bw2~$Q+;_o73ZkT)=0`)VdZUSyg*Gyl6O|WtD z>*h$3e#kU``71levPQN{_S>tM?lq;k(X0QJnG|MTIr4)^+0tK=DT&F_Jft$HT@JFj zlHB2>s8{b}0jKzR+6)T>ranm4I!aISv)vTC`7rA%Z3~f1aeMU)q=7=~S9z~gnYFnI z1(Wa1Ok*!!fpzvn{_f38?KN4lOqBhx{$T9Z;PW6!t}^^S5$LHPziE9TBJ1AFN<7}a zp`uK_LVq5Q{+I#6m!A_?6tW+?ukJ-2S2NO%g86N-N&}R7KfB=JrHxvOR83X;fh?9*eV;YZAjY z$ah`J*1Iz%@_}qUzj#V~*M@Kj2&?hC@pVXdz$7{B-9*zT;QVWEe0U(vkDXhjex!AzP-sNI{`gBAE*EHtET-)LVNSkV@%-wJVj<6Oc+d1(2?2p6j5w z4!YbyO%A#Nkgk0G)Zw0X&?^qw>7ZQ>Y6qme!?1Lq>7M4GDGuTmn#QIabQK`wsn zjS0Nr41W+aVr=-nXI(&FHbbx(Cm!Goc?Snz#^HC9#!JMM``fbTx>UUub#y=SlH*b)PqOH;5*P_Mm^MC~yJi9a+E&fwJr{I7 z*5=BK(p?kZ?O(__+%^>q-v)A1OW<^P>F(NE*d$wsnCVYBW{Pgu^@9$mB@4aiEUrL; zwB>`@0&xl&Yb8tDtMPrz=E}AB$`C#uw(&7kT~{=~Ro&MS@(0;Sn_g;v^5DZdnSv6* zAFIm#QGZxv@JSU<9n;UT<*$B@jQm$M8s`RX2zNQJ{V`Tgb;rT{2MN^1^2*Y`CWEV1 zv*vN&NCua#!68%Yxtf1+;m7$=O8Z|fupe6ze+0xbr7sDc9{6CK-e6>R<13t=#cA?_ z0e9jHUN7t@iZoANn>sq!j75Zzo3Xof|HyT#aoe=IYAwwK%n!JRu$n)stM0Qa2$R>k z)aW+nBv-br?(RhJdR5uS^+!|&AFQdeeqg43=m%2Ec>9wTWpn7KiGljU8IX3^h7*v? zM4E5Zj(I>(c}HT{#?F1Cjp@G8Y4D9Urujy@6HV>uzEOL+Z^W6L=^K!C)vC8siazN5`V-sduyrka|ad1jOa^eEipV3-!RW;<#I=5O)9-TI`^2JLoqK%15uNbO$+T zq=UGquCYr2Jq)gVuf;*%a?m;l{SgrToqX>+jPtqz!^0{HeGEur&%*evW8r)UEp^ap z2i@wRZvxVh@(G7~%|UGr`j3MO+z36ujnJn$+yxH0#6ed&XtjfG1f=PH1CSe`eVE^l z$}`g7)fO%Q(8&nR1J2=po(fMIpQlkxx z;DX8m^Z3FJM6SiZFG`O#Fk;#=@c3?{IY^rb@Wtil?LRoOD>Z(w%_ff5KHQRrQ6!XV zi9UCP{Z~q7e8Dm~D3AQ?GK0Qu{M~}0#P};C@0Qg0M%EXSVGOsJs_DW;8_qe2)xR*w zgR`=oTh`l^+ynHzBfp{cSV;cbdT5u}> ztrO@v7t3{4mHcf$Pf9H3$;!(UB)3btPdd710BsaHF7_!MM-i3sS3sL3_8%^Gmy7)v z&~p;o6;hQq3P^bm1+-OSk8-giTdD}O~|uXM3I zTd(PU1<)TP_7)e*Jw=WE4WQR0mP?+h^YbqDWk7$C*gv}1w_Ggy>%U3tE*HyxS*ntG zYJG>q4hGaFQ21RkZc-~9PvyKLv7-U025}eb1A0$lt6eN7L(0pU{|6EqZeA~UvD}{K zVY7UXBkp#A{tQUpo#Kg}4~4fKkfz%UBd*qn{Q+qjLjZjwbVY!aZn%q`4M@|d2c&7- z3`o=9eE(zN{T3kQ#fyAKas=NP?KZMY395~EB5x+}Ta0w^|a9=gkCe?kkr<?NAAmDoU!Nz+w`oEw!hD}Sw)1;3*l zmqO%vPH=;VboKU|72V#aw)c!)VohZ$#LtmJ!CC(+0x@PGYJv^?#--|_5T(8(xWl{N z%!(_)GN33W#LO@8T*EoVGJI6~JUc}5^qPKU8plZzOAdv|@s4t&)!F`O949*tg~-8{j9RxB4xUWa5>|*D zA1Oy#`zudN<5b6?5IG=%X=K&U^!CRiUYd?VOlZsgLc`dxA&D1v z(i9>O->As*STEBE1++COW+LEv%fC=$FNQw^TTl4@RGv5Z&;sw!QBkj7U7vS*ZST?A zy|&v7A;XPrMYUrMImAieiAo!IhEMaV5VafRw6m?mGVm}SLrm^kN6B%RaIi+QXVriD zc#J?+Tl;Gz*L( zhSS8dl&laXmkK3o`M%bplZAseJ5?asjBE3G&hFO!Hfj57@zj8Uzk@_4_HsQ0Dgv~x z^=O==S`Lo%KwDBCs|g4Ym@YkBhE=$z&o^*^z&i;Ke5O}NeZGue)+3g#)fbN))}wnt zqxDE3+C(ARM4_02SdSFPdZZ9_Rj3@0YRr115bKdbo!6tVv?5Tndrv%rvgh8=9HMm2g}Nk!zB2b>N-+ERFMY$EgrG&sWa0@nTpS#~F@8 zA#%)6jV$?7>3OARti7>9YX8mSQNutIXtZ&1EBXjEUX=S}Kq zlY_a?vY;j{LPz{7yqR#eD+`4v@ykNVvY^G%10p1pm|w<|V~ubymz+z4{TManUa0cX zZU+IwzI36r#2YMOcF;>Wm}Z+nDIIR){*>CMoZYgZr>r=M*Bx-NMmtNOy0@ zoZ+zEabB;;FqyB9P@H@##R)~^0ds5G5UoCjQaL|Ge2xM(T3l7Mz z;Dx|2tiffe_5-XnPa#@Rp~!#&Z@?T}le&8YFuxfvvQYAOYMNqP2UgoC#2oxowCHzu zPw((KeZ7Mx^?`kQdp+yAy_>(ii?a~*)f&d{7XC_j0C=2-+izqu$W<| zAab+{2h-#Jb7l?W%pFJs+GBr{HrF7medvIyeH5a76zW&p+bf>4pI0=gzZV--=nc53 z@ZG-KdvER8THtcYylF0DfS#4~0eCx+t_@RME)}BAoH=(~3oPRp!)|lAML3wt7X`BV zvli^1kxSbjQ2^)jnmdK04UFtk&A6j^GeISUvZ&+Bl1}zKq1CeBcdE;oLgac)x!5|* zdcf>7j`JLcLge^!4o7nu2Uke61}a33w>stEX$s{~h#YS#N7@*6U0NE`9EU>Wc)wGQ z3mu0-v*f{7!cq3X!8LiU@O_F@3ya<{#i4IcltT zU}U)0_ubyxdu}ag?N-}$M!uA-is4>R4B$~BsR&R%;b$ygl(1o@OGzQ7)JrJY4xwa5 z;QKKQcj%9do8%ZE9IT-{)e*KsL*~X;M0y8EiX4Tw`;;d$wL=9WHS2Z_0fZDTwt*G6 zK;U74M4oRkgMU8qVcPyy0Ny^A9Kn;b7#$ru0ihsAUzRWfh`U3dI~m z%PNkRRVZ>`Pw&7~)H@Jk#(@|!4#b#o;7tc?2Z6Uat%}VNU8#aXwAj&jH0{LnDd|3I zjpI;=9LFn1T6>QHYr}6OH%vnza-1L>{bB`P4B8zus+ZSiVvp^6UrmS$JtY>=XeP{c zx+p}+WkSjFW{T;-Ho=%dQV=;RgoBnnO(0tehRl_>O_*}~NXjht0|jEaA0`mTs6zw- zASHSZ0R;N-l<^&0An>?5z@q32q)l@jU@dutSn>){KZRlrDt1u%NHZK*8&uCwW9IjC z$)(|7m63l{U^(WA?&MI29M!@xI2!tZq-M;KLQOkN6B^>{c{5?Ylco@P&J{|QkfpM} z*1|D^VAE#4r#so!PV2=^{V>xXJf}DOsa{^Uy3iY<)l@T<3wOS?%8#}Q0K33xrVuro z1|=qlj_;2oRRgDiBZD8y8j2qjCH`AQF#ajHQwo*a$B!MrsIWbJ?lufL=KK&&&w zh~&P8rP}1Ir4X&9P_{pHAH|q(snc8`>T#W`D&64rSk@ve{dFCfSrbk3vo8NbfsD_TZ8pm{$z)4jDBN-{S4> zb>E&_3s@>z3s@h%BYYG*+7>3@T4x!Bn0KBh?bz$KjM=r|`@+HWI4Xv%2@f8YH-KSa zslO=@<}bk7TEH(7X`4}qwpK{zUOh1P!u)F#=3i#+warN3&t)zL3NZ&i5-lRKr_}>{ zTG-bDx82j)PBs(j9JfN`{<(6?%70I;&CDQioHrBd9hXAndQ`ZyKJ^ef%fVQsV|`MH zc~lNky^70*j%5EvWg8MJ7f2&5GX<4PnQvL4jxv+yDUqArYR0E=q+Bi)Vk*xlhu9`u zhpSHGYH(Z%k?RHF8hmVlcgUOp@M-q*`o5T1V`qVieZJOL)}%iQ4*-wrc{VI@(iNig z-wS1Dz1A4R9>Fg;whISSc|#yu6Y=0-uuQA3wqNEBxutpmu+~?FSe6Q9_gbS6W5ZIX zxkA+AO-VhQi>D)OSmwACBG*5Zt6MmCtg+&uaEwjkxYBVbM2_9ckst0O zFHYmQ%5f+}j!$wpmZx!C<2V!|M?TyHyTcZ)1hZ6ZXmnf(k&CC;^E_#1bF|;K9E?>u zwljrTHp)S&bUSqh0fd5hyzh@97^arVNgmY!a;PEWOP zkJpA<9j8L%DW6d#NJ6cNX7ScZ0Jb#S5>x$WIvN^$}Itt4IRnm zIuZ0XBvxnkd`g|Ez3NPv>_KekNbX%~$^Hdi|4F^P{;*{KiC7)3?KOj3>D;$LlC~R# znBu*{z3+R@KNNaO=9zCB?sSqBqU7%hC4B~)0n3002_@#2cyjz$I9Oso6Nsb3BLZ2! z!2Tja0y(Wz^8G@n%Ox(n`2blXFcCri87SvR0>MKt&*o9~fUV4b15iIiA*P`abyImU z2gz>P#J!#G2`!g?E=^^y7AQnJJTAG=8GIjj<-I$Z!EY2=FnQ^x!M^6oLm^6CCzPG} za50KOVD8DWSvZ)}=LE9Wr?$N_Y-!J3Y(tEt;`v3jokFyoLY<%8`JKzrap17wZkHp4 zsNYtXBTHp}ZTZCv0)*mg@GZKq1~BqN(X#XPo4+_N-^k<7*PTWRQKLUNjjRTiK~wd- zm_bk@a{Ns=XyY9MS?kfpnQJ0P0mCp3m!;Y*+Eb1~w6Q{i_i6p-JxLQx^1WLAGTiHO zrV!<~31vsE+2*W7c*ENBfpAcx4+UZ#KNiSpZ+{J=)H`c8@_i)K(jpXp1p;hjL+JP0{*tMw?dTM zO(nD62G1TXNTp;jf;epQqZq$b-bxg-!w+d`&!dpk zCBe}qii#L7ktE2uqvtY)~1@lR_-*gT!Jodod>o=38?7 zen%`u4u!~Zm~!mpOz}pV(1hWo6vO(E*0@?s9^yxc>}rS~5ygQchtEjLbb(fRqLGld4kUizxV4_!GZL}|WIewK1L zTR524Ndhsi=L=-*WPcGM0cMi2-~;*iZh4+p&d0Q1%K;M~#4=FMk%r;~^K2e7Jg!e% zIVi+56rye_FXo`m%OSK}5jbp687v2dXt@g|7nY)<-^%XHH)(62VMOxIw?!h}}8Tg#>@nh9kkP_J_pQCp{iBB?{ZTq5ED`;28gS*5wF(07Dm z_WYT3UW4B2=P#~Hd3tYHuqfs6n!9lE%#=50al@>IHQ@Tc4|lrUzwC0q!R3CVKryJv z{T9vr(*iN~hofagJm!A0;K~7UMLy#BfR2#ZYCuH-O$9`cA>z#d^qfHR0ddVV;?)A$ zBG6JmTLl7;6V^I?+a1kXP+d@+Ja0cf2g|U-jQ)bpJTCix|NwEntXV=6QEv~zC z=EC~e%sRrUSbalnEy|{5PHg6)IkD9IhI&EQELH4bu}-DUUc7K|-RBoJd*&kQu!OqC zQj25tsk)k(m&UxFUd*elTU=XHms%F{=2GQU%$v1f(agGK(`PN1H@#-joCPx%In=@h zsno(6haEAz#4^pSpS@r~jEI_rHJ8>bO2saR(3+)b@}(NamWBx`Vp%rgifqK99G*ov zOp9{38nVS)o{gxhnUjs0S65TBC>uFzVM9$eZsx+;`7=YLG{0DeKt*KAR zyt%AGq4QgbLLxVP^oxT8tGrOkVLm^F{Uo&$~4Z49vVLh9@coE8=9vy2ewX9ak zT`Yc5?9<4Q28b@NnVni(ck-k!p~ftZEnK{4o`-sa8Xi99w3IXi`_2Y57j=gFqY34S zgPKMnAn684YylwdN#^#k?8(v1PiHs(xjXXxC6Pf$seJtBW2^XlY?Ysn zZNlecJMHta`Jaz1@%h-QJ|Eke9kX3Jv-bGu5vjY2@a)Ybuj=s|@| zB3%+W&d7)bLc*CjSnJ}H8;bOw(8bYI)8jhh!?9y%#uhatCq2s0iau**{es!kb;z03 zFt@y7@~K7iR;H)wW-dt8msevYW*tLmRw zZ+2`pu%za8n3AQ){=HDBDPw^^>>O_vh_Y^Tvf$>pKx+Cv*RMJx<+#pocd8t6m;Y!D8^VL}?c9bt$TRP*rQc|Hku6F6+!3Ej_ zc9@QuTeH_{X%!?FGrgiiQC6mAk(mv%$T()YGgZIrRK31K`C4?-6N~F-mHT_u)f$B< zQrDIaWv$7-<~Z!WY`!|Pz2=D(So1`lwYVs0Z-KVBU(%y3 z9uSDO;N+%rTP&XYIeS36iba)}{7*Yfim{!A2Zf7S(>{?EMf*g`)IO0}3j0KBhR#f= zrl1Mc6xQrO>@_ew^&*+xW6p$Jn+Q#qT?KxX5t}W%)#WZ6v#lF-Zb7W{xYXiM{o&LK?e*+S ztj8hO(C9nA54nyuhVPogg_#VvXbtlJ?4K9j$u$QJcN(Bu4i}07T&E(Q=VC6n4OfA3(ac49{(`GZc@gdwGKIfIuLs%?d+!>6 zG_Z!0j3m#B26Y2>GL8*g2!3< z%U?MuOzUjJMVd@5u1_l$Nsg)+x+3ISX1GWLt~6`(6)v81r-o%qA3HDP`kLV)O=enA z;j-4as{7D!A=hsV7iluN*ng-Etqnr1*9{kGGP(K*m$k->{r>xS$i+927)WEe1R?b( zFH(*N))Eb@n+(Nh5X7>sfh(=0><3IT5Ms;TpIR8c@dr@qMTo+4gwSHk}d~bNgB;3r$1p@Q##FoLh~Rh z7~A=2Uv0qA#Zb;t;IOBKD=$)wJJWh*QTyKxlpZ8qj`ZRYeg%Vaj$JvnELYCKIdX>N z$dUgM69Kc-`RK2QX5?MbQ>O#BWI}4*gd*$ zPTBgcTscPyjn(I-s~5dFG)K-+LL-!b-oA5<>7&xit9T!1j@}2FWA=fDZ8i^YzG+!> ztk1FgK*Mq2)8w$X{4|>5_kpHFXm~P;b^eY0E1$?MixEP@(Vlf|z_z|GmgJPhNTC^P zXohvY{DE{iS`S&`d6Aj8b8LHTMDd%sG^2!O7w#Ngu8*GiU^(z=$V#Busvo~?IFik#8RKXU12pZMhx{p*Msgh~ zf-)R^lWqRP=`^Y{d*-|d|IZWcoH%&Pn`3iyW^a%ec?EZlkrVtGEt*5sS>>E8G_(!# zKJfYD|6Z0O=M?DOLMBw(2}J2=tuRla%swi zrk;0PfAua#$ChowxX?^9G;hUveUM8tPH5<_F<%dS_epdT*>c7U4QmK#{@!rH>|C0P z44UNNcM5W8DusqV59K`Z+{^dm(oEO~n$v`at(C!F@Z?Roa(u+(MRa_GS6M&n%3PYn zKG2*lG^}Y12W@@)tXw(h){z!dq~&_u)p}+wO;TuBUd;PtJgH1 z|L|Ggi z(U}KaoJ%uNXrzV!x^3o-hvm|o(<#jyIvL(1p^4$nyiZv2B9aaDSvChqZ!)gDNECO* ztoi4)cc#;5`#M)>Q2E5pFI5kYE0o^KE=Sw@RH2dH6;R8+FJ zwD$g9UQSPeqg(An+jSsK8q;Xn~oQs6U+UMBzKm9FTAGP6hpkg1 z0g+9^mi1}+ur%}V4xe(*{P#N@)UkQ{Kr??IXjt*{BD6qPTs6Pk{m)#T(d0n09QSUx z?!NF=6moXHE)kmDxKqxL&VK?8E}Led(Cp$J*Oh$-KAKB&sn9T<{-dw{B$tNP);ST&r_u6aTgfc1WjW==R+AUu z`^fC0et3LsJXa2DU?^u&{#{+J%#m}I(A^%JqRNicwYlUXK zp}FhGw|3;xGzksg)GY+`>hWL6piw)o6dK$2(mqW&_E{w~>^&I%dFw~-G<(|uZ?kk-+-Gp$JCx4&JT zBj%G{rp#ihAEQf*H<(^!EBnA44To= zc^E6RX}&5nv=Xgy>)#K2A(!TceV|z*G~dUa`uyj?H_^{$r*)&y%r`VTm&vBNNoe?G znzI1a{$^-Fx*RR9n}vqufGXr|KI>}}Z_2UrEkd&aje_OzkJtWyPCZOZ<=iSXR!-Tg zEt7A_k%MjmWy-IUoC&Dy@2}mha`522mCrjvOst1*JLh0TU?|FI zz#$nl#PE$o8(31%CkL}62Xk8v=D{2c-%hbXCBKn_c{c~c_X%uJt{&`MOi;|g9Ly0p zm=QUccn*fANo`Qc({eBiaxhoqU|Mo8U(3Ppo9i}cTKw9$4T|CSvl&ix<<9?f%#d)H z6Ab1$hnZ|J=QvEtU|4?^MCL@a4XPx2=kAmZnmYHuY*5Vaaxnifm<2AalhBSB#yQNj z26KtSY&V#N4l}lga$W8)Up1KX9p(=PGsj^{dn(slhq=mN<~z(rgCV8n;x7jCB}elg zgYg|^KrfYiio@WeArdA!%tV7xt1gLH`AVnv+B6zX{T_$0^uIBf)1Bns<R)&0)43t~BR5 zOu-R~nFI{IBYc^_U?w}v41*c#xV~X9afjJvFy#(YNJj}_nZrymm|BOq(_m&g%*zH- z<1qUTRXJBW%sB>gmBZX(FsmHqw+7SXFoj2|oU0w?VuQKHVV*LWMu!=FlyY6`Fm(pA z)L|Ysm}w64UxS(DFkdQGIkO$+YJ)k;VIDUaZ9Bh>bkufs8=7jzbs`;B3G@nn-yv7Z z&{R3D2MlJU!}K{urKB9@dV{&xVe*G5O`XHsW-v1x=K5omCh0JPj#JEdhq>Kg&U2Wv zhbzrIhk4mxj&hjT@k&$dFqat2(GK&F!5rf-krL$^<}gWvIo4rrH<;rb<}U^_++mIz zp>mFQn572O;4m*4OohXgj8v|{4s)Bq40M?P8q6SvnN_M>2RO_ogBjy6$x%u(+F`aB zOo_uhc!JW5a+rZ9D&{nYnPxC&ILy}!<}imjaEx*t;V^;0oaiuv$0|+CVIDb2F+&}u z$H|I0#9>CAqL?!s=4xQru^$9Xoxs$vdznBSEv=17MbJx(zr z9Ok(3iaFF_=2vLyMGmvmU=DVesg=4*7izfPU_zP^6O<;D^HX3LPH=LLI88ApIm~4S zbF#yH$6zjWm=6qQk;6>%Rn8R-v({jiJIsd$v(jP4C6w#S4)aHYX?B?7&QO}09p;w? zbF0H7lS&g><6(md^FF!?Gg6R+Ib8(|-P%y{fHM^nO8yQo453x~pQZEaP|gfsSX)9l z|1_9T&NbDZR}Pwx>p5UFSU;-p>}<@rIheb1Fh9=0JduO>T@L2W49ul9m(H%`QlbRv z0}PJyr(=qeXPUOnStQrxfH5r)yOVo0JR(OmpGaeP5%>OMi|UO zOEZ?qx8l0oVVD+!!;E0J@mpNy;}Q)=j6nahFk&%4d!HcheekPo8MzoS!l>xDMzQPV zn&=!{A_rgA)!;DF8}X*;Mgl}| zm{Mzw+kn-yY)<#Hn31*wX(pku2rq6iPQ!AGDYbcDW-%j-ndSXdku#bNo;wn3hX!Mc zC&buNzRJ>!v?aL8Vn&xhX|CKig&1RKhmn2*(caaT#&!wbH5N0{rqyUMwjy}fI*iTy zQj0lpG!){V?X(bMT2F{UlmrYLnp2wzd9y|HZb&=~T3L2xu?dZ|Q?|d9!&rSXG0PEu zv7@nN8e+zp;^81FlE+$w#ygCae4fP!Pk%hkvlvU#0p_S2n&KSH(K(o7axlYkFvsR# zj?2N&50HF04Ue}Nv0)va8XU$FIgGOg+%jW%TYCrRUK??bgqt8>Y;&V#0b;Cl!h2< zdFn3uj4eUldEzqWFqX?;8eGb^7Zo+D>UBl+K}rGMCguc9-xoT|JL}B zYlGnu8ZSMqI~^D04t?%C43Het7~U~lLX(l!U5E|S>ibmx?}uFb)A2zNnvAr*25gwG z7sfsnUEtCxGh9NGk=EV9)th%*8@~ViO(EB{hD&HN()zk^4Zxk@E71vWUEXwDbE&x(qm%FqkaS%WdnvAr*1#FnF(WiayijeE4hD&HN()zY=4Z<1e91vu;IC#_ma^mA=e_qB{UgaYcsf} z*3QGcz_yep4VTblaNQ?d?2OnC+%P-T)rx2AQC}nGSd1Huwf~0XgTSg>hD&HN()xwtV*6r`9diB3a0yLDS`P`At%tvS_>HqqcWM2_ za0yLDS`TNWb*_KyT_IOwHX;#(CZh*<1lYVtG42su&$PTTHsm_ga0yL@hK~vtOPO46 z#2)`s$W?B*geHUQG2t45dly_YKRo$meX|1(-b}+KG#UAN9I;_}eR9SJ_k>)V442Sk zO+M@`0}Qmds;Hcykk1W^eN( zF|N1S`O-5Vgj}~6E}_XN<)?%zy_7?)4-J>lWN5fSxJq!hr5tiyI3H*Pp~>Ld2y9qh zEai~vX~QKn8C;t(xLC>|*Ku4;2l;1R5LX(l!bB>FxGWPnN zg(24&mrxSEc7-c*{Cb`ksT+)E-&^X^`mx~>nvArzI4-6&^xpW8kZY&m5}J&BZ51xs zkbz$1Vwcw83l%Fg8EL(Mh_Lp)`oc@Mgj{uoOK39EdQrFvRH)22&UR_7Gh9NGk=9EY zX?a%<`A*37p5YRjjI@56krv10dY4x0QdL1{GSYfEBdxb@Yj`K*dc<%EO-5S36E0g1 zH=pv>Ts?KqRL)w&yXOf_Mq0lIHnbtjE94rtSeQJa$>;&L30E=ixPJcaL_x?ks#dv# zCPTwlgv*vPJ=l=z=*yH#Xfn876)xM)(}NAU%&W=re@8NF?`s)c>;Xcqf%Te}&}5|b z2jODAy5f4~jL6qQuELaZ2~7sqABD?Wp8b5t)wMyngeJrCe-f_Vypv?oj*TH#kIRYj zJfX=*>vdqYKjdh>c--Ox{~z|Q1U{Q6|30BV9OZZ*}YC@xvp6m4dbO!6j77M1`C zIEFBR)R4qv0>l*!RMKfGR&A}eRlioPwRNd=Z)*SxiW_RJ+h?V1wY&@g2pgl`O_+7XFo4RK8O1`F_@$H!9XOlEoN}^)|D{&^JCWjlA^% z#rlI}F-Bwkjaj6Nj*i*`ew${Mua6~*F`75t0akf~`fQ5Tu$)D?7^CTWmsxgQLoHo@ zlPtz)y55V@rC9UYg)YWuy0$XQY|VE)bmx6ymonjBk}Sq(y0$UP%u%Nu5q?Oq7F|SK z?BvD=CB^pqg!kzT_eITAR;Q%?{tQrAwbu!Dyse0aLe=SB#SYcH~zsa(;LCE8$Va9l1oVvW_|F{ zb$v)@QnK((-Y7rfw2#C+8u;OQO0pQE>G}v)RgQY5_1jw&E9)}ix?GIWJii@hmFHJI zT(C{CmP!_5G#~zxS$5AW*7K6Z7>)HYv&`~!^vVy%E7ob3<01~mXsmzXta_qCW6$-? zt1Zu8C0UHoyzvRMOwZSz?i!_7n^)i>4#sHS_!MWAH`b2ve@n5(T*)M!ht<>TGiKSn zp;)yYg2fmuUOSj&*4T$F{M9PO`prtgVvNSxY3U-w7f)UAh+^$pC0LBnyzx1+OmAG; ze#X0sHTx>TVvMHi3yVbv>V19N^8DSa1&cA7t}iVXl`oq6Qmo@U1&cA7u75L&d`Jh4 z=);z-nDt9CyRPq8x>idTV>De<$tYdhe-iR5 z)-K6njHWAvS$17rmaew2u#hpDt|3vn6zc=YVvMFMRntX1z3*DO7JNtOVvMFMP1801 zJ2S6Wtk)!qF`BNSQM#_SbX9fk~%PwV$SI%imHzQ>>pz7Gt!UZGUEsg+$WztCw!cR;=T% zAx)TL7P@RJBL^_ctg$^4u3Mv6_ed6Fw0LDOYceDb$LHufMt`VS1>Yl0cr#p-u1sc` z-l&-2o+a*%A@oy{#Td;SqnWiIFjU(dRA zx)`H*<4|Uq-dN!I?(2$m<@W`PF`BN!m}Re{4zhGz`2)dXjHYXhri(_SigmwaF-FsM zxTcHhsF{|owU9%P}-KkiI-5@MvjHc^IW*vpgl;=+!Q~0HLb_C(eB#SYc zuA?+vV-`()L$R)rEXHW%>u6?~IqHVLUEicwuSgbSGz-7RtSs0=^HKAsOj@Z}SwF-n z9E{Oe$1p1g*M{Nq-tVuOqF7Cm#Tbp1#Vj+Gspp_r4@(wfG;e&JS!Rw}*!<-Oigmz^ zWFJcJq=O1?Oq3u?@-jgiGXz@CUS!Q}|o_6_3iZ$^^5QKvG5B@!H8#W?W|Fs1trF&N4>xMj^AzdgIO|J6=|- z)sn>+O;?eo>&3dSxi7bLZIdj!{m> zF2-oOe9WRYg)F>z?D_K)>j#p>7)@81rt6dKKPgbG1Md*J7^CT$$}D?rbEW0OF3Dny zrpvGCqLqEc+ALX&(R7ttEV71b(dCw|1Ai_oWQ?Y(!eWs(Hhg?SwPMvu7GpGBmCVWl zV+cOM^&>{jvvl1rS&Y$iRcX3De6svj#rjgR7^Bqy)0j0@>bmN^mq7|k2i z7K=Q8)%>ec6suXX7^CT$WwA&qrE-;}>o=0c7){q~i$%J|Ro?NcVtp=IjL~$>VHWw2 z4r(jQEnNk7iL;E+be*H=dh6~{Hz?K>lEoNJ*SS%;@+@8JB#SYcuDO~nTH{cxlYS{I zWQ?Y3o~DaNh#^bY)sn>+P1k%)*I~bYdW2#f{41f0F`BOPqI7-J(shGmF-FrB&~&}E za@QA%b;R957h^PC=UXg7(7L(b(sh$$F-Fr>W3ec2{N&{G?oq7VdxS2=Xu1|K%dD|C zjV`=Zu{KB+V>Dg0nyxn|9P>TJnt!j*#TZT3LS~sYc1!n&Llx^^lEoNJS5VV+LDy+E zUE%wLF2-oO>X>EE^F@{qkNve^F-Ft1NYh1SS+VYvEXHWM7BkE2InavFIhL-|?-#ll zqv@*Gbe(nQ%0m@vyJRs&)Ada)UXZ2u9GZX2R$S#WQ?Zk!YEyeRVP`D(R8&$={nic^{`|yM$^?ArAx6!JuEC_jHW9T zrE8p}YrbSLM$^?6rAx8yl`O_+x|T-iI>pj8DgMqI4-%wPZ0y)3rQG*Qu7S zJ0y!Sny&UJU5fR&WHCn5by1YA(=1*7M@76Cqv^UhN|$2YELn`vbX^jq>vT)kcFAIl zrt8uuU5Zuwn6QvBny$+x#AH_rgNPXu7@?rE83(>vhRujHc@D_M-ubX~3KYQFXPEs9mKUg% z*5W6GF2-oOzGuaY5U;*mw0x44UY|%7V>DgYYPv?;_z$;Yt@wk`#TZT3b<8>nmuWOg zd%trmT_ZOL7GpGB*K4|N&Yb*+VtpoAjL}A;-)9z$Mya=4Surh5vEJS&bTLM=@CVE? zYa5!!R;(AF6fDMQtQ(j``49mY?Fm$@jZX;{V>H$eHP#cG=Ukvzzu6>MjL}#(GK=Cx zJ+;~G^_vyzj;95SF&gV8W>LJz^A+Q-OINJ#KOiKdJ0$x^H@C5tgyD&Nd3@&@UmJxhvJ_q@=> z7|p_4n3ayp2=JVPV!b3;jL}%PGK=Cx-l*UD&KSii*^E;-7^AWNhgqiQ={}B9%NzGg z7GpGT{FGUy=dW7Uxvm?D@uIc1saCw+mn_C;@w$UqX1wOSw)}I&%6(D9i!oZfe$Fg2m0vu4ew|`1lPtz) z7T&4Fi&jPyt6Q=dqp^O$EHjly4EgXL#maa|SjZTSb(h7WeE9ab-#zhl%Nuhfi!quv ze#tD;8ynyLO_pN4^+%zLF`74i#Vqm$<-;3aYFVLJ!9NKWV>AozW)`Iv9aOU^7QGXS z4#sG#dzfXf*%a&2*940(8tYz-MKzmZrM)3ojL}&4G0XIPAnoiQDAqOqD_D%tSiiR7 zW!7wpb;O?qi!qw#?`M|j`Mk-OEmf>vza?0V(RBTWS@!npI4hNXe-SLkXu2NIbUky< zWnslyCs~ZqQu#qYcyIK@0?;W9wF`BO5F^lR$I%wb5L@Sjal`O_+x_+^w@r8_bd>+KH&i!qvoPgoWbg6b&6`o=#5i!mDO56m)i zFZI3@>*fyyi!mB&gT|uVt5`ce5-i4Otc_N@sQ2~9Bj?(DIQyT1#TbqCq!ll!qbT<( zUBCWVuo$Cx{wZdextHoF#X6EUEaPB|rfZX?i|)G-Z@eOO$EWm-=T;L&)Ah8bi`E?! z>%q?ii!oX%Kf^40Dl6939fHLe&BA9b3kgA~tXM~XE?A7wSkE!bp2~_f=L^ANjK+Fi zV^JzAR`^T7VvNSxY{iRG`5Qft%u}o<{w-LH(O557@iJ3cv3CAPuo$Cx{zYb)sr<`^ zvo2Mvv$!AUaxq5p{7cL-+e#sOnE23SqDno&MCvuTOeEMxE?Gz z2qVsQ%QJLVoOw+qQip%()9PwMlnk`v`(Jg$9S@^OYrpLZ7 zS%eYiekIQkSeNrU%W>m8rHnYt^m-dCI!hR^7PPjSh&PzkZ2r{#r>5c}4#EiSljRvY zt84#XmP2`&jsq7T6*4(^VzOirMrXarEYr&K|Ml_diuFCoB8<-ZGqZ*ZRjyCxZbXY| zdhBk=B8<*@OVf4H&wemhv7VMJ!sx6m%rfKkkFH^tDb{mH09bc(f zL(*^&2Vr#9UzufknO=0jLv$SS*AC(j-}V6n5@Z?MHrp+H)gGX9n@Nj z!_-_27UdSg=&W~`Ww!4+>)Vn=7@hSlv&>xie(qbVm4)44(LorU^&Yb-gc4V~`*T}q z`c$$AqqDX$t6Z{H{PWd&m9B|HaS;b$bk;Uzogi6fh0guEVl9&_!sx8`nPvL=+gm?G z%VPd|Sh5JCvwAev|75Sk{%Vu;f@Bd!XMMn|k%rf))Wq*I?BgJ|~vIwKIKGt;o zWXBVKQLIlTi!eItUmEMJr{3D3SYIEGi#Q0Qvp&&SN8R|(mlVq{S%lG9pEApAbFZ3p z01EjC5=mx&3yf>sOLR7@hSWP1o&jzKk_oGxxqBS%lG9yO?Fh%fE0eilxaK zF#;EH5JqPaM7-IMuFrq>&>IzNqGS<9XQeR9j91HDfklcHlq|yNtRb4N@1>2oSh22^ zEW+rlRAwDO=Hb}y!AEVZb&^FGot4I{69vgN=k^v-0LCk7n--H(;7OC^giIxC%7W-7lv_C3r? z;}jncN)}y%|zZ4>;0g242gBKKsRbP)zD+r3?x%raZOcV4^~ zvjI58$FTi`4+*2|8qKUzfFi^j-&=65VojDT!sx66nRTjU{qE%vPb${Al0_Jub&$q- z=cS9V>jtOzxKy$Tqq7dySm%%YV6kG|B3XpdS%+w>yX#JPS+Ukj7GZSOp&D!4d-E{vf%&6cLAE!tbVRY8v8f*X8KFm|B zO35OO&N@P4t$*P7s}-w7vIql~tt=nOtk`AwddVUTShjq46tm14`)6zZ-KccEBUywo zS>ib&M>C5`N-91l29Li&v5q)E_>eF<>uZ)SLj1(_i)R!oPqGN3vyNdF%|Zyd2mm1t zL$U~?v$B|FmgUl=ubrt_=Sdb}bk^77ur8G>!hmI~ZH{GDF-#&0Hb;RI&)8v$B~L+Z(532oDiPXC2Qh(;H21ZCs!%Tp(G5(c^UjvkIk!na7sf zdMP(c7GZQ7*XIY6tyH>Rku1XKtg*}@3)Aos2Tt)ZDpSOZFgoibi$&N6(~h*2 zlmf{jj2^F(ne`1YNbYwh|I0SwSSDG7(RGbumKm?NhhP0&LWtuo$s&x-I)z!(>QPA% zhskC7_Q%9@6z zQpH*zS%lGbp$ zB9#fFvnFY*2Y&SXy9gnUv64j?oi$lwWu5M}jUBv_MHroRhQ*4m=NCv8VZgHGs56;W z2$Lud<nw|ffIQ4l+CjpHgwa`NGt2b6UQ#AY z7GZSOH!K!;W5S2)u#*#~_-K5Va4-m!8T$lPtpMEU(2vKptl35y>Kq&MIM+881DRpOY-Y=&VwU6&;tJF?gxXqz3+WdfkX$r{f(fmmmiop;1rwT^TI)mgO^pTF9*^5qP+QX&XbUWBsSgF+ zg*C0g*%WGV`zqa)&B4aEzg|iB>7u2-Y*9L?zcX4$=cJ1PtmO!Yb zrasi_E_Szu7P{Sl)ig9T)z*ZXT5vAUEl#`7B?Bjg+M9!c`o_8@w|inCELao_1r`Qd zYg_7@$u4)G%72cqA`opxfv0aa;PJ<-Ft|JvY;1+P)`8b2oEtY<{oq}X*E5R}(7U|3 zsfCg-FW)_@l3m(L;XoPrKS^7Zmz$8(!I~vbNi9+~Io%8D8*5tH1FiKJ1>-wCFg1}t zk(H+BAUil^T8yG;IGyiwU0lwKe>vCVF39n?y&lK1A;gS#OkK|6G^~fIjv&)kM}Rao z!F6SAeBdO<%hK9XM?kgLj& z#CKE6lA4gLmqbmLKh^IwJU*|xxuIQL2sF2~1Zz>fAa(QH=ddw>sccO?e$FA|^j~~6 zfGTTY0L5YnGGQp_3IytxG~-Luj)CTymYO9&Tn;ogQPq^_I$$lqP+Lo*1QrzJ1pH04 z7u1JDftUt2xeeGM^b{22Mqfr%B&`Uxv@}{OsX7#8F0i1jt_~(O!z7s2D&cjt4Na|P z4C?9{+FBQzSHP{cg;CX;zna_B6}&=AT?y2+27?#WPaJO|xrUHGfLsbAXlXLfQ{O>1lYqDC08VD~!- zB#dhR+&niWApQlW3M>0r`ZPFL2oAQO+3Yu~152a3GcHzQ|oUWO#(%>IyMFX~oLG0=$GnaVj8q}rNRdo9bQG*`c174Mh~d&Lka zjb_^0w>Vb=B{j9EtEUGS)wfcAOO;%-^x_)QDCp)YNLB>}h4l;F)H807g_yE?V5*2i z@{;Td^6`uJ{oM~6nnW$MhGP`x~npe+4EB?^&@&O&f_s`xq*ae zbwzSEp`ese7UO}8SuT8y=yL6bk8KTbf#u`+CJbR?4{1f|j_@wJM_f8A0}=|L;y%X+ zRHz)XtbSooIU@-Hg`Q%YFI5IhNHw!oL0$dw;6k&yqP7-PQ77c0&GpR6(`qa$2PZWW z;&qz)7NN%z}xg*2XXt2FP2`RXLh^+B zT$Rjy78@&#`a^t4e+Vh<4@|PFCqi6e!o--I- z%%mptY8MAFL!5}*E3xmjq&NH64Hb)d7@y#t8 zm89NDpbC(T@*i03@S zqaoPZ8rQ+XVn|h~6Hlajf;$_N$B{|0J1IgnTc8BF;Qv`%X*#x-IfRE#H0>6uY54z> zs3^r0Pp8SZUi!dZN_hB1^UF@lV%+8CrZ3kKV|J6p`cF|Cnwljuu?}YhYp5M?08iE0uUQz|#ij(S3*v&y<&ZSzByHB%f8rtHlVNp{xXZCnTk(bdhp!h@&IJGilWD7jHO-{ruLQI;qI2j}~;wX7mejaa^D8Oiqa(J&LQ?@lpqHxA5C^V0S#c$pb z)!N>uRy2}NUP_&MtmmkO2c;)X;{YLG41Dy?f6bI3(!|7MRLY9p=uoJz{i`XqK=W1>1eBxtXX13)*o} zkZoR{i4_ej#Nr$c=ghNW2M$(1G*QKo1A<6V#Yv0uCKBaMT2x6QQ6))>DorG+G-**r zB2h-tqI`)&`H~h@o=8-A(xM{P+Gty`p06sLMQLr0t-YIt8Pec#qXx}<&~`J0s(X2I z+yNyTQX2Z1^@RgaZwwqjk?j~)Oth3)o}H6#v#oa>4zqGG_i7eoizaTSo5kjct+&wP z8yGDtR%wCKyn%^Jo?B^w(t*&zVofbP6bRJvEIn0XVi`$IX++!?LzDCvQ>X!uxiTJi zFB4di4MGkE{xaib$FL#CdERS4ObB9@9{cOWs3wNFjtHvH2shqf21AWjlgc9$Cs9}Awz3R( zR?LI+lAayFG#u(fEMhOl%?xBE_0Xu5o*nCkvp@yrT*NAvT-V(T7jtR&T|nLE=9>Bz zVIQs2$5?;j^?P&miGQ@lT7rt@3VYQp!r0G2Tjr8-p}hUUazCaH~Gx@^vI-9fuF2gdv%Uv;vk^$AZnS=i8Hq9i=gY2q+*J{y{nmf!MUnP!m zH{BMhrZ92aK<(me>=eX~>;c>*=pJu)=%#H}Hj$O}=bc7&@%d8xS7nElJ?^-PL!_hG za_sB3h>Btm`z=~}n8~rPrHK7(1ldjORZC%a@WeBuhyUvbUG`W{HnY{f_7Y=?1bsH# z&SGnPEZ50_-Jpyt>;{+_b^y2g3v~;z@iBXF+Vz1~g?UZfYY-!1W8QnafagJ? zW89bBJTas>j&bE2N))A!YyMI4?Dt|g8pBWWN#bUVDCzyOnJ8N7(%s%2gB_Mp;&y+x zOq3{|{&b$W=%*(l(NqV`fjMnFq#Y`;O%ub}eOtJDzlA%tKlj+qQU`PP*hW*EJ-M=X zG$1Xk-U^wj_Eak*_4iYoAf$;Els&a$IVv56IeSCCGRM{flCPpVI8s|bC9ROQ*Cego zoV_7w^F@`>cW1XQZd$garmn2Opu8xaR#CKk`OL*FP0PIIldo`-I?k2QQ^&*(ftGxnDxD#J6w$4)0k45`(`Od9 zaUBFjXm9LV zzB2cX+9O?%{a-)3qes{5PVAe#9rW4T*aFo-0L4PdHzP0*kH|EQ9}wB5;r+QdZe{TP6G!~jXRjHgE`TU%A*_c^s)V(MK5;<2`tz5OOonb=Ry%T*@!mq63R z1kcVj6(@pO;^IAO*Af;NWQod^chB;Sk6d80YUhI3S5-CZ08sUV1He*0ppTfdTrsd( zZ0;CXMUlH|SMrN>fSeQ9}khPkT9iYUcM>?7@ z8%PxcUXVE=gH(!H*8mq`)-fpMmo*J|;bkpmW|rNK3TXa-syf_^InMLZgCN}2w5G_ z-Fna^-)m_`V{bFdbk|pArOaxrzd|uqorkYbq$B$>U!ka*U8}E9l=Yt8S197Dj<&LqQ8g*F+q8BJ_-8`M|mnm!wJ zz4izX;wyaZ@f}RHW_0(SyAiBT^4?^UDwcbbRguMiZ?a8QGkcR&z0B^te&A8!n{9fV zy$8eu(+&N4N0$||ewM1rUOx+tEI$1#UX_4;7Hp;-7p#4^Y3=r#Hq176pC2(X*@ril zWUCUo&y{_2Wn`VS&!K&EsH%ncxw4P0G}|59UG@8X+9#j#EtF<6w9l>L?ONtj40pdp z5^goKE9cQcd!Lq>nuDx$@FPoa^BVlfvev|DDC4T{XRd(ad;-+uMp z)Tx)3uVDPm41gV}ah|}Z9vW>rENQ$_kn}4~m5$^omYTji$H!{&@gQaMr4dOzVw>;h zqUXZ!%O-8p*L@TeS#|YMoT_;GD9H4-ZHB2&5}l^4`a!5^s(K}Da&J8}-$`p_M!eTZ zzDFdfEMf7Z4M_TBlk^^wX#KsTtA<#4pm!2%xyJHA?8Y>L4>stlWwy-FN6So?_w~Ke zrqBB<$26#q@1ZvB>8qI9#WnSf^kj#=3KCDr=?6i=qP+gHs2>DbNw)j1{m6^TK9;k%04U@Nw2zd?V= zy^J&J%fVMIVx7AuREt((kEph?cYC9Hgl$qCeR_1PVH>No?!E-mi25Z9+SHpLleU81 zW;shfX@%dUXBM4)lV=*($9ExEqnJL+QLSE|MMaKW`Yceje|;8Z`W+Kb=0H5DT;cF& z!QGb;!;s`>6!74|IrcSETWoeih%%+vj8Ae>XufKWt-uxpc2|I9LUs_3L34UbXP@5D zX^?wYz$~0zX;K0hQDs z*MZv`4Q3>0*Mr$VauBQc6CFT8x3a*gTj)UFeH~Ur@EqOp?3{d?$ItQ57}1*g5w8o2 zKL6SfiYsDf~Ix$0%L?{u!Ul8Fh+Q0FEK`VCVy}8%wA$l+)5^Auc>1O*AnHF z|N8emT1&rQfp=TF?0ez=`(Nc5y?g8{k;djDdcP8p)gR9Lm58$1#_^SiuGtoer_oL{ z-zoE7-!N%+;e0hCZzg>~c3W#OP*+nM47o8;QromJSi3ajE-tPPlrP|IQX#k7J|#p` zF*K#(fXv|;7r8MlVqiPqn$!-lL5No59-MEmAcT^dOeT_(rGt=4w!&21Sl?J5s;_CNzbLpcumq3P z3e+?N+8X)Y?!kprJ|cHlIzHl(u(^5p<0;ds;*d05#$R@+c1v+i4r)Wn-?Lk4nh_DK z752@T9Cvj9wId2+L!dd-VwKB4sAdti4Oa&|jqNh5&sFd9>p5a#KM-?8pqGBtI;#6z z+n=tD(GlP0;Qn;5ZJ@EwvHj`TsDacz_x7iIwSnS3*Y>At&Hk61mo*2%`<&c=PL46q zAHUDf{5%22{=4je_o{CeHFH|n*3RR~1Y>h-T{6eJOKd&$z|6gBY)*U324KXj4;A)# z3_E=iWfwfdT^j`Kb6Rpvi_yK`=ep!vXY07{b6IjOi|Uf^b6j$c(>mMxoR*x^^lr4Z zjUEO#=W7D$6f(aJ9ARBiuxB>y}rVbPY3O&V@B_%>cexR(-RS@8%gFt;_T~nZ? zsVNlTjLT;qR?X$p}%j7Z2dy~cDT!j=l}C&xw|ZBUxL3c$aw;YMgwn$D%BfR}%iV2J*CzUm60hOMo37eg7dN%2 z)L>#^$<(P;Q;SO7(bvX%jS9c7!~>!AjXEvAtk73gUgR%wM_!pQwW6f3qNvhvX|##9!r?GYI%mQ81w(zhJ`bniec^Euvrv?nEn?(AdZQ7|FYR4@TW)XYG+UT=Asr^GkaT``PjBLCE)^0KKYIuo=DXB2sm(4}}NV6%KgU<6=NS+S?AqO!v0u0vdr-a5aq*j-fO z^_F-`tK8zPiFn85q5vKWU0;LhNz+wW>h@Mu75d5wD@<%deJIorj1A8>{Qk1aqT)(- zZozoG{*8(}Y7vS~VIiu*5`U53JJm9)rnR=dzFO(3;W7~9d zkqTucs6tALqM=K5XtBGbthCr$Q5gf;5?rW*OWc*dB98~vOtjoZxM!$QhkM;6r4|0t zN`DMbENEy`wGd~W5_efqWu;LO!;qSW=EXI->|%FWX+>2@k(MPy6+9t^-9_HYii+~0 zGMn8J9MkSH!zd}QLdI5wPr_r_U0zaITwGaM8jX%NywY7#QiaY!u`Scn&9f0%zQ}Nw zmXsM&D}45x(NK>jeS)-v>VH{Y0`*o2^t(&E#Z~2ng(Ys3^?-O!r{+3{_7<0w`KMNv zxZ4_A+nSrvG$ExYU{eZ;Un{yesK2nCLDXV(mgu4qcad)@DxD%Y_@2p{KAC zwSsuSTtRkm`AmFOk`7dr4Na)LMMV;r5u(isZaj^y0K0%FBpd9cnkd?6!w=O9)Hf|? zt8=?&k7p@$4eq>r+-l|?Z@(|uYT*k#?y`~!U!~te+dXMNXq07vnZ7)9qV(<;^`Ja4 zPMf_d9qrb7T#?t%;nGhz^|w%8`+cRQW#v^<-4)d6EDYAwH&PO!DKOK{N^|b|QO63q zzr?d<)njI1kZGy@tl5MRB&qeVS_diK#1K>{iKLV!h8T$( zC8R{gDIp;uK1t%E6ROul5XAEcB66vI-i(iaRvI1aWbPzcicl%|npzjQ4N(~Ec|^Nl zYKVzPHrBvGiaqwRFC(E*kYn2?uEi8Q-pm?FHMM3fLsJXABC05hjF^X$;j@@0o zR%p2-xlwB@pCreObV_op2(R>p6z!JYu*d6N6*J!X`e|uitdmN8tgGV-wkUgsdF2TNUMMwxiT`d_X5ndgd~_&#Nuzn?3T(0Nv zp<@U>S(#Pm$HM&;m?M1*bHsfYmrn=gcM><$K^{f#Lx~X*rQQ~L8H#zvp#~7mw3`Db#UM@u2wn zfjM8|;@KAh=7vaIM801KgMJB2<1{wUH5~s`zF#g*;=2l;-vE;~U7Sk8KZR4}XbR4s z0?Znj^q_5i7QPKSC%BMJV{(tlDHX3;$|g@J0}TT4g5C` zxZg?a2>gzfZYz-g4x8(8{a_vdIH>-Lg*y$njQK9t+2=9Lv3&dO44;@bSxpD1u zV45V($uGwM*9FWkCC({5CIZ(D%%=%(qktPpk+B`I@>MIY9|GKJiFLA%vghr<45=3a zop9X$0p@s#bMni0h&dgY+5|X?#}Z(cC%}>3D}lKx0gmKd1I&*S;HY16yTl;KM=bvx zf-5fpw^d@D(v5Im0yFxXLY5Pb+K=NUMj&J7djl8G1Mc<&@(w`)JPOS77YJ$l<6o?J zQ1O}8;Bq~P4;@bBgYx~Kfq7rzMEd4L^`9wy{{_t0B_z$cpH2OUvw&Ha05=Y}Ffb1$ zz!d?v37GvG5y0V;PYE{;n8uj6g;vT_zW)v|TP1E7ek=d!^+9$M`r7!=p{H-Vti@1= z<61E=Gh*UYy_*i)B4C;%&Z!*L0M`!8>oMgi`|^PM2QXR92;gw?O9K>r1DIc2C~*7Z zU#$4%{2_I`sIec=&Lk6`0?K1dhsIEP0f#PHuC#CgMYfQ+&xUZeWZAILg1% zC5GhDq4X;IsGmIxxNjzqmjhfV33)!?ewGC8V&MJ`+~TDO;NW^Q#yFJhyAhbXCCKV}>Go@!e=P~z<-mn6LR&}<$Kh13k==Q~Op-V!KO-xh}r>_F{Z(v?tNz$D2-xgdO zz6#?veCTlU^Lw~<+_#Vqu40&DKA_~v1LkgtbBYI<^)N7Jtrqf}aQEPH2{4}|f!hVl z-JS8}eGEkp19Mkc;3yqqrN^OtrD0O66X|;BH+Fa%(Dq_lTtAT z0Oo)-q}Aoh#3z=0`{DfEz&t8(PI?ys_k_eC$cK`r%G*J>GVU6*UHH(U%hU6{0nE&p zI3@4+4D_#n>9~c(xhCMB(yQc=pRfNPm+M#f&|&#`xjwI#j%#ZrhJpCv`LJdkM}Bz< zxR)gs?i9EPd4&5oNqM_~8}(BVa5%{$`%aP=2I9-fzFgqWP9Trkt+`3cYXa`#1o9{! z{V+*+cLMi70(s=Wmy(qC7H~ZYGr0?AjpSPy1fJ3_9WzG+-^#W zFYhqmj+5AU_IZ+&=L4=f33;ta%DWi2s}jhga&%jg^6mrfcM0TC{(A$M9*K*WzPo@K zb%*e=<-ZvD{v=?gNu0=k(fOY8!CYW!6W}PmOC&~UcCIJefm?e#mFx&1M_bU7oA_IzB&?}*{Rf_#gT@OQ~lQp%vBQSRR2+ZdJQnQCBV%A?jB%< z{{jIVG@f>6R>iEx+kjamaq;}}Ltt)`IHzVio{v*h|wPX1(?4lkVoZw)Lr

cej(GXtFkp_8I4d8-NH-5K^_slce!di#RTAfv?;oDGam;^M_)5inP4@?yv1r@-8=;iBV_1)DYk^Pa?s_B>i1<@*ep ze6$@-?bczy9Vf9?JR-_bCgga4nI>`Z{1OD_!bo{B^6AyUJfz8s9gnAhc}e1&@+s9X zZvyj)#EE!B%cFkSLHA=#4<9<>#iIzAN{O@l5+fczre8hvOhw!1pshpF%X%fRgd^zQV8sL^ltQC)ld@vULFfjK^Ts*&Q z1m>kkc`^L59hk!(64nWM(SD(HI~AA-5*M$W7XUL`;zT^6CbD8=Y?C=X_wMNL;*p;00#B#5v^y^2@~% zLwf0ODj!z^catVBIv07en4dz^sqNMaZM{{fopOt?-=05 zNvxCqvLM9=OufX#%lDT8(-|o*M!vrTnCCTlvGe`g!1PF5ynO!&F#G>jMAs?blV8S3 zj6gd3c@l6%n!Mbhnz`dD-yf2cJm-;)D zOMK{X%2yQMQzeFh_;Sjp6M*w1kT(YW05HoWE?zzj1M`DOc`@?o1Hing$%~y&w*#|N z;^O7gRBZA*k~VtcaLT7tznlS#PvYXmV?HqTnmpvw81c9Yn0q8n*cUqn`AuqOl)xgY`xOjeE1kB|U=j3O~e?OKOR*WyF z{C690_i6H?>jP>Bp9kjcNL-9|A*CDj6+U!Weu-!oNZz<^++TqY9TqNzy!qY82l&uo z;bO?UsvGS&K6F^P81f$J#ykx^bXd3ud6W;{?#4VOK6F^P81hE1#kwgz8ZJT})u&S= zMj)NjqZGIq3FJ|Ia3L_A5*II@{ur1$Bjv@&ryGI!P{T#%Q}WCH>&zI4|D3NP;!Ej! zG;p~Rn}Xj?xGBI?CcsgA&jIE_i4*A&+rF!Txmn_dn0jNR+x@^iE^$`+M#SSN@ZSVx zr^F43BX9rp828{qhb1qDpCMQ>x+Mmk8W}zy&3SNOyGCNu@tfnTZ|mcIkbePY zyTq}5F7rNDQv>#4BKQR`7e6h|Q98!*ADut)8T9S&p~ER2WKV&_Fc4p{S9Q=@Rv{+k5cH#gZ4Hm;CacBTm21`U~KWc~017)w?WD;Yi-uz)X`k>A$G^ zr}qPHE-;G{;HW;h5SZ&F&Pulky@b0Hm}et#5$RhD++Tn>{&@s&2>YtKBkxnEc$^MQ zk%lwNk%}+Hqa2uX65z-kBIaj|GfarJ31~ZA5i)I5SURfAb`UuUy*$$ z0aGq{|09CpUArSem));UlO?az+545mVHIjXJ*eSsuo(r{Z%&u zbBDySeJ-~f54btK#N)$5h|7I5$~`lSj5Ci7l+P#%%<@h@JNJy7oMU5L_s#T9_sp!E z9w_z}R+k3+-dSG%*|Ct*+ZsdlOM?FT1uZo#?Pr%42a4MpYnIg4PRD~_@!%f_FZPyr zs{J$lzQQw)UDCR=wz(w~OC_Qcm@yMi2M+jVR0d}IioJmuRo)_BiO)NI2J5y9DxWb6 zgb3-C{^ANxxp&5~S!wXfc6=Vj=OS0iXmXPG%z2CILk%?x<}GNeZ&=tmk0M`}yD&H} zXP)`&LKR@lsVyQF^IBVK)up1QmZ0^Eew?c>qci`=IS9v_-Ui-5QAojgBXB=B}rn@p1U1 zxu~p6MMg;Lg|H#f!cK?~W^~TWPB%ImvNMg&Q1+PFurtdOPVt3z7~%I}lVOBk@ps|B zFZ`Mj-p&G7cDId@lAn~;^Uu8Qo|8UJO=(N*7?l!E^>_KRjgBq<_J=oiJeg*MUpB(e zb*7R?$(@&-V}u*BCmZ2Vwj0sS3arn8bt^fNXCSncLsaQ3LCuinG7!3i&$S_R4Tm1i zL~wm&Ib8Nc^=!{9qigXE#uXn_;i9pzID7JccJ10_bk0E(n=^gkoxbo#@V!60-4}NG z!cXp6^D5}Zs_u-H2cl9jIxZfQ*)r50PVGtcBMBfN2mD<|xG2-;*pZrX7IGliZf5kxNhyrr$R?h z9@3UsJb8Lb+sNX{WkcH1@}KG%dgN0bPo=DSDs+Hv%I1ufSCFb*n|hx1joWN=e7-AV zWfRVHWTZ$djqpJ|sYduE7@0+~J&(BY?d|exG2nSOJ9&-Kfw6zasxDlSUe{90&k>_Y zL(-8DW`v)N!0qDPxyA?=Bav#2G^2}SW^@+s=eACET{DN>w6=5RerJ(-nZ^iJ2?0h| z`Bo9y_H!5$9xfc{3lAeNXAQ$Szi_5Myus+2iD!d_pW9WHmGR)KHhHVM+rDOm5j&%H z8Z4ne>Lzb~cURSrez!B@!Sy{u^1A(9Kgy=uF2qD3pjF8|KAtbov2njAs?(;DL5>oiCV5+ZD zcwS-zhiFEIdT}YPEPPWcr?|%An<~K+7ZrCxq_`&I`#=tHRhebxGE_R9DW9%O35|R- z9hYU^q{=aC?s`%&o89v@gihdSo3(#d2|s_`)wBec^y4%<8PVxMc8n~9o*YVsg->waXlaI=4`^*TZaBUR6BzLT_YS(2W zeN+B(*-+oO|MU#W-{lX#ORd>hR28{~ff{u<;Jd2QQHu>DR>vi|nXa}&=yDZZ9%W2< zE;LM5R5nP)b=|Ac1fabe`547^+XMIt7w3*Sz8lf)*x?SHOuD}=#b!J>Gj|T_6r#`| zgk~GNp6_{m)f;W+N>F)tgD?Dw4dt7%p)I#A#w| zWWag3RJL3_qp3-44hy&W!wbn19C0J{InZm##$UEWUa* zz8g7YbbXr)--ZvGR9m=nW_D&ZbxF_}F~Zf&MtBIPdg><6y(y1Ul1Qt~`U3UB{PoXJ zRq+T*rULRPht5VwSl~tI0AzS{C@BAN*Gy%+@av+Ip^i%3MmI96zssFfzN$Mk%m|P2 zb*77s*c+y)AFuL{!TSoaABRn&^O4z!qDBT}^(&${C4ik+jJKGL2 zIz1fjOrbNKp3I&T+$%o~W%@fajBu(kWpdl0{?7EC(f-cLOg^zZvn|cvX`qkfOZSD> zu4o^FZo^I(ik!KUw4#G$K#K=gGmR;mGFDNa+!wCOTyfDDSKHS&c*dk`C>#TI1{6@^65-I{SHq1J5xCP8p26L_Cb;agUitow zd_JRg>3Cz`C@3KaYj{^C*#`g z9#~GH?{#}uc87)j>PCZLm zXu>G|sT+#Yk%884y9o>rc`k&4hte|57aqZmJerfxC(>@p8r!eX$35eyv@q=OjAK?n z1SkCd0>l?W{~*hZjACT@4C4$VtMz2vCN>BoBT8c+IW-5=<@;+y^yete2 zuf5aa(C~f>@-49toG`y1$66d~!kZAU({Sgf>4HfoO!&|})uk7Tb4;Oyz z*CP!YR;E5J+`yHB3}bdgoD}mR=<-vu`%Rdi#sT!Fi)276p0buDK(%`P6x-d z^VO~Rfr6tAv*~B}rHCsggR9t$un_YfG@0RH!ziMwIdn8a(>bEYBP52BGzOs=hBViB zghT`itdI{OF_f%CNDL({(@{C>^wNX}^|m}6TT?PtQu|J!(0EVBj+D^;@E7VEH+6IZ z>y6qWsHoRcJ(Yz)e|DCPh6M-@!PzP=CN=Ui9>jQm?T#^dPf{f}BX4cqlc;=W(2wb> zafz-^%X?Cur&H6o_;DrJlb`X>kUCS=Q7o%&?T&OIY?>rZBRP*zDlv&>X~NH&t{hG| zDZl%S;xjT)<#MelW0CRT5Lm)imh?};c^*cZ2qQEL*mIT{7(oa(P6fD~Q}Hc?S~zq7 zzC~)&ojEVR&9Hx^&NJxcnC>dIn*_>k7{(&dm&O zLIhU5L4|fQrWcLWwW~hmN!5(&))}emsA@q+jp_^$quEyIaw{a~fz2skBaCim*F~A= zpF#O#zQ+Qv^ z1TWee8V>wK!H7E^EjMVcs=)!rIIEKE>Kjsb;j zKEa?BpArnOmXB%0903i^kJ@RV`+PAv`){mRp6v=9EUQj}V36Y`$PR))5{*v~sxZQT zB6V{l6jNYrN70F~qT3+Wy3`5GVi2>FIyuP5s70Q}JRQCnzQ$&`90i?EwaH>sX&41j ze`p-n)~6!$UG5Ljx={s(s6Rwg>1nQdgywPRI)tcgOmqDVp&1;y3!zJxL9=^eq_hqp zA&*w#&tV+3+cbrbX``-hSK)`TiwwXTpmknOXHvV6qh^%QY9NLU*^52lZJw~0(bECn&RVNi3b5h0qe#U4~FCht5Sv zEVl6EA`KR*C@WagAI&^;kcp5&pv9cmjW8Cvj7-cSXP>_seQjDkT}FiS<4 zJ=+ZXs{-q3?c+#%(p=;4y_&5kN9gw)sz#`jLx|P+_`z{VM}Q_`Mb7+{HLA*|mabYYoFnh6K#lsMsvR?LrX{C|tM?_Z{((%X&fLt`S z;2UFf6*U`Yq_iFD4|mWsk`cakHT}a(T)1em(V1C1ZXH5Z#htDd7hmEEjWEjs%Hq?M z%je2$a|l=>+XfI4t8+~ViELuV@(QtT`kGN&rB+r~judCbMO-QFx{}Tmcdi^c6aSHk z&&NNJDZ0Xo=@hcEshNh3q7Zoz5}9!hLL#ej`XiZKm0J2EdaoI)UJMlT{5#6QyEeKkOfEn@hsn zN5>PB*DDDI3Ze8b=@S``c7%K*!kk1vUA-@zR)Mgxj71{oM1^snKg{a}NdG6v2H&nM zHYGYE$%>j5Q8244e_?GtPK>axgYx@XZ1b@Q$;lYh)Vu+s%B+6#pP+WyZCr6tCM^-t zI3xVpvLk5vedUwj`8uB3g(`wG!nTKSLSzYj^1<^6b7}m}&ByZ+w8NP4YUm_0`(|Vg z&lsJWky)9UF?wpIv9Xk8;l9j-4kiwSHK;4NwcyVt)QJ(ztoqvUb}aRve0T<23BQ zakqhj$e}_krkX_E zKsoS)2suXABNP=9C&)rvI$-7*LlZ}p&OI#TBukw1oUCb4zw~Y?U&YF-05Iv+nF5=@Yondr*@t>twk$Sx+7gILI3)_r` z@A`!}jL+USUU(nX_R>R*jq61ZWW6zNt$)f#%hJlaj>?tKx|&ZkI^Nx4be8PsIavDnBfE=x4yNg%^Jy&tmd>LgVTiU? zlxAYp$%jh3<8o~OIv4A0lAYn}DoN?LsvQe<;a7y@&PhgRU<@^*G!mG*{sefvioH&? zl$S%dASBY5hGim+AGgjuYn}TyLLV{XFnkLfp+*7^S z=)`9iI(X%>fOdM9n}q?jCbkw(-^YM}G~UMaC5Ozdhv5&9Uz&}L-Y3N%d=7F_GsZ_; ziVSMZy&qBUzoUJzD`Vvc;I3%D5TU;!guX||rd_+L#?Xj)cwYCm=W+7U4ARzFy_Ndn z<(naSOFEtD@@_^>#8hX|+SLZeg`fJvJ?yNCZ0B0ARP>WUQLS-PR|u&Ro64K&QH6NBYu> zjjnT16}-`glGV1wuBCW&&bC9r@K1TV6)t@V`w2I5wi0R}0=C)-7p1D7T;?+{_>+gfqSbPqbe`I!X{9Wkc zU{4|T6Sn4{$tiFVgWgFp5d?pQ-1cOFuM!0hYPEfTxTz0_MQ|3IAIes2E zd76DRa5BQzti~08_zD_7`8r4Qh{;1^Cv*;J;I!UPJ3uhj3a6BJ8O^>aYePr*I#&?O z7j{<}wV3mEPc~AqFJTSI@OO^zgrB5yo^elgti2FBR|wacF2;4J`aO{K8h1`Bjqr$m z?V4^ZLLV0~-&iDi!l^FmKh0e~7AJ+5CtD%I3em7zTs;pV(~q%zI7RrK)-JUTKEuIW z$}Rl<2$jS^wOgoCgW*<|8Ehz@06clSG+R+nun?fSn-a zv@4tTIr*k^XIx2n-#4xs*}}*u#9(4m+bO=Tw8_{5m6>rR%?24Xr_j+Zb}f(Cke1@2 zH4!m6((_HM;$E zG-O%V!4t7{UBsOBg&Un0V{bURD0F%KhP26W9Pf-l;ovn~G5t(SEld(anP+NYu%A73 zEkdIFK8%oPf&PxrG`{+=6;hs(OU?h}-T2c)9{-&8YLCE<#bsw2sTitF+1{E7y5=V>1`ZRmblnn$)$&!0;-Iq3|F5i<`*tl%S>)DclJvG`3+i#j{ymDW*c*G;EK zxDIZ^G_aHB*lWUlQXN^f{(Qv0j6HETLc&i^A|(8TrTGZAc*5`pHrr#P*GFq<6VT@? z-cH%IhQ_*QzPhX>jM4n_n3`PMGmOt?iu32H^F#SOjc9-`ROi$Ae3m$WvN}J4&yN-7 z52V`M+8o6Z;NN-OB2$Pn7|>(d1X*4rq?~9%K5rYAzbpJ%&vC*>;qVGXG=JAhkUz%y zA>Ce}?;WulUxv6%>Ytk5(oL{+J{+K7;>RM}c|4CpAZTU*wZwhA!U zUS%!i2wAGzGs{u&qS>1AdB&ALCPPtdF!45}ds!ZDbL1Kho0L;Fq-EkFnoP=YGOwWm zItVANGv#QR%SEM#Ix2z%s z{*ll7*{Z0(X3^JJnu5nyG4+b_yvvP%w#;IU?SOgMxGL?;$= z!;kx$+D3cxcTIV*IK%t7C%kdnZ_rOg#||zaXZ&j0aG2m*={+@PpY zgQ6lNAuLgI6A}m`5M??qA-RDRNMdq>;6yY;DzQErJWHb+>hNNNZj7 zTSr|~t^D8b=d91UBMBso-@l$$?!70^=ly=3bDp!$XBEwySQU(4wR4xUQ7<+fP_(LS z$6AK;N5||xgG~n88BJQOE^&OnA!5VIYUBhLqI0(hCbVEkgrC*x_z!XiI z#ada**&mi2u|ZaFVj3o~Hk1Jf{Y26VPSRR7YD3lq&qE`c3wCE3VgLy>O z1w+yGVimVHa+{sC^oJBfMzbk6_{Qds8S+BWI*6Q+i zyu!oUnk7fQ#wne=(&L<~{7|>ZyCH|Q4C}lI)_G-I=czjGw$kkf!4a5qh{cwdB zmDn@*R;xbVv!!N3OAxD&qc|GoC%*MV!ObwVjV>j;u(SkNS3#M%w z*6Y8}5QRls%YV2BEZcL#%38+uDI3|N=}5HJc#o|6i#CpWlr3p&#YU9)*b!wLdkk5# z^s9|orQwmItmWDzFvCWCEDpv;V#f(ht5??jx?kgt2g(}!Rg-bl#E=2*qtg%NPKUeYez?eUR*}ni7m%Lb5R4%zRTU8Uvix>61QI#E&UH} zzm(mW=FGB<&zXTEeyUU?^up81F8CZb-TXHrj`T?zDQS5EQ(M&)U^!Hv#d3|8m163t z79;3N&_JdAPVP~*jtjcreW+6XUkkidhWjzrjb(QM590DI-VhsMzg7Oey&b{Gva8cvfG0@l`#Q!jyO6c<&beLV~~mGk(anAM=2YJOn^gB6_Xv(6LWLQJn*JKj5 zatRJ%WX)Q}Cm3TQfW`BUxVo)m)tIjFOkDI}$~NnQ?-Gd>Y#HY-Ei%Y(CJ|ZDbebL^ za25F^P8~2SKn6H}n90~ox-%m6(wj*@6N^)wHrn#w+z>A8BVth z6Sw4Qw+y3bD14JgPQJbPc_`%tkmplA#L6ie@(Am{w7yo|IKsM-gN$=y+X;Vn`%8Fa z+7x>ysBEOq!bIu?nKy>#iyMk~@BXV;?iVdtGyt3Dys~24(nYvkZP}%a;uadzyNa1h z*JrL>zw^?!yZ3x@?fNb)=km= zZ27Bp>DuuV?3v<~xhqT8Fnfo!Jhk>cxmvsQF=p;DW^PT^{pD-3?k|0mm2m}sR+O(T zdYBu*D#Pep>(ol5e1n+}q0P@S zw~n54id;vcra))F#<|i}acfM~TQ=!J-BkZ29nKKIUVF>4pTf%7+-ylxBo1CX5)Lu;+N;GRyH4sCNfwz5i`qD9s#N4 zqpW53BL7$o9LgP|FJ8pOBpF#3^1=nID{#&fQ%6yo2bIPzx}{ zEZrcZ1R}Cb<9ZE`9zg~1*Jyu7nPQE0&Ypar$OT+x!@{8%O$G0LgW@E6Vhf0?%J;@H zt9$dQkk~Z9^bu=@yd*X5z2^y+Wfv0I2>(3FY0JSYO7;HXx`4MG>q!Z4Xxd-krb4L8 zx<3F46X$%i;h^6xwfoo!v$;3$>lw9_U_+}&lhK{-nqNCo`U<&>BiK) zzn*%s?my*=_ji%R;X0scd!wMyr44pnnz~--n9oc1?$E}eSm1Q9e7NaZ_>>O4((=xz z^@j&k7sH8NzBHu|ZH!%qT3bDe*r{@qcZRF|`oV}DDY8+B9VW5M5mSqfA0ehzW4}jC zbvysCu}^I*1Cv~JbQi=_r?hVyYcO-k5!)}Cv8=xOa9;wa#>z5Z#3_-c9kcGogJ9TK zaCXJ5w6kz8NyUhk4O~v`(sK)2`FDWHcWDbP4{9lI!BipZ{%I}wFJgjlNk061N&br~rnTU| zi_xd7Qqu+etSG;@=vSOBKwnF8n*J(jlBYHxVc1m=Q<1K;wOrXMU5=#&^e*R3f29{O zqZd){a>!OdvQpW?&x-OD6Vc(VnzlUIkjlIub@sJc=ie+H^w~Fu>jW;LxI-$% zzUU!X^}F7QJ22Vl*czgWq7Q4xfvh3f9jPHjaz|@xmE=L#mOIoK&Q zi3BzFArQ8{WJ!JLgZgsq)~hcxwYBPt*xHKq_{Si4 z29pmxcv;C*FN5ZXUM81y=)4zDhnDp2KrbV=+m^Jut7(1%=OxN98F;1T8%*F**B>-n zCJ;U7vsgG_5W`6t+pnVieAD=Q>{Z`9*l-6@AGL1%kM@z8w-EQ>AJW9yxXIWU8y6LDSv42I^fl-S|+Ol1&q{no9TeOcA zOQ}1)ZgN84?3?NR_twDsYS_KhD@J|dYwh}8E#;RES=&EYgPpghR+ex2DA-p0^vmcA zbXhDTo*h(`6z94_;~{4G545P_LW+VVXMbGLd=l!~BV|XFK7c(R+@s$5pxkaWbysN2@`d!c@XGnX-*I^MEvl z6pi|*agB^byr3q?IzL;NiYWyaiZrI)s_jS(<#iA2f7qjN-OVni2OAh?&9;H5-oH1? z_b?7o1Gd}{mE^CMQdNTSSuNjOCMk0B7c9+Rl}VZFPRej?(W)sjdo%7T%cQ6Wfg#bv z%(ul`jXz??6YhhpqyDOVAdccJmri}eGFIasY$u$hOXvc(bb-`WoCo-|EQUZ;xlP+ zHJi+3ZQ3otMa{fHu{FDkl-(hpdzM;eR(Su9nmIFms#xaaPCtUCQ|!-7V?Q^+{)qUL zkgtzS;p@KQ>!Js{A%$&bdqnen$?m@HGNFdc<+|%2!h`GJbmQ;VY@;2tX;Yk3_T+Mo+Zl2J?*V4Vp$w1Lla=mykH3JUvaNXvpNV(MV@KeBwdqiX zSTh{dHQ=>Nld(A6A-EN>6J?40CSq!Dk{AD-A-L}NRmM z+QugJzDb6^Q*-a07QTxGKaH?x%>IE=Ske*zawusHb6^ftX@E zkC;m7ke!3z3gQ09#*V;ca!PiqjqQ*5pps2TOr`Wv#FW0f5o?e#`Z;39N$h^a)E#Dz z@~GJO9b!L|*h`3UY27vW2(f!5)(zX5cE_1j!R$ECGI6*j__<)YC;62vm&RsVI9qJ#?q8!A=F;f}QfaH4r?SUpjnZSt>@>iHe2mX1f+E z*lYvG?`M{wVr0xxj6Hhn|2C2;I7G!~$ z1!h)$Pf6+LhKAn_mZ@T7&R5KY{H+PGzO*bABdbxd=*Q!gA9-D&313-;ijlEM7=8Qg z5bQoXYyB<_JJ0GV{#Tsd_<3JgETv_FZRmG_F96=tm!Dn{0yMAr9!9>Di*eTE@m$diz*e<>&9 zpTc1K{FlUN?-PlcvNOL%lle7rwj&1qzKMgG(s#Tpu^h-a?a7oE5~vuI2mG*SF}i5~ zBe5DmEF4T<^pa@d5!yXXL+-#Yb=-#!b#|q+;}mie=l_02|A-F{V}FB8aIJm)Tf_jkVs(xzeUS6O=aQNyS)ppNq%( z_T_lqE7<7@HJ(RsguNy27*xIYo`{*i7Z<2nqhi$awaC>x#R&D#jUmR~mZ4%~>>-T4NbXL@cVjV0 z;1SmkW($S~D&?s9+Q({BF>>}1WUBF*HH;x!zEuq*<6vR19vvbv)}w(EGj-AYYNFI# zQ&{93Cg_MctbbWASi;W%3IGE26i6%xX6pa-zjl1){}&5`X;U%UP%)-W>C3jU*6XSB zTs{~kC>^Y)Dn?s_B^SH)=^FG2)l)K<3sn|O$tb~5K9^rQ>}$(H#i((pAXyg1TL!KC zftOEd0gsb$tT33%B8eH#Go`P1e%u!l23`hdP`p-1^$jY<)T)@wG4#AKJd*aasa7$j zp+qdFWALU+)xK1WjPZ)GM~`5SYJ8@45B9)(c#r(v4LBHF!Y>{6w`>(7yF%Ez9=v04 zaP?q}HG^<_=;1;4^*c0ltuQ<_VyiOf2jR)W;n4lq9v=pXdS z*eBTeqn+0Gc%j>xt__*9x`aIOG|=?Hza%Z>&a>X=kJXt8+148>MsLKdH$rX`g7L;8 zO=nifsI%TU&GUwa$@uk#q=c>H?-JuN=6{L?aaK!xuV59)@ELxMe|U~V`A5a*9~Gl- zR4m)Z`VQz3>~?R@k9J(&eGTfztjt{J8MXw@NR(g5KEwKj>qHX{vVKu9<}#kvFD!M2 zT=ipX$=TK~OFX}re3AFI9cvlFLX;LxzL&caQ6$`Hz z!sF4wHfJhEElVYJyJlhCc!gRwLMSEcMwd$kL;1=4(t)!Q)zVdr+PDXk8Ki1WI3OX> zPge+oX}?-xCZF`rt73sPN=?L&Af<-~)p}F9?lCuMs9wrDF7ziqZQjmThALY)sdt z3J8Kh{Le2`;q#`n&5(d-wjKoa(%rAMbOIlf1)T#s#Deo5; zLHHUU>dVHL;eA&)w4h?lk&4llily4O;=LCp46r#=F=~5GQrQ>&I;48v;Glwig1s_! z3v6FpVYqnU4x+5fZiISWxI}PfX~N;wii*+7?*-Xf4>MEKnQt=wA`Iqjy~KVIVkoAm;G4EfAg-xjiT}3zTb(feaU)F-Z zc(vedv8r~A4C)qJ3sj80R7~whj8cpAIR}Z}aH|;|V&vOgsu-;dP>h8A z^NJ8_h-Il5S%ZYtcVLfT|LQ%0eF}CDdcEY=*x5k&^T(rvL&f8u(S)H^yNXeJfgoF} zuOl=)1HWV(BMjEph{Q}y#6Q7n0I3E-sp*%wQZ*>vC8lQ0D#o%@vBX}h07pz1W>c@>IK>L>i^M{V5tgB1WK2$Cgx8@XEknh~n5GzMc2Y)JhKiAK zQj(2u?vJ(%6(gfk7-}xC3)=V2t;_`$2o|Iue1_*(t5wCQb&eogs}0#ygJ5bygD_Yd znj~h*8UF--@M?qE3uOOeP`|RZLB&`bRIK&g^|Qnlz`>FH(xK4iNX3|=g@R;`49fg6 z2MpQr?dDzQTHPj<4@xRqp9!w8tTL^SKM|WE6=RCdw<$6yFa$HSWNQIewq&#jgFe1Q zVkTYqCt-GVC?pKU_!!hfl6vY#m+ua~Fp~$9M#mK!}EUO-x|Em{7@|XW9 z9D8ULqYcHN-lOm_A(ifHmF@s$aXyp5q^5P<)O(WP)mJLrH*ThG(HknDRJw1|x|Ma4 zW(c(x{M0Ldu;C19L+@RpSM_W?IEFUR!jcfH*p`rr(b7G_>f5f>0pIhYYTL|^)>5lg z#i;c@L9+eepaerOwKX>+Cu6lRSOeBdjP-V%#7vDeznUn0iP1{liR+IxoS4Y3*#UG8fHqAa%;MIYs~Yi8;<;(w;+NBFRY&Bj0czXe}R&&~K{KllKC zO?vTf$}>!l0HexX#pn|iqfb;U+r|diSgwsRtqK=GOr@ChPQ@y0to5CHSK8EPg3`e} zsTfQ9E%8`JXr{2gf#a8RH?@zYVr0Cp7-?qba&4*BFy69NjO>pUo3o!3{r&{YP%$#T z5JtLwU*TA~Dn^ehMq=dfkcrek$FWs5F_uft##5vENUndq=GsnMDZq z`wC6JxzsCvuu_Nn{Zx9hL~m>T{zO|sDn?6tDps1Sf!2Xx!X(R9F|zj+cI)Tx4iyZw zglE^sS#2stZ3hZ6)o6hO60-F#+#xfE!-c_mbEL%BQin*)w085WiPAfe%|KqRpdL*LoL8Y+BvCy86@WvSW*?Vh!=y`nptfE87tRi_)Xc<}-gv z&+N+T?5fJ9xP_VsUtevNN1Ec*k%$~B#y3(B3Z}5=s&HUt$4eG@q)=Quqq4ECwr}fr4 zq4ng!5@X_2EE_Svki7v`mTO}p5L+sYgAfY`mgTCF<0Aa;wy$`E^3VikzJC$X7`eP3d;5W7`ka}m2uVhxD>Kw^s! zyIo?4B!w?+dO1(RAHtpZ48n`!PcrXMKPCGpRMWb;`gk_#OPD zwr*kN{MzblEpMoAs%^80v9?b|>eWQ*T&efyEt3Lq7sydon{tUIg4p)ZFr#dko89!z z7u9{BdzvIG$;fDtsP;Sw{;H1E)S|&<*VH#=#}_xizvHwY;Em>3b}igKzrHdaZK^#Z zwo|a6vSDyjEPnLVW1Ztv=_Ok7|7Q=ax`p0|T`#HRP8Rz*v%WC(KrzX<(L1W-sGCVr z(-}n!B=qY#BV{#o$j&oU@qQ>)=*hd1>`@1ct1xGFWm9cc6jdfxxnOp4O{8R6VNTWD z%EoBCv9dPa6e&?9nYKK`zGIGmoYK~9R%(3JT8{6vDZkJ1m|_#cDX&*a-{f?&LYu&J z|0<;=gGl_nN6^&qYl*Q@yd^Q}de`a-HzlIk3nhltf@V3bwY)GUoZH%Zl*lHQknuQm zGIfuqv=X++_&Px`%}+~=IsBt#ntZiZimCEtYD;T8-cgV#XEk21_Lw3Q=nwcIikcfs zTP;ljNn)m7PN~YMR9R$ZT^4zanQkqqui2#jIi-G8bkTA3O|v6qY13+)LW@l68!2`D zJxRK$DGS?SUL*Jy{!n=Od%3t+~tSG8aq)yc*GE1&cG;V0kg~}Clp>l*AO4@|KMbEtSt|~d z7@Gsv051Iy$kjO+L8PjFLBpWh>R(sxkimOAGJ^;wi-U4=FUts)D9NDe##mK+VT>%M zAv1$_FZ*FoHQLggoGFyjJDC}e`vCo)DYqcV25wM1wkV#nKo)RJU1kQ)HIcvehx=Zk zVk9>43n4R!MSYI-?Ck*h3WrT5(H3iMX2vD>X6&Vsrw?$muH%_SgdLJta3NUy zX1MI?J+5-BXEm#vVl`G*#w!)BJAN|x93BbxeYNYcI*K1&fyzLP?+vzq%nV*L$8N5D?icg)i*LPG5{{;W1 zZS5qsDB)GmDrDo0m)yV85G@U-hkLl08PXXc*7C`*5r;ln>mkO^1?#Z$*cab@^-9O$ zb&(9jfJHawG>U|K8kre9KbC>dTUi%DY*KcPW)Wj-DOxXK(Z^)n6x{tg$Ko|(48-^> zUICYx!8DMig0ZzmvxxCo^h0Jwj>v;x?84Wuv1eFsXcjR(i%%q1EJ6;A^*_(Ccm)Lm zF<^zf!CgA%jk~74f1qRWygUOjzOCIM$;>d`IJCj)f9+T+HH#Rf^XFOu0riCXjlD$AqbLZrqJhgsV$+Tsg;|7H5b*p)W<~|R zspgrwjc@HGEkCS><3wf#$Wo?RtNX7=*29ykF3mG``1pf9NqY7X4EG^fUe_JC>anmM z)z|GS7@mt_N}CV5eL@(c(#-2{GBcQRz=Cgz|GZ@1BwPClhIslQz@x8!JQ3*X3E@RKLs`|psXb}>{iIRJ2socMm(1Ic=Z3FcIM zvu_!<-}7$|P0}-5FmpBLtNZ>80j-Ans1brOW6Ivo4gTlwBt6nXGa^Ld^V`Fpxi6d^ z)h>9pC^LgCntq;=^`CzvW7x}OW-#T%eEE~6*~yrr1;f#qq1Vd(4<}=e!I8|2CVu1d zkKj8g%KccuoUAeLWcU0uSx=#0I2WT=etP@kXt+#SxPOk||I7@Q8Zi_5et^kLBBn?% zOfxZ$KKqB8k}<`CY2DW7cIYV)3|kOGS?%LjB-<**k<1J;ik;Ln`^;p_n08>s3WlZ6 zu<)$%!f2`vk$5 zx>~pXR7^k;%VMHnSYAAmebWY1w?s_2U|1V@nCe;_4vrHH>uNWAs&07Y#jqaLZyYZe=A9{Bac%aA$A#MI;%W$k zDfnb&WZ|2b%RW5+yJ0=5olX@DDzVhnmn-_B^0L;3^EFK{mH4KfU!Ax3<**)=p6P;- zUJSp#xw9uFNDit7XHu7Km(TC>_6bIDCtBDORBB( z%ofaU_$IsZvky|#4P+I1TF0=WWoA$t`?A=>8$L`<4_k3&#s-b~$%&7mVkV}UBXVZO z=lsU!%wBsxn2ebt7#?RxJ!hMXBbgcZ3Ieb3nYilUWIb$TnHlHeo8`Li-3NS=4G^6-z?KdKA+W+jG>n@GnQ%0vW1TqCu0^1<{ph1bKA>L zBxBfiGcye4u-!iHos3~C&dlJwhAfXeU;7*K&XlS4uF8w4&CKY7Z|0`kl}8_PW|E)J z7EB(#$!<8Y>x;>@&JoOLjk*4iciv6Lutj8M@LmffHh6vT#U4hbXNh1;{b9MEo0OjO z1jE+K@Zr^8evoYId>qNl*d5-N^T(?a0kie@RRmc|mxNj**@|PqDuLpCiO6&vFvLZ_`dcN{7Jk*m_ zTnFZrYh3*=ew1Wtl7ufPF+pK2Pm*U)?H=ud@IS< zk_sz1PD=tvYBP#6OgS14@wdTZ%+X7dB)>?Kys9PD)|R|d4f+bLB+8B+A!a4N(UKY~ z*=t9ISzsmewB&3nS)(O0tfUv0nh3M31Q#4gm~AEZXi1fo{6|X&RCQwyPSFsKvX~>a zq|{2rXvs(`snL?jRl%J<(82w7S`o1-UQPy9u5`+I(OU7EwJ=nqMpjeS4Nkfuk zU6SMg4wjyt`XtGkB#CV6dMrMr*94WG%aSC2NRniu2Q)#ks*@x)B}x9CBsq{>zYa>z zNlB7tk|aCsYB?Fw(Ns^DOB-_+F4lELkWQ3M1vgLlY zmJGC#by~96N)FjWX*u0WmTJivR`Pc(*~?0b_EfBKR`Q6J6kEwBTEhCQayn=)#d4A+ zEy=Z*U9qxYD6$gVOetZGm7K37bFJiQEtzB`|JD-Knl8vNrKWVL?|nF6N-!xLpCma? zOXgY4yY^L_?^wzGS~AT_zQ2#coMa`J?5iXvTggrRlw`P-tksgyR`L%mS!N~Gm_ad| zX(e)M2$HE*GI)Q1V3nOMYYjXTMN6hw$pu<6)UqDel4GspzglvPl?**VX|A`Dv$Ukv zN>*#hDOU2OmQ-5Fh-{_jG%H!8B~4cHpq89xCI8WqbFF0Pfl5!@N-ousW-IxpmMpZA zlMhm?bFAcAEvd7T^;&X*l^l4mVx4LwRaz3YlH0UoqLr-I5>*fH%1BiY_sdb5%Ps39 zEm5o=r(}IsW5!$7%UW`PmE`wVnvb@US}mDxCENpKh*-&ihbYP6R&tz{^tX~FS~9>& zex@ZkR`Q0H46%~pLzU(dD_O23WmfW}mK&X}dh)E~z{8YeUn{xga3$H# zN_IU$Ne;D=LM=JiN?Nq!Kr4A!OAfJ;jDbqeK~_?(CD~STwU!LFlEFtR)?ro>)sjJ0 z@^39U(n^*MQmlQf0>36@|0wPm0YJKGa<>8gI{RLbSwEJU$OdG$1!pc zvE*O}xWAPY4pWl7t>mYWaH`-W{e~-vW8DA=LxE-W8lfb^tmI@Z8DS-tXvy(b@|2dG zXeE6{Dm@KWQl}-2R`MH2n8LHHr1mJqT4E)?)RLuEGHH~;Two=C(Gr)hQ;x=37BH8K zA3;J}j&;;AN{{o;osdlOSf4`@@gyb3Dwa$0M_R%@p^F?GQm8OavN%cdNRs5GB*|Mz zlFySQJ4M2_7Q_}*EoexTG%QY#;L_c&Bxm9zUBlEJAKd~-bcw2~Ek%;Y$}$_DYJ8N$ zfShC~L>q8CW--HbeRh&OEvYe>ku<*sp9NN;E2fha48bvmv++^ZQNe@X<1@ob^3X2k zXBY{@!9fwVm!w)8@|BmT6Kz=qY`EMJnT3yNF3^qANyIoOd(6MWAR@s^ET#%_A7dp< zvII5;l?!8QvXNNKSR=_Zd0%8CIuAJCZzLAO!d99M>+~cE_lN|OPs|DM*j^&RS8zrI z@9My>Y8T=$tw>=g8G=OfEXp|Gv@KnxPBI*2!9edS4D-w|7ax%rfwVfU2ge%mnP)J0 zrfNFLaEK~#e41eJ6}%ZyrL1~UrqEbd7|8{J2&`FRYl!Z!r6=|!T@5DR6vhrlk~dU~ zxZG7~E*Pn@y39!O^Prl$Yphj*$cA{dD=6&zqB z(wbNg=Ua&ZS;d6T{$xAQ;cqrI0#X&+gZCq+`w1EWvoTF0(9ZWqB>I zww}@~!FaYVw=Cvs_}Cww;aL64s0q)$zz5z4)x#?&vGs6iRj-H7wzkgGEWvoTt`yeJ zq79?klsV%Z>#v$67|+&K!eU!M(+X~X=F>CPnQQzL9K`_{K`@@Jt08qhjI17VpkrO8 zS%UGdu)RiD1Ne>4;t$r};aG2JmSDUTUMnn9%12-I-Ib1Y47*_j!Fa6eAa!SxKc1L1 z!?C`nS%UFc-}P8C8|GksxC0F!e5_f5@mSa6Xl6z(zPsUb>7cHUIac`uh!6zhvAzeX zy1tj5UwCU|repD%Mh3xnp1%Q7=lPqa7WZ_lohJ$@5R7N*Mq%|(hoxtmW%JdjS%UFw z-Q?MNa@A2EJJySuB^b}v&7LjxHnXj*!R0Cmg7IwK;@O%$?51NK>paa8jA!fn!ZP`y zttxBlCCw6yXY1A^TaJ}82?r4bo~<7U%e2aWJ$mC|j&-AE z3C6Q^yJaCFz0G86>v7EzjA!eImc{nP(ZR9)sab;YY~3L&wlCJhhaY(JxUtq&)?|nf z1moGd6H-?Xr9mSDVm{lc;kk$jzD zZOuBKGCUa-AK!<+q{RA=`Esmvnk5*|)_ub2hi}&T$}f)ogSw_2{{%-);kSB^fp6=6 zNS&>3CVYC6V_l_Lg7ND71HxjRr#D9b>~DuT)|Z+k7%zpt5>_t0yW;bosaJpPSXEOY zLJ*9{dJs}K>YaDqiJv>xOPVDZkM)qp;;83XBd5_4u7SqKuN%LnBx5GNd*X9gw=WNI ztRHHYU_4t73#&K2>G_2i^&Bf}Iz$M9@oLm>Aa$O9s%*e?$GT9n1moFSEv!B8&3>bF z#uImsvo-2#%@T}f>k-e^R|NyFaIEuZ;2?rvJX>oZb$9C={(4EjTx+X4orJIkAHPPe zrNq|WqwiX_mt*}zvjpSWdQ@2SAp_^VbFHo8Pf$|9c=>t^2b`_fUwrv0$GTOs1moFy zTv+UT893@qvbH|fEWvoTo&eU_3eM^G1IIe>L{Sw8#tEM2f8bc}YL;L;TTcng)WfHbd8bBQ`N_1MdlJ9#>|%WU^7<_$w!GM5J67Y#?K zHL6&G@mSA#EcO77HFlO_3C3eRCoJY`2YjBHknugoic~6=U_93I!ZMy`58zlsXDgOq zyi$HaSUdBZkg4ykbF7h76yXUu`1pO)iF#M_rTsm+KvCwPp#%WBox` zefW*f!>e1SJJ!dVB^ZzOM`6(x1J{+A)*JiBlvFUDH(tR3=MB#E9P1j*5{zf-Rbho~ zb+xv3sZq8Bpa8q(N(zoi#3wrOU)9DXX{Tm>hksOwLc%@ zSZB`>av&Jb)}Muyjc=Cn;K^sytE>C)PhcKYCm7GxUvSjfdT`0}qa5psx#XIs-G}>) zze1||4ca<>b&olYl~YR&-qnGRU+3STM0O8MjdH99HA^sFzSawC0KVzDm!o|zb*!o1 zfe2weKEAELQ6fDXQ+P^2|9zHO&%dWxg7LiZcVU^f{HK0@9qU-9&BH+i!FcWKO-P-s zlN(!xIMxQu5{#Fxe+bL;Hh2HBWOv6pe?Beo-kZdHy+w)Si{AKh?Wt=WYqtduAqd8^ z^){rL8QJ)zH~z8ak=N8!ulOgpL9+zodE*@%b#-IEK3BftSVeW@s^?4lW6HabI&bW; zV(Bc$dP}ne>uE{7>e4Uee?qGA)fKUeTF&^3V~uPe2k$P!$7j7y ziQUEG%wZ>6H`Z&GU_5X9pRi2b;LO3XdY^`a2!iqQ^)E=>Udrv$j(AYrS3-25W(mf# z^?|UAt(9-D?BZCBnk5*o9)2h+wiK2!`+3Lufo2KDOW{Yt>Va?5Djn-J%@T~q`dC<| zpYQ$Oi+}G}dozah=c=!b8n@W?*JUk|mOAE#M@@x1Ygu#7kQ%$e{f$GS|j z1mk(*Q(+lzT=$Qw>mBQlnk5)7g`Wv48{e!^r;HlD%&`t=f(St{9_w>R-9Fnpt1lnr zSaq5u7?1UZu;_V)uYNo4LC1PPvjpRLV*{|RRaQ5A{eO1H3?-*Rz5o2?(i+EFs#${ZQrJaU#`Ek& z9qad+B^ZyDDXeTHgLVFqhC`=0))A*egdiA?)z#YKajx}hZ7H9nS%UGrv4gNoTRwVe zL$hN&sab;YY;_Zs@y75yALw?PwUxDq_OZiFjAyI6XKUGlyqg_shGq%I^L!7_)}@md zKjT<8X_jET6z(W2Q=>RrcC2?bOE4a5Ct>wL>ND{<+#wlLbC+p*&1Y7v~|SfJ6?6H|7ezAJX?c>6|TMGt*v7(pndGi5aZd(^=!TI z)1KEk))LJUjAtt^$<_hZ)>_RHjAtv~v&9`V#~N^Sg7It> zc(%Cv?N}dcmS8+vLp@uZZ$zxEDa%y~1>@No=GkK1aI9ZxmS8+v!-d7#%T{?-&%rmS zXT{J;zZLw(l`+J4wnliic$JQ0E!Ql;c&&1zum(UQZC&uI!uK5OW6ctbm%^ij)dLJf zWDnM{PF)ERf?zz>C}EjaS^Mr=eH`mW%@T~qI$Bs}?ZC6`CD!xDUZiXZ#`DH8!ZPFX z^3$7UJ64Nk3C8orvBIJ^5Rp}zW4)qTg7H#VC@kX*uG$>ykQS9f!Fa5QuuQ(V8ZEQ= zYSt{lc=;+4mdV%5*A{*0SPyHKV7z=43yb+;DZe!Mlp4qCax88VDvjpRLV~ntN27~<}uYqx_C99|@ z2n6HV8Y?U_pMQ4UnU6SDze^NLFrKY4&(|9_$|=HP zt7HnVf4NaVbC39nYx#|5`w-)$aH_EAc?RyKI9sn>r=)`MSkr{XI*&-evz(4K_j<(= zjK`Ypu^xY6<~+yx@Oz3S7>_kWSf&Svc0J}=$2#jq#S)Cinkg*PA5JQ`s)u9kaI<0w z#`F9M!ZJNT{)lrHI@XQ1D3)M6TPF&u9}crWqKd zXqI5SQa)K&rj&U#i(~b_P1zERm%>wom5ak&@!{1hj&+M>3C3fcDlAjVyqd+a4*Y?# zB^Zwt^;kTY?O4}qmS8;AEMd)r(w_KCzp84cWA(jV*%FM$suY$f<%Kwx?O0c7mS8;3 z&lZ*`WnRtVSo{4@*%FLrt4dfLml-%e%(kU`yJiW-vsLZc>U(frtz&(rS%UFw#e_xA zGjK&e*xD+&LrDeW*{bnuUH$l3k2%)cnk5*|)*LTi94iM|Tg&fMwgltZn(Nu(Sm{^? z-KAK9@od%Fe6f$>Sm{^~YnEU6C$4bYl{)w_B7|&LN zXNzN{V+B7|EWvoTPO~f`I948M>&6Y5B^b|Eqh&FL94j4b*geXYU_4t*!ZLN9cP{K> zZ9T79g7Iv{JzL$QUx!!=f39o^#Lc|mT;luvLa_wn*;?q?;(FP!CjU~g z1mpGCrwhyU*u474vCg|su>|9#aFI;C%{OE4a5v9L^!&2ibWK7K&41mm&J z@L24z9V_QS#S)CiI@9KB2SAQ}|G|?T>y(ESOE4bmESoQmmF%${>xy41mS8;3pDirY zWB+*m(Pul>A0AdL!FZlOM_6X&pite^Pq6oD^}I7;%(I=

u_`o5uZTRQErsah-xe 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¨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

TVK!DpusStjmAt=jn6**_t25Lp<*vR^ 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%0ANnjg83$dPp-Bmi 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

mu^396duVdVg^d2E5p@`U zFLX>8m@c|RZ)-#IoOtcp=`NH$JN=|E;}AB5uagTS<55pkcUmo_fNG4qFp2VU?5o?2 zrb69Oam0m*JNZFZnOxSWd~r@9>F`zNOFk9{$P{P4Oh*YdGL9N#jydzGnbs`rS65g# z){zaQ#2PEo^9je(<0!=<<4k-bWer&5u0@O;OCB>(#~U%h`=8$sz10<6EXBBYXa`a% zpjo|YY^1`}V1B$NW`dE1f}+9_M=VW(rKGx2D>AXUc7gW1Q7mthSD(E%gG<2(75KE- zv#PZ{+h{yiu@Qky*70-0 z&V+EJV>)f(N=bBhUFWp@9cyZfMInwQ+pj{#KQhj7n91jaR2b5BMrxvo#M#r46|_luHjxl4AS#2$`NMi!$Xv4*}3HGlToMLj? z<4~E6UR#ICltTq0k`0d{SgN)vWQ(iI%nsEGWapb6Okb;$&Hn9csIr+`M7=@U(;HajAXDw4)BO67!PfNQRcGF2O z+ua?K+QV!j+O|oyY*=|$+}O|(jW?jrm|jaO8ycL8urOCRT&(D%<|VCur&-k)&6i%p zwTWP8=UjAgoF`9asuQkIaBf7#1Y5CBwxxwDn^+!gh|WgSSy!aQ_!7~3Bl2LUptT7- zB*qsZ==2wzm=51Vi=r)PoHC7m6%1$!5p1a zYNrM|DML}T{0TgP)=uS)vu&N?WTdFIjRKQ{nOKCWx)JBDIec^#Ffs+JVs&vaS@2Mg zx>$2_(f|vOq1CibGL_-s;cQ%qa5u@?v_w;_^LN%9-M$Fr52#&awOVZ9ghcI zR2FDdz5R12jk{@FM2^f7E7_o$tuqfISoyZZ7DRXfv>pN?78TqkA|w$y*VB#MiPg;R zPVUT!*41`1m+EmF%X)7xUNXyG6{&8;pY^<)PoC24KWtRU3gu^Oa&7gK7d zUP~23BBc@C{mU9~hO41E=H~L{13*Wo3pHm^YSTHbAy1>IqjASck+kS~05(LrESl^r z3@?;4k53S&BiXd5BY4C(MOVz z$sOZk^{wKcmSO6nXas$;Sx3m)ay;#k)z9==u}hTW>9J{u6%$W3Zi%Q%ez9ULPe$6u zLepZ^IK%6>BLo7zeA=GdK~fy5$UA5;M2Lfmg6w&0HQBu;`WOVcE02w1xG5`I-BL$4 z9i&#ksVna-D4s(%s70cQM6?}bxPY57ayedfcS8DRd0LbA8KuQ4PJX^-8XqZ)jUpv* zf>htX>^j{MfD$oKF@!tjRKwH&icyS?5Cm%1DV?N-j5$8I55UT{)JO5DGB?O?>tst1 z$a#jvxR)Z&Qz-MKe-OUi9-7YLpXr@uh&vUm1u0bB#gqF%gmza|_LPF`Sbb9+9k24F zR+3gPqcBxvXH&nXPVLeWglKmqj3YrRg@3KMGA3@ofQe)`t%ww*34yNS1R&{h zlwMin$eT_vu{X3N+Qc0*YO+doVN2dwBkxZw$ZcjF2-GaT9k8AB?07RS{mgEN;aP+6 z!PkH2Q3Ejs&}Bn$p$30jXTI0=0!(E5^!zg1?urxgk;!xwN?at;SCjY}49>U}H8$4e zO~HMV;xz1-SObnmXNw!4kWaW-qZvar&a2PC&9fA4v~=LT=~E*WICK!FujQ%cZg_r~ zR*?mCCbB6SPYD0$(gAL_YHo?(rriWT5QD4}=gM(^x4FL1jN7&9)QzQ>N&-XS9d2=8 zPuIQD3ZcA#T8AGi{3H+ZAZIw{Yq@;F1vYg@ts`;ii3GoktaRTv>L8w(&<^4Tth6fj ze6oF8q#@RVdV zM7wZe1hGhWd8M*2wbGoNjx9WLaHNi*3SG4>($tdBy*APkogJo~g$-@;yO?*>C9qWC z!-)U??G>_=xx=A~l&VQDy#u`L{7O;E!}LIrImX3JnbmW$b4TDwBRtU2iMLjV^T!s_ zQ)R4vq)^|{Ln^1vVbbN_%2iWm-Ek)@H5YophKYZDP5f4SsOH!(kmG(+N5>yAN=Bxm zM@^Q}ef^XM9?|HNHbIDX&z(-i@Mb=?(t=g)i>ZG?LTF2X+bM&3mp1l3hr*XRY?1y^M6PTYH$1j$J_V=yTkA8B_^+w+0>hn(J<9-5;+;9YQP7c@C4p%L08f`;U-vW$&`0k`FgfKZ@5b4(E7jKDXDiz zk@bCdn2&$!{bnDJPiub

Cd+c(BbpCfP1N&LD~>$)IIz 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 v%Nk{d!>QK4qBgn0G2^pZU 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 F!V>-CXphl7(CH73^Mq>}ZzImBA+C~8cs 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≫7NF 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 R!1BXxe`UMJLt<6<{|A^fRfPZm literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..0eab917 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,16 @@ +#include "main_window.h" +#include +#include + + +int main(int argc, char *argv[]) { + using namespace std; + QApplication app(argc, argv); + if (argc > 2) { + cerr << "Utilisation : " << argv[0] << " [fichier OBJ]" << endl; + return 1; + } + MainWindow mw; + mw.show(); + return app.exec(); +} diff --git a/src/main_window.cpp b/src/main_window.cpp new file mode 100644 index 0000000..d9568ee --- /dev/null +++ b/src/main_window.cpp @@ -0,0 +1,56 @@ +#include "main_window.h" + +#include +#include + + +MainWindow::MainWindow(QWidget *parent) + :QMainWindow(parent), + mesh_viewer(this), + toolbar(this) { + connect(&mesh_viewer, &MeshViewer::initialized, this, &MainWindow::meshViewerInitialized); + setCentralWidget(&mesh_viewer); + addToolBar(Qt::RightToolBarArea, &toolbar); + open_action = toolbar.addAction("Ouvrir…", [&](){ + open(QFileDialog::getOpenFileName(this, "Ouvrir un fichier OBJ")); + }); + // toolbar_actions.append(toolbar.addAction("Fractionner", [&](){ + // QVector> fragments = shatter(mesh); + // mesh_viewer.removeOpenGLMesh(glm); + // for (auto &[pos, fragment] : fragments) { + // fragment.triangulate(); + // QMatrix4x4 mat; + // float scale = 1.2; + // mat.translate(pos[0] * scale, pos[1] * scale, pos[2] * scale); + // mesh_viewer.addOpenGLMeshFromOpenMesh(&fragment, mat); + // } + // })); + open_action->setEnabled(false); + for (QAction *a : toolbar_actions) { + a->setEnabled(false); + } +} + + +void MainWindow::open(const QString &path) { + if (!OpenMesh::IO::read_mesh(mesh, path.toUtf8().constData())) { + qWarning() << "Failed to read" << path; + return; + } + for (const VertexHandle &vh : mesh.vertices()) { + mesh.set_color(vh, MyMesh::Color(.5, .5, .5)); + } + if (glm != nullptr) mesh_viewer.removeOpenGLMesh(glm); + glm = mesh_viewer.addOpenGLMeshFromOpenMesh(&mesh); + for (QAction *a : toolbar_actions) { + a->setEnabled(true); + } +} + + +void MainWindow::meshViewerInitialized() { + if (qApp->arguments().size() == 2) { + open(qApp->arguments().at(1)); + } + open_action->setEnabled(true); +} diff --git a/src/main_window.h b/src/main_window.h new file mode 100644 index 0000000..54d3be2 --- /dev/null +++ b/src/main_window.h @@ -0,0 +1,32 @@ +#ifndef MAIN_WINDOW_H +#define MAIN_WINDOW_H + +#include +#include + +#include "mesh_viewer.h" +#include "my_mesh.h" + + +class MainWindow : public QMainWindow { + Q_OBJECT + +public: + MainWindow(QWidget *parent=nullptr); + void open(const QString &path); + +private slots: + void meshViewerInitialized(); + +private: + MyMesh mesh; + MeshViewer mesh_viewer; + OpenGLMesh *glm = nullptr; + QToolBar toolbar; + QAction *open_action; + QList toolbar_actions; + +}; + + +#endif diff --git a/src/mesh_viewer.cpp b/src/mesh_viewer.cpp new file mode 100644 index 0000000..c648a60 --- /dev/null +++ b/src/mesh_viewer.cpp @@ -0,0 +1,261 @@ +#include "mesh_viewer.h" + +#include +#include + + +const GLchar *vertex_shader_source = R"glsl( +#version 150 core + +in vec3 pos; +in vec3 col; + +out vec3 frag_col; + +uniform mat4 proj; +uniform mat4 view; +uniform mat4 model; + +void main() { + gl_Position = proj * view * model * vec4(pos, 1.0); + frag_col = col; +} +)glsl"; + +const GLchar *fragment_shader_source = R"glsl( +#version 150 core + +in vec3 frag_col; +out vec4 final_col; + +uniform vec3 wf_col; +uniform bool wireframe; +uniform float alpha; + +void main() { + if (wireframe) + final_col = vec4(wf_col, alpha); + else + final_col = vec4(frag_col, alpha); +} +)glsl"; + + +MeshViewer::MeshViewer(QWidget *parent) : QOpenGLWidget(parent) { + setMouseTracking(true); + setFocus(); +} + + +void GLAPIENTRY +opengl_debug_cb(GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar* message, + const void* userParam) { + (void) source; + (void) type; + (void) id; + (void) severity; + (void) length; + (void) userParam; + qDebug() << "OpenGL debug output:" << message; +} + + +void MeshViewer::initializeGL() { + // initializeOpenGLFunctions(); + + GLint major, minor; + glGetIntegerv(GL_MAJOR_VERSION, &major); + glGetIntegerv(GL_MINOR_VERSION, &minor); + qDebug("OpenGL version %d.%d", major, minor); + + glEnable(GL_DEBUG_OUTPUT); + glDebugMessageCallback(opengl_debug_cb, 0); + + /* Compile the vertex shader. */ + GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL); + glCompileShader(vertex_shader); + GLint status; + glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &status); + if (status != GL_TRUE) { + char log[1024]; + glGetShaderInfoLog(vertex_shader, sizeof log, NULL, log); + fprintf(stderr, "Failed to compile the vertex shader: %s\n", log); + exit(1); + } + + /* Compile the fragment shader. */ + GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL); + glCompileShader(fragment_shader); + glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &status); + if (status != GL_TRUE) { + char log[1024]; + glGetShaderInfoLog(fragment_shader, sizeof log, NULL, log); + fprintf(stderr, "Failed to compile the fragment shader: %s\n", log); + exit(1); + } + + /* Link the shader program. */ + GLuint shader_program = glCreateProgram(); + glAttachShader(shader_program, vertex_shader); + glAttachShader(shader_program, fragment_shader); + glBindFragDataLocation(shader_program, 0, "out_color"); + glLinkProgram(shader_program); + glGetProgramiv(shader_program, GL_LINK_STATUS, &status); + if (status != GL_TRUE) { + char log[1024]; + glGetProgramInfoLog(shader_program, sizeof log, NULL, log); + fprintf(stderr, "Failed to link the shader program: %s\n", log); + exit(1); + } + + /* Use it. */ + glUseProgram(shader_program); + + /* Get the position attribute. */ + pos_attr = glGetAttribLocation(shader_program, "pos"); + col_attr = glGetAttribLocation(shader_program, "col"); + + proj_attr = glGetUniformLocation(shader_program, "proj"); + view_attr = glGetUniformLocation(shader_program, "view"); + model_attr = glGetUniformLocation(shader_program, "model"); + wf_col_attr = glGetUniformLocation(shader_program, "wf_col"); + wireframe_attr = glGetUniformLocation(shader_program, "wireframe"); + alpha_attr = glGetUniformLocation(shader_program, "alpha"); + + glUniform1f(alpha_attr, 1); + glUniform3f(wf_col_attr, WIREFRAME_COLOR); + + glClearColor(1, 1, 1, 0); + + glEnable(GL_DEPTH_TEST); + glEnable(GL_MULTISAMPLE); + + emit initialized(); +} + + +void MeshViewer::resizeGL(int w, int h) { + QMatrix4x4 projection; + projection.perspective(FOV, (float) w/h, .01, 100); + glUniformMatrix4fv(proj_attr, 1, GL_FALSE, projection.data()); +} + + +void MeshViewer::paintGL() { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + QMatrix4x4 trans; + trans.translate(0, 0, -cam_dist); + QMatrix4x4 view = trans * rot; + glUniformMatrix4fv(view_attr, 1, GL_FALSE, view.data()); + for (const OpenGLMesh m : meshes) { + glUniformMatrix4fv(model_attr, 1, GL_FALSE, m.mat.data()); + + /* Mesh */ + glBindVertexArray(m.vao); + glEnable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(1.0, 2); + glDrawArrays(GL_TRIANGLES, 0, m.nverts); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + glDisable(GL_POLYGON_OFFSET_FILL); + + /* Wireframe */ + glUniform1f(wireframe_attr, 1); + glDrawArrays(GL_TRIANGLES, 0, m.nverts); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + glLineWidth(1); + glUniform1f(wireframe_attr, 0); + } +} + + +OpenGLMesh *MeshViewer::addOpenGLMesh(size_t nverts, const GLfloat *verts, QMatrix4x4 mat, QColor col) { + makeCurrent(); + + GLuint vao, vbo; + glGenVertexArrays(1, &vao); + glGenBuffers(1, &vbo); + + glBindVertexArray(vao); + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBufferData(GL_ARRAY_BUFFER, nverts * 6 * sizeof (GLfloat), verts, GL_DYNAMIC_DRAW); + glVertexAttribPointer(pos_attr, 3, GL_FLOAT, GL_FALSE, 6 * sizeof (GLfloat), 0); + glEnableVertexAttribArray(pos_attr); + glVertexAttribPointer(col_attr, 3, GL_FLOAT, GL_FALSE, 6 * sizeof (GLfloat), + (const void *) (3 * sizeof (GLfloat))); + glEnableVertexAttribArray(col_attr); + + glBindVertexArray(0); + + meshes.append({vao, vbo, nverts, mat, col}); + doneCurrent(); + update(); + return &meshes.last(); +} + + +OpenGLMesh *MeshViewer::addOpenGLMeshFromOpenMesh(MyMesh* mesh, QMatrix4x4 mat, QColor col) { + GLfloat *verts = new GLfloat[mesh->n_faces() * 3 * 6]; + size_t i = 0; + + for (MyMesh::FaceHandle face : mesh->faces()) { + for (MyMesh::VertexHandle vec : mesh->fv_range(face)) { + verts[6*i + 0] = mesh->point(vec)[0]; + verts[6*i + 1] = mesh->point(vec)[1]; + verts[6*i + 2] = mesh->point(vec)[2]; + verts[6*i + 3] = mesh->color(vec)[0]; + verts[6*i + 4] = mesh->color(vec)[1]; + verts[6*i + 5] = mesh->color(vec)[2]; + i++; + } + } + + OpenGLMesh *ret = addOpenGLMesh(i, verts, mat, col); + delete[] verts; + return ret; +} + + +void MeshViewer::removeOpenGLMesh(OpenGLMesh *mesh) { + glDeleteVertexArrays(1, &mesh->vao); + glDeleteBuffers(1, &mesh->vbo); + for (int i = 0; i < meshes.size(); i++) { + if (&meshes[i] == mesh) meshes.removeAt(i); + } +} + + +void MeshViewer::mousePressEvent(QMouseEvent *e) { + if (e->button() == Qt::LeftButton) { + mouse_pos = e->pos(); + } +} + + +void MeshViewer::mouseReleaseEvent(QMouseEvent *e) { + (void) e; + rot_start = rot; +} + + +void MeshViewer::mouseMoveEvent(QMouseEvent *e) { + if (e->buttons() & Qt::LeftButton) { + QPoint delta = e->pos() - mouse_pos; + rot = rot_start; + rot.rotate(delta.x() / 5., 0, 1, 0); + rot.rotate(delta.y() / 5., QVector3D(1, 0, 0) * rot); + update(); + } +} + + +void MeshViewer::wheelEvent(QWheelEvent *e) { + cam_dist -= e->angleDelta().y() / 1000. * cam_dist; + update(); +} diff --git a/src/mesh_viewer.h b/src/mesh_viewer.h new file mode 100644 index 0000000..f8db306 --- /dev/null +++ b/src/mesh_viewer.h @@ -0,0 +1,64 @@ +#ifndef MESH_VIEWER_H +#define MESH_VIEWER_H + +#define GL_GLEXT_PROTOTYPES +#include "my_mesh.h" +#include +#include +#include +#include +#include +#include +#include + + +#define WIREFRAME_COLOR 0, 0, 0 +#define FOV 70 + + +using namespace OpenMesh; + + +struct OpenGLMesh { + GLuint vao; + GLuint vbo; + size_t nverts; + QMatrix4x4 mat; + QColor col; +}; + + +class MeshViewer : public QOpenGLWidget { + Q_OBJECT + +public: + MeshViewer(QWidget *parent=nullptr); + void initializeGL() override; + void resizeGL(int w, int h) override; + void paintGL() override; + OpenGLMesh *addOpenGLMesh(size_t nverts, const GLfloat *verts, QMatrix4x4 mat=QMatrix4x4(), QColor col={153, 153, 153}); + OpenGLMesh *addOpenGLMeshFromOpenMesh(MyMesh* _mesh, QMatrix4x4 mat=QMatrix4x4(), QColor col={153, 153, 153}); + void removeOpenGLMesh(OpenGLMesh *mesh); + void setOpenGLMeshMatrix(OpenGLMesh *mv, QMatrix4x4 mat); + +private: + QList meshes; + GLint pos_attr, col_attr, proj_attr, view_attr, model_attr; + GLint wf_col_attr, wireframe_attr, alpha_attr; + QMatrix4x4 proj; + QMatrix4x4 rot, rot_start; + GLfloat cam_dist = 1; + QPoint mouse_pos; + +protected: + virtual void mousePressEvent(QMouseEvent *e); + virtual void mouseReleaseEvent(QMouseEvent *e); + virtual void mouseMoveEvent(QMouseEvent *e); + virtual void wheelEvent(QWheelEvent *e); + +signals: + void initialized(); +}; + + +#endif diff --git a/src/my_mesh.h b/src/my_mesh.h new file mode 100644 index 0000000..307878e --- /dev/null +++ b/src/my_mesh.h @@ -0,0 +1,19 @@ +#ifndef MY_MESH_H +#define MY_MESH_H + +#include +#include +#include + + +struct MyTraits : public OpenMesh::DefaultTraits { + VertexAttributes(OpenMesh::Attributes::Normal | OpenMesh::Attributes::Color); + HalfedgeAttributes(OpenMesh::Attributes::PrevHalfedge); + FaceAttributes(OpenMesh::Attributes::Normal); + EdgeAttributes(OpenMesh::Attributes::Color); + typedef OpenMesh::Vec3f Color; +}; +typedef OpenMesh::PolyMesh_ArrayKernelT MyMesh; + + +#endif diff --git a/tp.pro b/tp.pro new file mode 100644 index 0000000..e8be321 --- /dev/null +++ b/tp.pro @@ -0,0 +1,25 @@ +QT += core gui widgets +TARGET = tp +TEMPLATE = app +DEFINES += QT_DEPRECATED_WARNINGS +CONFIG += qt debug c++17 +INCLUDEPATH += $$PWD/libs/OpenMesh/include/ +DEFINES += OM_STATIC_BUILD + +unix:!macx { + LIBS += -L$$PWD/libs/OpenMesh/liblinux/ -lOpenMeshCore +} +macx { + LIBS += -L$$PWD/libs/OpenMesh/libosx/ -lOpenMeshCore +} +win32 { + LIBS += $$PWD/libs/OpenMesh/libwin/OpenMeshCore.lib +} + +HEADERS += src/my_mesh.h +HEADERS += src/main_window.h +HEADERS += src/mesh_viewer.h + +SOURCES += src/main.cpp +SOURCES += src/main_window.cpp +SOURCES += src/mesh_viewer.cpp

?qZdB+lT(bP?6D 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