code cleanup: spelling
[blender.git] / source / blender / freestyle / intern / view_map / SteerableViewMap.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  * ***** END GPL LICENSE BLOCK *****
19  */
20
21 #ifndef __FREESTYLE_STEERABLE_VIEW_MAP_H__
22 #define __FREESTYLE_STEERABLE_VIEW_MAP_H__
23
24 /** \file blender/freestyle/intern/view_map/SteerableViewMap.h
25  *  \ingroup freestyle
26  *  \brief Convenient access to the steerable ViewMap to which any element of the ViewMap belongs to.
27  *  \author Stephane Grabli
28  *  \date 01/07/2003
29  */
30
31 #include <map>
32
33 #include "../geometry/Geom.h"
34
35 #include "../system/FreestyleConfig.h"
36
37 #ifdef WITH_CXX_GUARDEDALLOC
38 #include "MEM_guardedalloc.h"
39 #endif
40
41 using namespace std;
42
43 namespace Freestyle {
44
45 using namespace Geometry;
46
47 class FEdge;
48 class ImagePyramid;
49 class GrayImage;
50
51 /*! This class checks for every FEdge in which steerable it belongs and stores the mapping allowing to retrieve 
52  *  this information from the FEdge Id.
53  */
54 class LIB_VIEW_MAP_EXPORT SteerableViewMap
55 {
56 protected:
57         // for each vector the list of nbOrientations weigths corresponding to its contributions
58         // to the nbOrientations directional maps
59         map<unsigned int, double*> _mapping;
60         unsigned _nbOrientations;
61         ImagePyramid **_imagesPyramids; // the pyramids of images storing the different SVM
62
63         // internal
64         double _bound; // cos(Pi/N)
65         vector<Vec2d> _directions;
66
67 public:
68         SteerableViewMap(unsigned int nbOrientations = 4);
69         SteerableViewMap(const SteerableViewMap& iBrother);
70         virtual ~SteerableViewMap();
71
72         /*! Resets everything */
73         virtual void Reset();
74
75         /*! Adds a FEdge to steerable VM.
76          *  Returns the nbOrientations weigths corresponding to the FEdge contributions to the nbOrientations
77          *  directional maps.
78          */
79         double *AddFEdge(FEdge *iFEdge);
80
81         /*! Compute the weight of direction dir for orientation iNOrientation */
82         double ComputeWeight(const Vec2d& dir, unsigned iNOrientation);
83
84         /*! Returns the number of the SVM to which a direction belongs to.
85          *  \param dir
86          *    The direction
87          */
88         unsigned getSVMNumber(const Vec2f& dir);
89
90         /*! Returns the number of the SVM to which a FEdge belongs most.
91          *  \param id
92          *    The First element of the Id struct of the FEdge we're interested in.
93          */
94         unsigned getSVMNumber(unsigned id);
95
96         /*! Builds _nbOrientations+1 pyramids of images from the _nbOrientations+1 base images of the steerable viewmap.
97          *  \param steerableBases
98          *    The _nbOrientations+1 images constituting the basis for the steerable pyramid.
99          *  \param copy
100          *    If false, the data is not duplicated, and Canvas deals with the memory management of these
101          *    _nbOrientations+1 images. If true, data is copied, and it's up to the caller to delete the images.
102          *  \param iNbLevels
103          *    The number of levels desired for each pyramid.
104          *    If iNbLevels == 0, the complete pyramid is built.
105          *  \param iSigma
106          *    The sigma that will be used for the gaussian blur
107          */
108         void buildImagesPyramids(GrayImage **steerableBases, bool copy = false, unsigned iNbLevels = 4,
109                                  float iSigma = 1.0f);
110
111         /*! Reads a pixel value in one of the VewMap density steerable pyramids.
112          *  Returns a value between 0 and 1.
113          *  \param iOrientation
114          *    the number telling which orientation we need to check.
115          *    There are _nbOrientations+1 oriented ViewMaps:
116          *    0 -> the ViewMap containing every horizontal lines
117          *    1 -> the ViewMap containing every lines whose orientation is around PI/4
118          *    2 -> the ViewMap containing every vertical lines
119          *    3 -> the ViewMap containing every lines whose orientation is around 3PI/4
120          *    4 -> the complete ViewMap
121          *  \param iLevel
122          *    The level of the pyramid we want to read
123          *  \param x
124          *    The abscissa of the desired pixel specified in level0 coordinate system. The origin is the lower left corner.
125          *  \param y
126          *    The ordinate of the desired pixel specified in level0 coordinate system. The origin is the lower left corner.
127          */
128         float readSteerableViewMapPixel(unsigned iOrientation, int iLevel, int x, int y);
129
130         /*! Reads a pixel in the one of the level of the pyramid containing the images of the complete ViewMap.
131          *  Returns a value between 0 and 1.
132          *  Equivalent to : readSteerableViewMapPixel(nbOrientations, x, y)
133          */
134         float readCompleteViewMapPixel(int iLevel, int x, int y);
135
136         /*! Returns the number of levels in the pyramids */
137         unsigned int getNumberOfPyramidLevels() const;
138
139         /*! Returns the number of orientations */
140         unsigned int getNumberOfOrientations() const
141         {
142                 return _nbOrientations;
143         }
144
145         /*! for debug purposes */
146         void saveSteerableViewMap() const;
147
148 protected:
149         void Clear();
150         void Build();
151
152 #ifdef WITH_CXX_GUARDEDALLOC
153         MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:SteerableViewMap")
154 #endif
155 };
156
157 } /* namespace Freestyle */
158
159 #endif // __FREESTYLE_STEERABLE_VIEW_MAP_H__