[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48596] trunk/blender/extern/carve: fix for carve memory leak, update carve to hg bf36d92ff093

Campbell Barton ideasman42 at gmail.com
Wed Jul 4 18:07:01 CEST 2012


Revision: 48596
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48596
Author:   campbellbarton
Date:     2012-07-04 16:07:01 +0000 (Wed, 04 Jul 2012)
Log Message:
-----------
fix for carve memory leak, update carve to hg bf36d92ff093
reported: http://code.google.com/p/carve/issues/detail?id=33

Modified Paths:
--------------
    trunk/blender/extern/carve/include/carve/csg.hpp
    trunk/blender/extern/carve/include/carve/polyline_decl.hpp
    trunk/blender/extern/carve/include/carve/rtree.hpp
    trunk/blender/extern/carve/lib/csg_data.hpp
    trunk/blender/extern/carve/lib/csg_detail.hpp
    trunk/blender/extern/carve/lib/intersect.cpp
    trunk/blender/extern/carve/patches/strict_flags.patch

Modified: trunk/blender/extern/carve/include/carve/csg.hpp
===================================================================
--- trunk/blender/extern/carve/include/carve/csg.hpp	2012-07-04 16:06:04 UTC (rev 48595)
+++ trunk/blender/extern/carve/include/carve/csg.hpp	2012-07-04 16:07:01 UTC (rev 48596)
@@ -174,34 +174,34 @@
 
       void groupIntersections();
 
-      void _generateVertexVertexIntersections(carve::mesh::MeshSet<3>::vertex_t *va,
-                                              carve::mesh::MeshSet<3>::edge_t *eb);
-      void generateVertexVertexIntersections(carve::mesh::MeshSet<3>::face_t *a,
-                                             const std::vector<carve::mesh::MeshSet<3>::face_t *> &b);
+      void _generateVertexVertexIntersections(meshset_t::vertex_t *va,
+                                              meshset_t::edge_t *eb);
+      void generateVertexVertexIntersections(meshset_t::face_t *a,
+                                             const std::vector<meshset_t::face_t *> &b);
 
-      void _generateVertexEdgeIntersections(carve::mesh::MeshSet<3>::vertex_t *va,
-                                            carve::mesh::MeshSet<3>::edge_t *eb);
-      void generateVertexEdgeIntersections(carve::mesh::MeshSet<3>::face_t *a,
-                                           const std::vector<carve::mesh::MeshSet<3>::face_t *> &b);
+      void _generateVertexEdgeIntersections(meshset_t::vertex_t *va,
+                                            meshset_t::edge_t *eb);
+      void generateVertexEdgeIntersections(meshset_t::face_t *a,
+                                           const std::vector<meshset_t::face_t *> &b);
 
-      void _generateEdgeEdgeIntersections(carve::mesh::MeshSet<3>::edge_t *ea,
-                                          carve::mesh::MeshSet<3>::edge_t *eb);
-      void generateEdgeEdgeIntersections(carve::mesh::MeshSet<3>::face_t *a,
-                                         const std::vector<carve::mesh::MeshSet<3>::face_t *> &b);
+      void _generateEdgeEdgeIntersections(meshset_t::edge_t *ea,
+                                          meshset_t::edge_t *eb);
+      void generateEdgeEdgeIntersections(meshset_t::face_t *a,
+                                         const std::vector<meshset_t::face_t *> &b);
 
-      void _generateVertexFaceIntersections(carve::mesh::MeshSet<3>::face_t *fa,
-                                            carve::mesh::MeshSet<3>::edge_t *eb);
-      void generateVertexFaceIntersections(carve::mesh::MeshSet<3>::face_t *a,
-                                           const std::vector<carve::mesh::MeshSet<3>::face_t *> &b);
+      void _generateVertexFaceIntersections(meshset_t::face_t *fa,
+                                            meshset_t::edge_t *eb);
+      void generateVertexFaceIntersections(meshset_t::face_t *a,
+                                           const std::vector<meshset_t::face_t *> &b);
 
-      void _generateEdgeFaceIntersections(carve::mesh::MeshSet<3>::face_t *fa,
-                                          carve::mesh::MeshSet<3>::edge_t *eb);
-      void generateEdgeFaceIntersections(carve::mesh::MeshSet<3>::face_t *a,
-                                         const std::vector<carve::mesh::MeshSet<3>::face_t *> &b);
+      void _generateEdgeFaceIntersections(meshset_t::face_t *fa,
+                                          meshset_t::edge_t *eb);
+      void generateEdgeFaceIntersections(meshset_t::face_t *a,
+                                         const std::vector<meshset_t::face_t *> &b);
 
-      void generateIntersectionCandidates(carve::mesh::MeshSet<3> *a,
+      void generateIntersectionCandidates(meshset_t *a,
                                           const face_rtree_t *a_node,
-                                          carve::mesh::MeshSet<3> *b,
+                                          meshset_t *b,
                                           const face_rtree_t *b_node,
                                           face_pairs_t &face_pairs,
                                           bool descend_a = true);
@@ -287,7 +287,7 @@
        * @param[out] out_loops A list of grouped face loops.
        */
       void groupFaceLoops(
-        carve::mesh::MeshSet<3> *src,
+        meshset_t *src,
         FaceLoopList &face_loops,
         const detail::LoopEdges &loop_edges,
         const V2Set &no_cross,

Modified: trunk/blender/extern/carve/include/carve/polyline_decl.hpp
===================================================================
--- trunk/blender/extern/carve/include/carve/polyline_decl.hpp	2012-07-04 16:06:04 UTC (rev 48595)
+++ trunk/blender/extern/carve/include/carve/polyline_decl.hpp	2012-07-04 16:07:01 UTC (rev 48596)
@@ -138,6 +138,11 @@
       PolylineSet(const std::vector<carve::geom3d::Vector> &points);
       PolylineSet() {
       }
+      ~PolylineSet() {
+        for (line_iter i = lines.begin(); i != lines.end(); ++i) {
+          delete *i;
+        }
+      }
 
       template<typename iter_t>
       void addPolyline(bool closed, iter_t begin, iter_t end);

Modified: trunk/blender/extern/carve/include/carve/rtree.hpp
===================================================================
--- trunk/blender/extern/carve/include/carve/rtree.hpp	2012-07-04 16:06:04 UTC (rev 48595)
+++ trunk/blender/extern/carve/include/carve/rtree.hpp	2012-07-04 16:07:01 UTC (rev 48596)
@@ -49,8 +49,6 @@
 
       aabb_t getAABB() const { return bbox; }
 
-
-
       struct data_aabb_t {
         aabb_t bbox;
         data_t data;
@@ -164,8 +162,19 @@
         _fill(begin, end, typename std::iterator_traits<iter_t>::value_type());
       }
 
+      ~RTreeNode() {
+        if (child) {
+          RTreeNode *next = child;
+          while (next) {
+            RTreeNode *curr = next;
+            next = next->sibling;
+            delete curr;
+          }
+        }
+      }
 
 
+
       // functor for ordering nodes by increasing aabb midpoint, along a specified axis.
       struct aabb_cmp_mid {
         size_t dim;

Modified: trunk/blender/extern/carve/lib/csg_data.hpp
===================================================================
--- trunk/blender/extern/carve/lib/csg_data.hpp	2012-07-04 16:06:04 UTC (rev 48595)
+++ trunk/blender/extern/carve/lib/csg_data.hpp	2012-07-04 16:07:01 UTC (rev 48596)
@@ -30,7 +30,7 @@
   VVMap vmap;
 
   // map from intersected edge to intersection points.
-  EVSMap emap;
+  EIntMap emap;
 
   // map from intersected face to intersection points.
   FVSMap fmap;
@@ -39,7 +39,7 @@
   VFSMap fmap_rev;
 
   // created by divideEdges().
-  // holds, for each edge, a 
+  // holds, for each edge, an ordered vector of inserted vertices.
   EVVMap divided_edges;
 
   // created by faceSplitEdges.

Modified: trunk/blender/extern/carve/lib/csg_detail.hpp
===================================================================
--- trunk/blender/extern/carve/lib/csg_detail.hpp	2012-07-04 16:06:04 UTC (rev 48595)
+++ trunk/blender/extern/carve/lib/csg_detail.hpp	2012-07-04 16:07:01 UTC (rev 48596)
@@ -24,30 +24,32 @@
 namespace carve {
   namespace csg {
     namespace detail {
+      typedef std::map<carve::mesh::MeshSet<3>::vertex_t *,
+                       std::set<std::pair<carve::mesh::MeshSet<3>::face_t *, double> > > EdgeIntInfo;
 
-    typedef std::unordered_set<carve::mesh::MeshSet<3>::vertex_t *> VSet;
-    typedef std::unordered_set<carve::mesh::MeshSet<3>::face_t *> FSet;
+      typedef std::unordered_set<carve::mesh::MeshSet<3>::vertex_t *> VSet;
+      typedef std::unordered_set<carve::mesh::MeshSet<3>::face_t *> FSet;
 
-    typedef std::set<carve::mesh::MeshSet<3>::vertex_t *> VSetSmall;
-    typedef std::set<csg::V2> V2SetSmall;
-    typedef std::set<carve::mesh::MeshSet<3>::face_t *> FSetSmall;
+      typedef std::set<carve::mesh::MeshSet<3>::vertex_t *> VSetSmall;
+      typedef std::set<csg::V2> V2SetSmall;
+      typedef std::set<carve::mesh::MeshSet<3>::face_t *> FSetSmall;
 
-    typedef std::unordered_map<carve::mesh::MeshSet<3>::vertex_t *, VSetSmall> VVSMap;
-    typedef std::unordered_map<carve::mesh::MeshSet<3>::edge_t *, VSetSmall> EVSMap;
-    typedef std::unordered_map<carve::mesh::MeshSet<3>::face_t *, VSetSmall> FVSMap;
+      typedef std::unordered_map<carve::mesh::MeshSet<3>::vertex_t *, VSetSmall> VVSMap;
+      typedef std::unordered_map<carve::mesh::MeshSet<3>::edge_t *, EdgeIntInfo> EIntMap;
+      typedef std::unordered_map<carve::mesh::MeshSet<3>::face_t *, VSetSmall> FVSMap;
 
-    typedef std::unordered_map<carve::mesh::MeshSet<3>::vertex_t *, FSetSmall> VFSMap;
-    typedef std::unordered_map<carve::mesh::MeshSet<3>::face_t *, V2SetSmall> FV2SMap;
+      typedef std::unordered_map<carve::mesh::MeshSet<3>::vertex_t *, FSetSmall> VFSMap;
+      typedef std::unordered_map<carve::mesh::MeshSet<3>::face_t *, V2SetSmall> FV2SMap;
 
-    typedef std::unordered_map<
-      carve::mesh::MeshSet<3>::edge_t *,
-      std::vector<carve::mesh::MeshSet<3>::vertex_t *> > EVVMap;
+      typedef std::unordered_map<
+        carve::mesh::MeshSet<3>::edge_t *,
+        std::vector<carve::mesh::MeshSet<3>::vertex_t *> > EVVMap;
 
       typedef std::unordered_map<carve::mesh::MeshSet<3>::vertex_t *,
                                  std::vector<carve::mesh::MeshSet<3>::edge_t *> > VEVecMap;
 
 
-     class LoopEdges : public std::unordered_map<V2, std::list<FaceLoop *> > {
+      class LoopEdges : public std::unordered_map<V2, std::list<FaceLoop *> > {
         typedef std::unordered_map<V2, std::list<FaceLoop *> > super;
 
       public:

Modified: trunk/blender/extern/carve/lib/intersect.cpp
===================================================================
--- trunk/blender/extern/carve/lib/intersect.cpp	2012-07-04 16:06:04 UTC (rev 48595)
+++ trunk/blender/extern/carve/lib/intersect.cpp	2012-07-04 16:07:01 UTC (rev 48596)
@@ -41,6 +41,7 @@
 #include <carve/timing.hpp>
 #include <carve/colour.hpp>
 
+#include <memory>
 
 
 
@@ -114,7 +115,7 @@
     ordered_vertices.reserve(std::distance(beg, end));
   
     for (; beg != end; ++beg) {
-      carve::mesh::MeshSet<3>::vertex_t *v = (*beg);
+      carve::mesh::MeshSet<3>::vertex_t *v = *beg;
       ordered_vertices.push_back(std::make_pair(carve::geom::dot(v->v - base, dir), v));
     }
   
@@ -130,8 +131,39 @@
     }
   }
 
+  template<typename iter_t>
+  void orderEdgeIntersectionVertices(iter_t beg, const iter_t end,

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list