Fix for a static variable in BlenderStrokeRenderer::RenderStrokeRep() left after
[blender.git] / source / blender / freestyle / intern / view_map / ViewEdgeXBuilder.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2010 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 #ifndef __FREESTYLE_VIEW_EDGE_X_BUILDER_H__
29 #define __FREESTYLE_VIEW_EDGE_X_BUILDER_H__
30
31 /** \file blender/freestyle/intern/view_map/ViewEdgeXBuilder.h
32  *  \ingroup freestyle
33  *  \brief Class to build view edges and the underlying chains of feature edges...
34  *  \author Stephane Grabli
35  *  \date 27/10/2003
36  */
37
38 #include <map>
39 #include <utility>
40 #include <vector>
41
42 #if 0 // soc
43 #if defined(__GNUC__) && (__GNUC__ >= 3)
44 //hash_map is not part of the C++ standard anymore; hash_map.h has been kept though for backward compatibility
45 #  include <hash_map.h>
46 #else
47 #  include <hash_map>
48 #endif
49 #endif
50
51 #include "Interface1D.h"
52
53 #include "../geometry/Geom.h"
54
55 #include "../system/FreestyleConfig.h"
56
57 using namespace Geometry;
58 using namespace std;
59
60 class SVertex;
61
62 /*! Defines a hash table used for searching the SVertex */
63 struct SVertexHasher
64 {
65 #define _MUL 950706376UL
66 #define _MOD 2147483647UL
67         inline size_t operator()(const Vec3r& p) const
68         {
69                 size_t res = ((unsigned long)(p[0] * _MUL)) % _MOD;
70                 res = ((res + (unsigned long)(p[1]) * _MUL)) % _MOD;
71                 return ((res +(unsigned long)(p[2]) * _MUL)) % _MOD;
72         }
73 #undef _MUL
74 #undef _MOD
75 };
76
77 // Key_compare predicate for hash_map. In particular, return false if equal.
78 struct epsilonEquals
79 {
80         bool operator()(const Vec3r& v1, const Vec3r& v2) const
81         {
82                 real norm = (v1 - v2).norm();
83                 return (norm < 1.0e-06);
84         }
85 };
86
87
88 // typedef hash_map<Vec3r, SVertex*, SVertexHasher, epsilonEquals> SVertexMap;
89 typedef map<Vec3r , SVertex*> SVertexMap;
90
91 class WXFaceLayer;
92
93 /*! class to describe an oriented smooth edge */
94 class OWXFaceLayer
95 {
96 public:
97         WXFaceLayer *fl;
98         bool order;
99
100         OWXFaceLayer()
101         {
102                 fl = NULL;
103                 order = true;
104         }
105
106         OWXFaceLayer(WXFaceLayer *ifl, bool iOrder = true)
107         {
108                 fl = ifl;
109                 order = iOrder;
110         }
111
112         OWXFaceLayer& operator=(const OWXFaceLayer& iBrother)
113         {
114                 fl = iBrother.fl;
115                 order = iBrother.order;
116                 return *this;
117         }
118
119         bool operator==(const OWXFaceLayer& b)
120         {
121                 return ((fl == b.fl) && (order == b.order));
122         }
123
124         bool operator!=(const OWXFaceLayer& b)
125         {
126                 return !(*this == b);
127         }
128 };
129
130 class WXEdge;
131
132 /*! class to describe an oriented sharp edge */
133 class OWXEdge
134 {
135 public:
136         WXEdge *e;
137         bool order;
138
139         OWXEdge()
140         {
141                 e = NULL;
142                 order = true;
143         }
144
145         OWXEdge(WXEdge *ie, bool iOrder = true)
146         {
147                 e = ie;
148                 order = iOrder;
149         }
150
151         OWXEdge& operator=(const OWXEdge& iBrother)
152         {
153                 e = iBrother.e;
154                 order = iBrother.order;
155                 return *this;
156         }
157
158         bool operator==(const OWXEdge& b)
159         {
160                 return ((e == b.e) && (order == b.order));
161         }
162
163         bool operator!=(const OWXEdge& b)
164         {
165                 return !(*this == b);
166         }
167 };
168
169 class WOEdge;
170 class WXEdge;
171 class WXShape;
172 class SVertex;
173 class FEdge;
174 class ViewVertex;
175 class ViewEdge;
176 class ViewShape;
177
178 class LIB_VIEW_MAP_EXPORT ViewEdgeXBuilder
179 {
180 protected:
181         int _currentViewId;    // Id for view edges
182         int _currentFId;       // Id for FEdges
183         int _currentSVertexId; // Id for SVertex
184
185 public:
186         inline ViewEdgeXBuilder()
187         {
188                 _currentViewId = 1;
189                 _currentFId = 0;
190                 _currentSVertexId = 0;
191         }
192
193         virtual ~ViewEdgeXBuilder() {}
194
195         /*! Builds a view shape from a WXShape in which the feature edges are flagged
196          *  Builds chains of feature edges (so ViewEdges) from a WXShape
197          *    iWShape
198          *      The Winged Edge structure in which all silhouette edges and vertices are flagged.
199          *    oViewShape
200          *      The Silhouette Shape in which the chains must be added.
201          *    ioVEdges
202          *      The list of new ViewEdges.
203          *    ioVVertices
204          *      THe new ViewVertices
205          *    ioFEdges
206          *      A list in which all new FEdges are added
207          *    ioSVertices
208          *      A list of SVertex where all created SVertex are added.
209          */
210         virtual void BuildViewEdges(WXShape *iWShape, ViewShape *oVShape, std::vector<ViewEdge*>& ioVEdges,
211                                     std::vector<ViewVertex*>& ioVVertices, std::vector<FEdge*>& ioFEdges,
212                                     std::vector<SVertex*>& ioSVertices);
213
214         /*! Builds a smooth view edge, starting the face iFace. */
215         ViewEdge *BuildSmoothViewEdge(const OWXFaceLayer& iFaceLayer);
216
217         /*! Makes a sharp viewedge  */
218         ViewEdge *BuildSharpViewEdge(const OWXEdge& iWEdge);
219
220 public:
221         /*! accessors */
222         inline int currentViewId() const
223         {
224                 return _currentViewId;
225         }
226
227         inline int currentFId() const
228         {
229                 return _currentFId;
230         }
231
232         inline int currentSVertexId() const
233         {
234                 return _currentSVertexId;
235         }
236
237         /*! modifiers */
238         inline void setCurrentViewId(int id)
239         {
240                 _currentViewId = id;
241         }
242
243         inline void setCurrentFId(int id)
244         {
245                 _currentFId = id;
246         }
247
248         inline void setCurrentSVertexId(int id)
249         {
250                 _currentSVertexId = id;
251         }
252
253 protected:
254         /*! Init the view edges building */
255         virtual void Init(ViewShape *oVShape);
256
257         // SMOOTH //
258         /*! checks whether a face has already been processed or not */
259         bool stopSmoothViewEdge(WXFaceLayer *iFaceLayer);
260         OWXFaceLayer FindNextFaceLayer(const OWXFaceLayer& iFaceLayer);
261         OWXFaceLayer FindPreviousFaceLayer(const OWXFaceLayer& iFaceLayer);
262         FEdge *BuildSmoothFEdge(FEdge *feprevious, const OWXFaceLayer& ifl);
263
264         // SHARP //
265         /*! checks whether a WEdge has already been processed or not */
266         bool stopSharpViewEdge(WXEdge *iFace);
267         int retrieveFaceMarks(WXEdge *iEdge);
268         OWXEdge FindNextWEdge(const OWXEdge& iEdge);
269         OWXEdge FindPreviousWEdge(const OWXEdge& iEdge);
270         FEdge *BuildSharpFEdge(FEdge *feprevious, const OWXEdge& iwe);
271
272         // GENERAL //
273         /*! Instanciate a SVertex */
274         SVertex *MakeSVertex(Vec3r& iPoint);
275         /*! Instanciate a SVertex if it hasn't been already created */
276         SVertex *MakeSVertex(Vec3r& iPoint, bool shared);
277         /*! instanciate a ViewVertex from a SVertex, if it doesn't exist yet */
278         ViewVertex *MakeViewVertex(SVertex *iSVertex);
279
280         //oldtmp values
281         //IdHashTable _hashtable;
282         //VVIdHashTable _multivertexHashTable;
283         SVertexMap _SVertexMap;
284         SShape *_pCurrentSShape;
285         ViewShape *_pCurrentVShape;
286 };
287
288 #endif  // __FREESTYLE_VIEW_EDGE_X_BUILDER_H__