Merged changes in the trunk up to revision 53146.
[blender.git] / source / blender / freestyle / intern / view_map / SteerableViewMap.h
1 //
2 //  Filename         : SteerbaleViewMap.h
3 //  Author(s)        : Stephane Grabli
4 //  Purpose          : Convenient access to the steerable ViewMap
5 //                     to which any element of the ViewMap belongs to.
6 //  Date of creation : 01/07/2003
7 //
8 ///////////////////////////////////////////////////////////////////////////////
9
10
11 //
12 //  Copyright (C) : Please refer to the COPYRIGHT file distributed 
13 //   with this source distribution. 
14 //
15 //  This program is free software; you can redistribute it and/or
16 //  modify it under the terms of the GNU General Public License
17 //  as published by the Free Software Foundation; either version 2
18 //  of the License, or (at your option) any later version.
19 //
20 //  This program is distributed in the hope that it will be useful,
21 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
22 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23 //  GNU General Public License for more details.
24 //
25 //  You should have received a copy of the GNU General Public License
26 //  along with this program; if not, write to the Free Software
27 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
28 //
29 ///////////////////////////////////////////////////////////////////////////////
30 #ifndef  STEERABLEVIEWMAP_H
31 # define STEERABLEVIEWMAP_H
32  
33 #include <map>
34 #include "../system/FreestyleConfig.h"
35 #include "../geometry/Geom.h"
36 using namespace Geometry;
37
38 using namespace std;
39
40 class FEdge;
41 class ImagePyramid;
42 class GrayImage;
43 /*! This class checks for every FEdge in which steerable 
44  *  it belongs and stores the mapping allowing to retrieve 
45  *  this information from the FEdge Id 
46  */
47 class LIB_VIEW_MAP_EXPORT SteerableViewMap{
48 protected:
49   map<unsigned int, double* > _mapping; // for each vector the list of nbOrientations weigths corresponding to its contributions to the nbOrientations directional maps
50   unsigned _nbOrientations;
51   ImagePyramid **_imagesPyramids; // the pyramids of images storing the different SVM
52
53   // internal
54   double _bound; // cos(Pi/N)
55   vector<Vec2d> _directions;
56
57 public:
58   SteerableViewMap(unsigned int nbOrientations = 4);
59   SteerableViewMap(const SteerableViewMap& iBrother);
60   virtual ~SteerableViewMap();
61
62   /*! Resets everything */
63   virtual void Reset();
64
65   /*! Adds a FEdge to steerable VM.
66    *  Returns the nbOrientations weigths corresponding to 
67    *  the FEdge contributions to the nbOrientations directional maps.
68    */
69   double* AddFEdge(FEdge *iFEdge);
70
71   /*! Compute the weight of direction dir for orientation iNOrientation */
72   double ComputeWeight(const Vec2d& dir, unsigned iNOrientation);
73
74   /*! Returns the number of the SVM to which a direction belongs 
75    *  to.
76    *  \param dir
77    *    The direction
78    */
79   unsigned getSVMNumber(const Vec2f& dir);
80
81   /*! Returns the number of the SVM to which a FEdge belongs 
82    *  most.
83    *  \param id
84    *    The First element of the Id struct of the FEdge 
85    *    we're intersted in.
86    */
87   unsigned getSVMNumber(unsigned id);
88
89   /*! Builds _nbOrientations+1 pyramids of images from the _nbOrientations+1 base images 
90    *  of the steerable viewmap.
91    *  \param steerableBases
92    *    The _nbOrientations+1 images constituing the basis for the steerable
93    *    pyramid.
94    *  \param copy
95    *    If false, the data is not duplicated, and Canvas deals
96    *    with the memory management of these _nbOrientations+1 images. If true, data 
97    *    is copied, and it's up to the caller to delete the images.
98    *  \params iNbLevels
99    *    The number of levels desired for each pyramid.
100    *    If iNbLevels == 0, the complete pyramid is built.
101    *  \param iSigma
102    *    The sigma that will be used for the gaussian blur
103    */
104   void buildImagesPyramids(GrayImage **steerableBases, bool copy = false, unsigned iNbLevels=4, float iSigma = 1.f);
105
106   /*! Reads a pixel value in one of the VewMap density steerable pyramids.
107    *  Returns a value between 0 and 1.
108    *  \param iOrientation
109    *    the number telling which orientation we need to check.
110    *    There are _nbOrientations+1 oriented ViewMaps:
111    *    0 -> the ViewMap containing every horizontal lines
112    *    1 -> the ViewMap containing every lines whose orientation is around PI/4
113    *    2 -> the ViewMap containing every vertical lines
114    *    3 -> the ViewMap containing every lines whose orientation is around 3PI/4
115    *    4 -> the complete ViewMap
116    *  \param iLevel
117    *    The level of the pyramid we want to read
118    *  \param x
119    *    The abscissa of the desired pixel specified in level0 coordinate 
120    *    system. The origin is the lower left corner.
121    *  \param y
122    *    The ordinate of the desired pixel specified in level0 coordinate 
123    *    system. The origin is the lower left corner.
124    */
125   float readSteerableViewMapPixel(unsigned iOrientation, int iLevel, int x, int y);
126
127   /*! Reads a pixel in the one of the level of the 
128    *  pyramid containing the images of the complete 
129    *  ViewMap.
130    *  Returns a value between 0 and 1.
131    *  Equivalent to : readSteerableViewMapPixel(nbOrientations, x,y)
132    */
133   float readCompleteViewMapPixel(int iLevel, int x, int y);
134
135   /*! Returns the number of levels in the pyramids */
136   unsigned int getNumberOfPyramidLevels() const;
137   
138   /*! Returns the number of orientations */
139   unsigned int getNumberOfOrientations() const{
140     return _nbOrientations;
141   }
142
143   /*! for debug purposes */
144   void saveSteerableViewMap() const ;
145
146 protected:
147   void Clear();
148   void Build();
149
150
151 };
152
153 #endif // STEERABLEVIEWMAP_H