diff options
Diffstat (limited to 'extern')
-rw-r--r-- | extern/carve/carve-capi.cc | 45 | ||||
-rw-r--r-- | extern/carve/carve-util.cc | 12 | ||||
-rw-r--r-- | extern/carve/carve-util.h | 39 | ||||
-rw-r--r-- | extern/carve/include/carve/config.h | 18 | ||||
-rw-r--r-- | extern/carve/include/carve/mesh_ops.hpp | 2 | ||||
-rw-r--r-- | extern/carve/lib/triangulator.cpp | 18 | ||||
-rw-r--r-- | extern/carve/patches/clang_is_heap_fix.patch | 42 | ||||
-rw-r--r-- | extern/carve/patches/files/config.h | 18 | ||||
-rw-r--r-- | extern/carve/patches/series | 2 | ||||
-rw-r--r-- | extern/libmv/ChangeLog | 8 | ||||
-rw-r--r-- | extern/libmv/libmv/simple_pipeline/bundle.cc | 2 | ||||
-rw-r--r-- | extern/rangetree/range_tree.hh | 4 |
12 files changed, 154 insertions, 56 deletions
diff --git a/extern/carve/carve-capi.cc b/extern/carve/carve-capi.cc index a65d1a8d766..af9ecad685d 100644 --- a/extern/carve/carve-capi.cc +++ b/extern/carve/carve-capi.cc @@ -38,7 +38,7 @@ typedef std::pair<int, int> OrigIndex; typedef std::pair<MeshSet<3>::vertex_t *, MeshSet<3>::vertex_t *> VertexPair; typedef carve::interpolate::VertexAttr<OrigIndex> OrigVertMapping; typedef carve::interpolate::FaceAttr<OrigIndex> OrigFaceMapping; -typedef carve::interpolate::FaceEdgeAttr<OrigIndex> OrigFaceEdgeMapping; +typedef carve::interpolate::SwapableFaceEdgeAttr<OrigIndex> OrigFaceEdgeMapping; typedef carve::interpolate::SimpleFaceEdgeAttr<bool> FaceEdgeTriangulatedFlag; typedef struct CarveMeshDescr { @@ -522,6 +522,39 @@ public: } }; +template <typename Interpolator> +void copyFaceEdgeAttrs(const MeshSet<3> *poly, + Interpolator *old_interpolator, + Interpolator *new_interpolator) +{ + for (MeshSet<3>::const_face_iter face_iter = poly->faceBegin(); + face_iter != poly->faceEnd(); + ++face_iter) + { + const MeshSet<3>::face_t *face = *face_iter; + + for (int edge_index = 0; + edge_index < face->nEdges(); + ++edge_index) + { + new_interpolator->copyAttribute(face, + edge_index, + old_interpolator); + } + } +} + +template <typename Interpolator> +void cleanupFaceEdgeAttrs(const MeshSet<3> *left, + const MeshSet<3> *right, + Interpolator *interpolator) +{ + Interpolator new_interpolator; + copyFaceEdgeAttrs(left, interpolator, &new_interpolator); + copyFaceEdgeAttrs(right, interpolator, &new_interpolator); + interpolator->swapAttributes(&new_interpolator); +} + } // namespace CarveMeshDescr *carve_addMesh(struct ImportMeshData *import_data, @@ -698,7 +731,15 @@ bool carve_performBooleanOperation(CarveMeshDescr *left_mesh, // intersecting that meshes tessellation of operation result can't be // done properly. The only way to make such situations working is to // union intersecting meshes of the same operand. - carve_unionIntersections(&csg, &left, &right); + if (carve_unionIntersections(&csg, &left, &right)) { + cleanupFaceEdgeAttrs(left, + right, + &output_descr->face_edge_triangulated_flag); + cleanupFaceEdgeAttrs(left, + right, + &output_descr->orig_face_edge_mapping); + } + left_mesh->poly = left; right_mesh->poly = right; diff --git a/extern/carve/carve-util.cc b/extern/carve/carve-util.cc index ac6dcbc1a94..b268dae9dd6 100644 --- a/extern/carve/carve-util.cc +++ b/extern/carve/carve-util.cc @@ -486,14 +486,15 @@ MeshSet<3> *unionIntersectingMeshes(carve::csg::CSG *csg, // TODO(sergey): This function is to be totally re-implemented to make it // more clear what's going on and hopefully optimize it as well. -void carve_unionIntersections(carve::csg::CSG *csg, +bool carve_unionIntersections(carve::csg::CSG *csg, MeshSet<3> **left_r, MeshSet<3> **right_r) { MeshSet<3> *left = *left_r, *right = *right_r; + bool changed = false; if (left->meshes.size() == 1 && right->meshes.size() == 0) { - return; + return false; } MeshSet<3>::aabb_t leftAABB = left->getAABB(); @@ -503,14 +504,19 @@ void carve_unionIntersections(carve::csg::CSG *csg, right = unionIntersectingMeshes(csg, right, leftAABB); if (left != *left_r) { + changed = true; delete *left_r; } - if (right != *right_r) + if (right != *right_r) { + changed = true; delete *right_r; + } *left_r = left; *right_r = right; + + return changed; } static inline void add_newell_cross_v3_v3v3(const Vector &v_prev, diff --git a/extern/carve/carve-util.h b/extern/carve/carve-util.h index a658b2fea96..f650810e9e3 100644 --- a/extern/carve/carve-util.h +++ b/extern/carve/carve-util.h @@ -70,7 +70,7 @@ void carve_getRescaleMinMax(const carve::mesh::MeshSet<3> *left, carve::geom3d::Vector *min, carve::geom3d::Vector *max); -void carve_unionIntersections(carve::csg::CSG *csg, +bool carve_unionIntersections(carve::csg::CSG *csg, carve::mesh::MeshSet<3> **left_r, carve::mesh::MeshSet<3> **right_r); @@ -115,8 +115,8 @@ namespace carve { attrs.find(new_edge_iter->vert); if (found == attrs.end()) { for (const_edge_iter_t orig_edge_iter = orig_face->begin(); - orig_edge_iter != orig_face->end(); - ++orig_edge_iter) + orig_edge_iter != orig_face->end(); + ++orig_edge_iter) { if ((orig_edge_iter->vert->v - new_edge_iter->vert->v).length2() < 1e-5) { attrs[new_edge_iter->vert] = attrs[orig_edge_iter->vert]; @@ -236,6 +236,20 @@ namespace carve { attrs[std::make_pair(f, e)] = attr; } + void copyAttribute(const meshset_t::face_t *face, + unsigned edge, + SimpleFaceEdgeAttr<attr_t> *interpolator) { + key_t key(face, edge); + typename attrmap_t::const_iterator fv = interpolator->attrs.find(key); + if (fv != interpolator->attrs.end()) { + attrs[key] = (*fv).second; + } + } + + void swapAttributes(SimpleFaceEdgeAttr<attr_t> *interpolator) { + attrs.swap(interpolator->attrs); + } + SimpleFaceEdgeAttr() : Interpolator() { } @@ -243,6 +257,25 @@ namespace carve { } }; + template<typename attr_t> + class SwapableFaceEdgeAttr : public FaceEdgeAttr<attr_t> { + public: + typedef carve::mesh::MeshSet<3> meshset_t; + + void copyAttribute(const meshset_t::face_t *face, + unsigned edge, + SwapableFaceEdgeAttr<attr_t> *interpolator) { + typename FaceEdgeAttr<attr_t>::key_t key(face, edge); + typename FaceEdgeAttr<attr_t>::attrmap_t::const_iterator fv = interpolator->attrs.find(key); + if (fv != interpolator->attrs.end()) { + this->attrs[key] = (*fv).second; + } + } + + void swapAttributes(SwapableFaceEdgeAttr<attr_t> *interpolator) { + this->attrs.swap(interpolator->attrs); + } + }; } // namespace interpolate } // namespace carve diff --git a/extern/carve/include/carve/config.h b/extern/carve/include/carve/config.h index fdae2d2843f..3533c1a6710 100644 --- a/extern/carve/include/carve/config.h +++ b/extern/carve/include/carve/config.h @@ -10,3 +10,21 @@ # define HAVE_STDINT_H #endif + +// Support for latest Clang/LLVM on FreeBSD which does have different libcxx. +// +// TODO(sergey): Move it some some more generic header with platform-specific +// declarations. + +// Indicates whether __is_heap is available +#undef HAVE_IS_HEAP + +#ifdef __GNUC__ +// NeyBSD doesn't have __is_heap +# ifndef __NetBSD__ +# define HAVE_IS_HEAP +# ifdef _LIBCPP_VERSION +# define __is_heap is_heap +# endif // _LIBCPP_VERSION +# endif // !__NetBSD__ +#endif // __GNUC__ diff --git a/extern/carve/include/carve/mesh_ops.hpp b/extern/carve/include/carve/mesh_ops.hpp index 02b1bde4e45..3b71feb0e6c 100644 --- a/extern/carve/include/carve/mesh_ops.hpp +++ b/extern/carve/include/carve/mesh_ops.hpp @@ -580,7 +580,7 @@ namespace carve { std::vector<VertexInfo *> queue; void checkheap() { -#ifdef __GNUC__ +#if defined(HAVE_IS_HEAP) CARVE_ASSERT(std::__is_heap(queue.begin(), queue.end(), order_by_score())); #endif } diff --git a/extern/carve/lib/triangulator.cpp b/extern/carve/lib/triangulator.cpp index 820fed07db7..eb36e86af5d 100644 --- a/extern/carve/lib/triangulator.cpp +++ b/extern/carve/lib/triangulator.cpp @@ -27,24 +27,6 @@ #include <algorithm> -// Support for latest Clang/LLVM on FreeBSD which does have different libcxx. -// -// TODO(sergey): Move it some some more generic header with platform-specific -// declarations. - -// Indicates whether __is_heap is available -#undef HAVE_IS_HEAP - -#ifdef __GNUC__ -// NeyBSD doesn't have __is_heap -# ifndef __NetBSD__ -# define HAVE_IS_HEAP -# ifdef _LIBCPP_VERSION -# define __is_heap is_heap -# endif // _LIBCPP_VERSION -# endif // !__NetBSD__ -#endif // __GNUC__ - namespace { // private code related to hole patching. diff --git a/extern/carve/patches/clang_is_heap_fix.patch b/extern/carve/patches/clang_is_heap_fix.patch index a00710b9540..524a8e0420c 100644 --- a/extern/carve/patches/clang_is_heap_fix.patch +++ b/extern/carve/patches/clang_is_heap_fix.patch @@ -1,31 +1,27 @@ -diff -r 2e6e59022e6e lib/triangulator.cpp ---- a/lib/triangulator.cpp Fri Nov 09 09:35:35 2012 +1100 -+++ b/lib/triangulator.cpp Thu Jan 09 16:13:17 2014 +0600 -@@ -27,6 +27,23 @@ +diff -r e82d852e4fb0 include/carve/mesh_ops.hpp +--- a/include/carve/mesh_ops.hpp Wed Jan 15 13:16:14 2014 +1100 ++++ b/include/carve/mesh_ops.hpp Fri Mar 28 14:34:04 2014 +0600 +@@ -580,7 +580,7 @@ + std::vector<VertexInfo *> queue; - #include <algorithm> + void checkheap() { +-#ifdef __GNUC__ ++#if defined(HAVE_IS_HEAP) + CARVE_ASSERT(std::__is_heap(queue.begin(), queue.end(), order_by_score())); + #endif + } +diff -r e82d852e4fb0 lib/triangulator.cpp +--- a/lib/triangulator.cpp Wed Jan 15 13:16:14 2014 +1100 ++++ b/lib/triangulator.cpp Fri Mar 28 14:34:04 2014 +0600 +@@ -27,7 +27,6 @@ -+// Support for latest Clang/LLVM on FreeBSD which does have different libcxx. -+// -+// TODO(sergey): Move it some some more generic header with platform-specific -+// declarations. -+ -+// Indicates whether __is_heap is available -+#undef HAVE_IS_HEAP -+ -+#ifdef __GNUC__ -+// NeyBSD doesn't have __is_heap -+# ifndef __NetBSD__ -+# define HAVE_IS_HEAP -+# ifdef _LIBCPP_VERSION -+# define __is_heap is_heap -+# endif // _LIBCPP_VERSION -+# endif // !__NetBSD__ -+#endif // __GNUC__ + #include <algorithm> +- namespace { // private code related to hole patching. -@@ -122,7 +139,7 @@ + +@@ -122,7 +121,7 @@ std::vector<vertex_info *> queue; void checkheap() { diff --git a/extern/carve/patches/files/config.h b/extern/carve/patches/files/config.h index fdae2d2843f..3533c1a6710 100644 --- a/extern/carve/patches/files/config.h +++ b/extern/carve/patches/files/config.h @@ -10,3 +10,21 @@ # define HAVE_STDINT_H #endif + +// Support for latest Clang/LLVM on FreeBSD which does have different libcxx. +// +// TODO(sergey): Move it some some more generic header with platform-specific +// declarations. + +// Indicates whether __is_heap is available +#undef HAVE_IS_HEAP + +#ifdef __GNUC__ +// NeyBSD doesn't have __is_heap +# ifndef __NetBSD__ +# define HAVE_IS_HEAP +# ifdef _LIBCPP_VERSION +# define __is_heap is_heap +# endif // _LIBCPP_VERSION +# endif // !__NetBSD__ +#endif // __GNUC__ diff --git a/extern/carve/patches/series b/extern/carve/patches/series index 286d594bbef..529bf43a858 100644 --- a/extern/carve/patches/series +++ b/extern/carve/patches/series @@ -8,5 +8,5 @@ strict_flags.patch interpolator_reorder.patch mesh_simplify_dissolve_edges.patch memory_leak_fix.patch -mavc_fix.patch +msvc_fix.patch face_hole_merge_workaround.patch diff --git a/extern/libmv/ChangeLog b/extern/libmv/ChangeLog index 641d2518fb8..2e8e99af0eb 100644 --- a/extern/libmv/ChangeLog +++ b/extern/libmv/ChangeLog @@ -1,3 +1,11 @@ +commit 901b146f28825d3e05f4157ca2a34ae00261b91a +Author: Sergey Sharybin <sergey.vfx@gmail.com> +Date: Wed Mar 26 17:44:09 2014 +0600 + + Fix bad memory write in BA code when having zero-weighted tracks + + Issue was really stupid and caused by the wrong vector initialization. + commit b1381540305d69c702eb2f051bd543fb5c1c3e2c Author: Sergey Sharybin <sergey.vfx@gmail.com> Date: Thu Feb 6 18:01:58 2014 +0600 diff --git a/extern/libmv/libmv/simple_pipeline/bundle.cc b/extern/libmv/libmv/simple_pipeline/bundle.cc index 09523340ed7..f571b0fcaab 100644 --- a/extern/libmv/libmv/simple_pipeline/bundle.cc +++ b/extern/libmv/libmv/simple_pipeline/bundle.cc @@ -416,7 +416,7 @@ void EuclideanBundleCommonIntrinsics(const Tracks &tracks, vector<Marker> markers = tracks.AllMarkers(); // N-th element denotes whether track N is a constant zero-weigthed track. - vector<bool> zero_weight_tracks_flags(tracks.MaxTrack(), true); + vector<bool> zero_weight_tracks_flags(tracks.MaxTrack() + 1, true); // Residual blocks with 10 parameters are unwieldly with Ceres, so pack the // intrinsics into a single block and rely on local parameterizations to diff --git a/extern/rangetree/range_tree.hh b/extern/rangetree/range_tree.hh index a88c70281b6..919e0b04933 100644 --- a/extern/rangetree/range_tree.hh +++ b/extern/rangetree/range_tree.hh @@ -79,10 +79,6 @@ struct RangeTree { TreeIter iter = tree.find(Range(t)); assert(iter != tree.end()); Range cur = *iter; - TreeIter prev = iter; - TreeIter next = iter; - --prev; - ++next; /* Remove the original range (note that this does not invalidate the prev/next iterators) */ |