Merged changes in the trunk up to revision 28600.
[blender.git] / source / blender / freestyle / intern / stroke / AdvancedFunctions1D.cpp
1
2 //
3 //  Copyright (C) : Please refer to the COPYRIGHT file distributed 
4 //   with this source distribution. 
5 //
6 //  This program is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU General Public License
8 //  as published by the Free Software Foundation; either version 2
9 //  of the License, or (at your option) any later version.
10 //
11 //  This program is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 //  GNU General Public License for more details.
15 //
16 //  You should have received a copy of the GNU General Public License
17 //  along with this program; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19 //
20 ///////////////////////////////////////////////////////////////////////////////
21
22 # include "AdvancedFunctions1D.h"
23 # include "../view_map/SteerableViewMap.h"
24 # include "Canvas.h"
25
26 // FIXME
27 namespace Functions1D {
28
29   int GetSteerableViewMapDensityF1D::operator()(Interface1D& inter) {
30     SteerableViewMap * svm = Canvas::getInstance()->getSteerableViewMap();
31     Interface0DIterator it = inter.pointsBegin(_sampling);
32     Interface0DIterator itnext = it;++itnext;
33     FEdge *fe;
34     unsigned nSVM;
35     vector<float> values;
36     while(!itnext.isEnd()){
37       Interface0D& i0D = (*it);
38       Interface0D& i0Dnext = (*itnext);
39       fe = i0D.getFEdge(i0Dnext);
40       if(fe == 0){
41         cerr << "GetSteerableViewMapDensityF1D warning: no FEdge between " << i0D.getId() << " and " << i0Dnext.getId() << endl;
42         // compute the direction between these two ???
43         Vec2f dir = i0Dnext.getPoint2D()-i0D.getPoint2D();
44         nSVM = svm->getSVMNumber(dir);
45       }else{
46       nSVM = svm->getSVMNumber(fe->getId().getFirst());
47       }
48       Vec2r m((i0D.getProjectedX()+i0Dnext.getProjectedX())/2.0,
49               (i0D.getProjectedY()+i0Dnext.getProjectedY())/2.0);
50       values.push_back(svm->readSteerableViewMapPixel(nSVM,_level,(int)m[0],(int)m[1]));
51       ++it;++itnext;
52     }
53     float res, res_tmp;
54     vector<float>::iterator v = values.begin(), vend=values.end();
55     unsigned size = 1;
56     switch(_integration) {
57       case MIN:
58         res = *v;++v;
59         for (; v!=vend; ++v) {
60           res_tmp = *v;
61           if (res_tmp < res)
62                   res = res_tmp;
63         }
64         break;
65       case MAX:
66         res = *v;++v;
67         for (; v!=vend; ++v) {
68           res_tmp = *v;
69           if (res_tmp > res)
70                   res = res_tmp;
71         } 
72         break;
73       case FIRST:
74         res = *v;
75         break;
76       case LAST:
77         --vend;
78         res = *vend;
79         break;
80       case MEAN:
81       default:
82         res = *v;++v;
83         for (; v!=vend; ++v, ++size)
84           res += *v;
85         res /= (size ? size : 1);
86         break;
87     } 
88         result = res;
89         return 0;
90   }  
91
92   int GetDirectionalViewMapDensityF1D::operator()(Interface1D& inter) {
93     //soc unsigned size;
94     result = integrate(_fun, inter.pointsBegin(_sampling), inter.pointsEnd(_sampling), _integration);
95     return 0;
96   } 
97   
98   int GetCompleteViewMapDensityF1D::operator()(Interface1D& inter) {
99     //soc unsigned size;
100     Id id = inter.getId();
101     result = integrate(_fun, inter.pointsBegin(_sampling), inter.pointsEnd(_sampling), _integration);
102     return 0;
103   } 
104
105   int GetViewMapGradientNormF1D::operator()(Interface1D& inter){
106         result = integrate(_func, inter.pointsBegin(_sampling), inter.pointsEnd(_sampling), _integration);
107         return 0;
108   }
109 }
110