diff --git a/.gitignore b/.gitignore
index 65b3b7ce..5df3354e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
.project
+.cproject
CMakeLists.txt.user
diff --git a/Doc/changelog.docu b/Doc/changelog.docu
index 6dba18c1..027f906e 100644
--- a/Doc/changelog.docu
+++ b/Doc/changelog.docu
@@ -1,4 +1,4 @@
-/* \page om_changelog Changelog
+/** \page om_changelog Changelog
\htmlonly
@@ -10,12 +10,35 @@
| 6.0 (?/?/?) |
+VectorT
+
+- Full C++11 rewrite of VectorT (Keeping C++98 backward compatibility)
+- Split VectorT implementation into two files (One c++98 and one c++11)
+
+
+Unittests
+
+- Added several unittests for VectorT
+- Added Benchmarks for VectorT
+
+
+
|
| 5.1 (?/?/?) |
+General
+
+- Fixed bug preventing from building with 2 dimensional vectors (e.g. vec2i)
+
+
+Unittests
+
+- Added some basic linear algebra tests for VectorT
+- Added tests for vec2x construction
+
|
diff --git a/src/OpenMesh/Core/Geometry/VectorDimensionsT.hh b/src/OpenMesh/Core/Geometry/VectorDimensionsT.hh
new file mode 100644
index 00000000..c9148283
--- /dev/null
+++ b/src/OpenMesh/Core/Geometry/VectorDimensionsT.hh
@@ -0,0 +1,80 @@
+/* ========================================================================= *
+ * *
+ * 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. *
+ * *
+ * ========================================================================= */
+
+//=============================================================================
+//
+// CLASS VectorDimensionsT
+//
+//=============================================================================
+
+#ifndef DOXYGEN
+
+#ifndef OPENMESH_VECTOR_DIMENSIONS_HH
+#define OPENMESH_VECTOR_DIMENSIONS_HH
+
+//== INCLUDES =================================================================
+
+#include
+#include
+
+//== NAMESPACES ===============================================================
+
+namespace OpenMesh {
+
+//== CLASS DEFINITION =========================================================
+
+template
+struct VectorDimensionsT {};
+
+template
+struct VectorDimensionsT< OpenMesh::VectorT > {
+ enum {
+ value = Dim
+ };
+};
+
+//=============================================================================
+} // namespace OpenMesh
+//=============================================================================
+
+#endif // OPENMESH_VECTOR_DIMENSIONS_HH defined
+//=============================================================================
+#endif // DOXYGEN
diff --git a/src/OpenMesh/Core/Mesh/ArrayKernel.cc b/src/OpenMesh/Core/Mesh/ArrayKernel.cc
index de857351..00c8d3c5 100644
--- a/src/OpenMesh/Core/Mesh/ArrayKernel.cc
+++ b/src/OpenMesh/Core/Mesh/ArrayKernel.cc
@@ -177,6 +177,16 @@ void ArrayKernel::garbage_collection(bool _v, bool _e, bool _f)
garbage_collection( empty_vh,empty_hh,empty_fh,_v, _e, _f);
}
+void ArrayKernel::clean_keep_reservation()
+{
+ vertices_.clear();
+
+ edges_.clear();
+
+ faces_.clear();
+
+}
+
void ArrayKernel::clean()
{
diff --git a/src/OpenMesh/Core/Mesh/ArrayKernel.hh b/src/OpenMesh/Core/Mesh/ArrayKernel.hh
index ca64af46..eea18385 100644
--- a/src/OpenMesh/Core/Mesh/ArrayKernel.hh
+++ b/src/OpenMesh/Core/Mesh/ArrayKernel.hh
@@ -306,6 +306,14 @@ public:
*/
void clean();
+ /** \brief Reset the whole mesh
+ *
+ * This will remove all elements from the mesh but keeps the properties.
+ * In contrast to clean() the memory used for the elements will remain
+ * allocated.
+ */
+ void clean_keep_reservation();
+
// --- number of items ---
size_t n_vertices() const { return vertices_.size(); }
size_t n_halfedges() const { return 2*edges_.size(); }
diff --git a/src/OpenMesh/Core/Mesh/PolyMeshT.cc b/src/OpenMesh/Core/Mesh/PolyMeshT.cc
index b4f5fb6e..e8509605 100644
--- a/src/OpenMesh/Core/Mesh/PolyMeshT.cc
+++ b/src/OpenMesh/Core/Mesh/PolyMeshT.cc
@@ -61,6 +61,8 @@
#include
#include
+#include
+#include
#include
#include
#include
@@ -97,8 +99,18 @@ uint PolyMeshT::find_feature_edges(Scalar _angle_tresh)
template
typename PolyMeshT::Normal
-PolyMeshT::
-calc_face_normal(FaceHandle _fh) const
+PolyMeshT::calc_face_normal(FaceHandle _fh) const
+{
+ return calc_face_normal_impl(_fh, typename GenProg::IF<
+ VectorDimensionsT::Point>::value == 3,
+ PointIs3DTag,
+ PointIsNot3DTag
+ >::Result());
+}
+
+template
+typename PolyMeshT::Normal
+PolyMeshT::calc_face_normal_impl(FaceHandle _fh, PointIs3DTag) const
{
assert(this->halfedge_handle(_fh).is_valid());
ConstFaceVertexIter fv_it(this->cfv_iter(_fh));
@@ -139,8 +151,15 @@ calc_face_normal(FaceHandle _fh) const
: Normal(0, 0, 0);
}
-//-----------------------------------------------------------------------------
+template
+typename PolyMeshT::Normal
+PolyMeshT::calc_face_normal_impl(FaceHandle, PointIsNot3DTag) const
+{
+ // Dummy fallback implementation
+ return Normal(typename Normal::value_type(0));
+}
+//-----------------------------------------------------------------------------
template
typename PolyMeshT::Normal
@@ -148,6 +167,21 @@ PolyMeshT::
calc_face_normal(const Point& _p0,
const Point& _p1,
const Point& _p2) const
+{
+ return calc_face_normal_impl(_p0, _p1, _p2, typename GenProg::IF<
+ VectorDimensionsT::Point>::value == 3,
+ PointIs3DTag,
+ PointIsNot3DTag
+ >::Result());
+}
+
+template
+typename PolyMeshT::Normal
+PolyMeshT::
+calc_face_normal_impl(const Point& _p0,
+ const Point& _p1,
+ const Point& _p2,
+ PointIs3DTag) const
{
#if 1
// The OpenSG ::operator -= () does not support the type Point
@@ -174,6 +208,13 @@ calc_face_normal(const Point& _p0,
#endif
}
+template
+typename PolyMeshT::Normal
+PolyMeshT::calc_face_normal_impl(const Point&, const Point&, const Point&, PointIsNot3DTag) const
+{
+ return Normal(typename Normal::value_type(0));
+}
+
//-----------------------------------------------------------------------------
template
@@ -200,7 +241,7 @@ PolyMeshT::
update_normals()
{
// Face normals are required to compute the vertex and the halfedge normals
- if (Kernel::has_face_normals() ) {
+ if (Kernel::has_face_normals() ) {
update_face_normals();
if (Kernel::has_vertex_normals() ) update_vertex_normals();
diff --git a/src/OpenMesh/Core/Mesh/PolyMeshT.hh b/src/OpenMesh/Core/Mesh/PolyMeshT.hh
index a3180fb5..9ea65535 100644
--- a/src/OpenMesh/Core/Mesh/PolyMeshT.hh
+++ b/src/OpenMesh/Core/Mesh/PolyMeshT.hh
@@ -520,6 +520,13 @@ public:
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;
};
/**
diff --git a/src/OpenMesh/Tools/Utils/HeapT.hh b/src/OpenMesh/Tools/Utils/HeapT.hh
index bef721e4..545cfb5e 100644
--- a/src/OpenMesh/Tools/Utils/HeapT.hh
+++ b/src/OpenMesh/Tools/Utils/HeapT.hh
@@ -79,6 +79,9 @@
#include "Config.hh"
#include
#include
+#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
+#include
+#endif
//== NAMESPACE ================================================================
@@ -147,14 +150,28 @@ public:
/// Constructor
HeapT() : HeapVector() {}
+#if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
/// Construct with a given \c HeapIterface.
- HeapT(const HeapInterface& _interface)
+ HeapT(HeapInterface _interface)
+ : HeapVector(), interface_(std::move(_interface))
+ {}
+#else
+ /// Construct with a given \c HeapIterface.
+ HeapT(const HeapInterface &_interface)
: HeapVector(), interface_(_interface)
{}
-
+#endif
+
/// Destructor.
~HeapT(){};
+ HeapInterface &getInterface() {
+ return interface_;
+ }
+
+ const HeapInterface &getInterface() const {
+ return interface_;
+ }
/// clear the heap
void clear() { HeapVector::clear(); }
@@ -187,14 +204,14 @@ public:
HeapEntry front() const
{
assert(!empty());
- return entry(0);
+ return HeapVector::front();
}
/// delete the first entry
void pop_front()
{
assert(!empty());
- reset_heap_position(entry(0));
+ reset_heap_position(HeapVector::front());
if (size() > 1)
{
entry(0, entry(size()-1));
@@ -338,9 +355,9 @@ void
HeapT::
downheap(size_t _idx)
{
- HeapEntry h = entry(_idx);
+ const HeapEntry h = entry(_idx);
size_t childIdx;
- size_t s = size();
+ const size_t s = size();
while(_idx < s)
{
diff --git a/src/Python/Vector.hh b/src/Python/Vector.hh
index 68cfaf94..e3031709 100644
--- a/src/Python/Vector.hh
+++ b/src/Python/Vector.hh
@@ -67,10 +67,10 @@ struct Factory {
}
template
-void defInitMod(class_> &classVector);
+void defInitMod(class_< OpenMesh::VectorT > &classVector);
template
-void defInitMod(class_> &classVector) {
+void defInitMod(class_< OpenMesh::VectorT > &classVector) {
classVector
.def("__init__", make_constructor(&Factory::vec2_default))
.def("__init__", make_constructor(&Factory::vec2_user_defined))
@@ -80,7 +80,7 @@ void defInitMod(class_> &classVector) {
def("dot", &Vector::operator|);
}
template
-void defInitMod(class_> &classVector) {
+void defInitMod(class_< OpenMesh::VectorT > &classVector) {
classVector
.def("__init__", make_constructor(&Factory::vec3_default))
.def("__init__", make_constructor(&Factory::vec3_user_defined))
@@ -93,7 +93,7 @@ void defInitMod(class_> &classVector) {
def("dot", &Vector::operator|);
}
template
-void defInitMod(class_> &classVector) {
+void defInitMod(class_< OpenMesh::VectorT > &classVector) {
classVector
.def("__init__", make_constructor(&Factory::vec4_default))
.def("__init__", make_constructor(&Factory::vec4_user_defined))
diff --git a/src/Unittests/unittests_polymesh_vec2i.cc b/src/Unittests/unittests_polymesh_vec2i.cc
new file mode 100644
index 00000000..bc20d621
--- /dev/null
+++ b/src/Unittests/unittests_polymesh_vec2i.cc
@@ -0,0 +1,88 @@
+#include
+#include
+
+#include
+
+struct CustomTraitsVec2i : OpenMesh::DefaultTraits
+{
+ typedef OpenMesh::Vec2i Point;
+};
+
+
+
+typedef OpenMesh::PolyMesh_ArrayKernelT PolyMeshVec2i;
+
+
+
+/*
+ * OpenMesh Poly with Vec2i
+ */
+
+class OpenMeshBasePolyVec2i : public testing::Test {
+
+ protected:
+
+ // This function is called before each test is run
+ virtual void SetUp() {
+
+ // Do some initial stuff with the member data here...
+ }
+
+ // This function is called after all tests are through
+ virtual void TearDown() {
+
+ // Do some final stuff with the member data here...
+ }
+
+ // This member will be accessible in all tests
+ PolyMeshVec2i mesh_;
+};
+
+
+
+namespace {
+
+/*
+ * ====================================================================
+ * Define tests below
+ * ====================================================================
+ */
+
+
+/*
+ * Checking for feature edges based on angle
+ */
+TEST_F(OpenMeshBasePolyVec2i, Instance_Vec2i_Mesh) {
+
+ mesh_.clear();
+
+ // Add some vertices
+ PolyMeshVec2i::VertexHandle vhandle[4];
+
+ vhandle[0] = mesh_.add_vertex(PolyMeshVec2i::Point(0, 0));
+ vhandle[1] = mesh_.add_vertex(PolyMeshVec2i::Point(0, 1));
+ vhandle[2] = mesh_.add_vertex(PolyMeshVec2i::Point(1, 1));
+
+ // Add face
+ std::vector face_vhandles;
+
+ face_vhandles.push_back(vhandle[0]);
+ face_vhandles.push_back(vhandle[1]);
+ face_vhandles.push_back(vhandle[2]);
+ mesh_.add_face(face_vhandles);
+
+ // ===============================================
+ // Setup complete
+ // ===============================================
+
+ // Check one Request only vertex normals
+ // Face normals are required for vertex and halfedge normals, so
+ // that prevent access to non existing properties are in place
+
+ mesh_.request_vertex_normals();
+ mesh_.request_halfedge_normals();
+ mesh_.request_face_normals();
+
+}
+
+}
diff --git a/src/Unittests/unittests_trimesh_vec2i.cc b/src/Unittests/unittests_trimesh_vec2i.cc
new file mode 100644
index 00000000..66533ce3
--- /dev/null
+++ b/src/Unittests/unittests_trimesh_vec2i.cc
@@ -0,0 +1,84 @@
+#include
+#include
+
+#include
+
+struct CustomTraitsVec2i : OpenMesh::DefaultTraits
+{
+ typedef OpenMesh::Vec2i Point;
+};
+
+
+typedef OpenMesh::TriMesh_ArrayKernelT TriMeshVec2i;
+
+
+/*
+ * OpenMesh Triangular with Vec2i
+ */
+
+class OpenMeshBaseTriVec2i : public testing::Test {
+
+ protected:
+
+ // This function is called before each test is run
+ virtual void SetUp() {
+
+ // Do some initial stuff with the member data here...
+ }
+
+ // This function is called after all tests are through
+ virtual void TearDown() {
+
+ // Do some final stuff with the member data here...
+ }
+
+ // This member will be accessible in all tests
+ TriMeshVec2i mesh_;
+};
+
+
+namespace {
+
+/*
+ * ====================================================================
+ * Define tests below
+ * ====================================================================
+ */
+
+/*
+ * Checking for feature edges based on angle
+ */
+TEST_F(OpenMeshBaseTriVec2i, Instance_Vec2i_Mesh) {
+
+ mesh_.clear();
+
+ // Add some vertices
+ TriMeshVec2i::VertexHandle vhandle[4];
+
+ vhandle[0] = mesh_.add_vertex(TriMeshVec2i::Point(0, 0));
+ vhandle[1] = mesh_.add_vertex(TriMeshVec2i::Point(0, 1));
+ vhandle[2] = mesh_.add_vertex(TriMeshVec2i::Point(1, 1));
+
+ // Add face
+ std::vector face_vhandles;
+
+ face_vhandles.push_back(vhandle[0]);
+ face_vhandles.push_back(vhandle[1]);
+ face_vhandles.push_back(vhandle[2]);
+ mesh_.add_face(face_vhandles);
+
+ // ===============================================
+ // Setup complete
+ // ===============================================
+
+ // Check one Request only vertex normals
+ // Face normals are required for vertex and halfedge normals, so
+ // that prevent access to non existing properties are in place
+
+ mesh_.request_vertex_normals();
+ mesh_.request_halfedge_normals();
+ mesh_.request_face_normals();
+
+}
+
+}