fix for carve memory leak, update carve to hg bf36d92ff093
[blender.git] / extern / carve / include / carve / polyline_decl.hpp
1 // Begin License:
2 // Copyright (C) 2006-2011 Tobias Sargeant (tobias.sargeant@gmail.com).
3 // All rights reserved.
4 //
5 // This file is part of the Carve CSG Library (http://carve-csg.com/)
6 //
7 // This file may be used under the terms of the GNU General Public
8 // License version 2.0 as published by the Free Software Foundation
9 // and appearing in the file LICENSE.GPL2 included in the packaging of
10 // this file.
11 //
12 // This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
13 // INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
14 // A PARTICULAR PURPOSE.
15 // End:
16
17 #pragma once
18
19 #include <iterator>
20 #include <list>
21 #include <iterator>
22 #include <limits>
23
24 #include <carve/carve.hpp>
25 #include <carve/tag.hpp>
26 #include <carve/geom.hpp>
27 #include <carve/kd_node.hpp>
28 #include <carve/geom3d.hpp>
29 #include <carve/aabb.hpp>
30
31 namespace carve {
32   namespace line {
33
34     struct PolylineEdge;
35     struct Polyline;
36     struct polyline_vertex_const_iter;
37     struct polyline_vertex_iter;
38     struct polyline_edge_const_iter;
39     struct polyline_edge_iter;
40
41
42
43     struct Vertex : public tagable {
44       carve::geom3d::Vector v;
45       std::list<std::pair<PolylineEdge *, PolylineEdge *> > edge_pairs;
46
47       void addEdgePair(PolylineEdge *in, PolylineEdge *out) {
48         edge_pairs.push_back(std::make_pair(in, out));
49       }
50     };
51
52
53
54     struct vec_adapt_vertex_ptr {
55       const carve::geom3d::Vector &operator()(const Vertex * const &v) { return v->v; }
56       carve::geom3d::Vector &operator()(Vertex *&v) { return v->v; }
57     };
58
59
60
61     struct PolylineEdge : public tagable {
62       Polyline *parent;
63       unsigned edgenum;
64       Vertex *v1, *v2;
65
66       PolylineEdge(Polyline *_parent, int _edgenum, Vertex *_v1, Vertex *_v2);
67
68       carve::geom3d::AABB aabb() const;
69
70       inline PolylineEdge *prevEdge() const;
71       inline PolylineEdge *nextEdge() const;
72     };
73
74
75
76     struct Polyline {
77       bool closed;
78       std::vector<PolylineEdge *> edges;
79
80       Polyline();
81
82       size_t vertexCount() const;
83
84       size_t edgeCount() const;
85
86       const PolylineEdge *edge(size_t e) const;
87
88       PolylineEdge *edge(size_t e);
89
90       const Vertex *vertex(size_t v) const;
91
92       Vertex *vertex(size_t v);
93
94       bool isClosed() const;
95
96       polyline_vertex_const_iter vbegin() const;
97       polyline_vertex_const_iter vend() const;
98       polyline_vertex_iter vbegin();
99       polyline_vertex_iter vend();
100
101       polyline_edge_const_iter ebegin() const;
102       polyline_edge_const_iter eend() const;
103       polyline_edge_iter ebegin();
104       polyline_edge_iter eend();
105
106       carve::geom3d::AABB aabb() const;
107
108       template<typename iter_t>
109       void _init(bool c, iter_t begin, iter_t end, std::vector<Vertex> &vertices);
110
111       template<typename iter_t>
112       void _init(bool closed, iter_t begin, iter_t end, std::vector<Vertex> &vertices, std::forward_iterator_tag);
113
114       template<typename iter_t>
115       void _init(bool closed, iter_t begin, iter_t end, std::vector<Vertex> &vertices, std::random_access_iterator_tag);
116
117       template<typename iter_t>
118       Polyline(bool closed, iter_t begin, iter_t end, std::vector<Vertex> &vertices);
119
120       ~Polyline() {
121         for (size_t i = 0; i < edges.size(); ++i) {
122           delete edges[i];
123         }
124       }
125     };
126
127
128
129     struct PolylineSet {
130       typedef std::list<Polyline *> line_list;
131       typedef line_list::iterator line_iter;
132       typedef line_list::const_iterator const_line_iter;
133
134       std::vector<Vertex> vertices;
135       line_list lines;
136       carve::geom3d::AABB aabb;
137
138       PolylineSet(const std::vector<carve::geom3d::Vector> &points);
139       PolylineSet() {
140       }
141       ~PolylineSet() {
142         for (line_iter i = lines.begin(); i != lines.end(); ++i) {
143           delete *i;
144         }
145       }
146
147       template<typename iter_t>
148       void addPolyline(bool closed, iter_t begin, iter_t end);
149
150       void sortVertices(const carve::geom3d::Vector &axis);
151
152       size_t vertexToIndex_fast(const Vertex *v) const;
153     };
154
155   }
156 }