svn merge ^/trunk/blender -r49947:49952
[blender.git] / source / blender / compositor / operations / COM_BokehImageOperation.h
1 /*
2  * Copyright 2011, Blender Foundation.
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  * Contributor: 
19  *              Jeroen Bakker 
20  *              Monique Dewanchand
21  */
22
23 #ifndef _COM_BokehImageOperation_h
24 #define _COM_BokehImageOperation_h
25 #include "COM_NodeOperation.h"
26
27 /**
28  * @brief The BokehImageOperation class is an operation that creates an image useful to mimic the internals
29  *of a camera.
30  *
31  * features:
32  *  - number of flaps
33  *  - angle offset of the flaps
34  *  - rounding of the flaps (also used to make a circular lens)
35  *  - simulate catadioptric
36  *  - simulate lensshift
37  *
38  * Per pixel the algorithm determines the edge of the bokeh on the same line as the center of the image and the pixel
39  * is evaluating.
40  *
41  * The edge is detected by finding the closest point on the direct line between the two nearest flap-corners.
42  * this edge is interpolated with a full circle. 
43  * Result of this edge detection is stored as the distance between the center of the image and the edge.
44  *
45  * catadioptric lenses are simulated to interpolate between the center of the image and the distance of the edge.
46  * We now have three distances:
47  *  - distance between the center of the image and the pixel to be evaluated
48  *  - distance between the center of the image and the outer-edge
49  *  - distance between the center of the image and the inner-edge
50  *
51  * With a simple compare it can be detected if the evaluated pixel is between the outer and inner edge.
52  */
53 class BokehImageOperation : public NodeOperation {
54 private:
55         /**
56          * @brief Settings of the bokeh image
57          */
58         NodeBokehImage *m_data;
59
60         /**
61          * @brief precalced center of the image
62          */
63         float m_center[2];
64         
65         /**
66          * @brief 1.0-rounding
67          */
68         float m_inverseRounding;
69         
70         /**
71          * @brief distance of a full circle lens
72          */
73         float m_circularDistance;
74         
75         /**
76          * @brief radius when the first flap starts
77          */
78         float m_flapRad;
79         
80         /**
81          * @brief radians of a single flap
82          */
83         float m_flapRadAdd;
84         
85         /**
86          * @brief should the m_data field by deleted when this operation is finished
87          */
88         bool m_deleteData;
89
90         /**
91          * @brief detemine the coordinate of a flap cornder
92          *
93          * @param r result in bokehimage space are stored [x,y]
94          * @param flapNumber the flap number to calculate
95          * @param distance the lens distance is used to simulate lens shifts
96          */
97         void detemineStartPointOfFlap(float r[2], int flapNumber, float distance);
98         
99         /**
100          * @brief Determine if a coordinate is inside the bokeh image
101          *
102          * @param distance the distance that will be used. This parameter is modified a bit to mimic lens shifts
103          * @param x the x coordinate of the pixel to evaluate
104          * @param y the y coordinate of the pixel to evaluate
105          * @return float range 0..1 0 is completely outside
106          */
107         float isInsideBokeh(float distance, float x, float y);
108 public:
109         BokehImageOperation();
110
111         /**
112          * @brief the inner loop of this program
113          */
114         void executePixel(float output[4], float x, float y, PixelSampler sampler);
115         
116         /**
117          * @brief Initialize the execution
118          */
119         void initExecution();
120         
121         /**
122          * @brief Deinitialize the execution
123          */
124         void deinitExecution();
125         
126         /**
127          * @brief determine the resolution of this operation. currently fixed at [COM_BLUR_BOKEH_PIXELS, COM_BLUR_BOKEH_PIXELS]
128          * @param resolution
129          * @param preferredResolution
130          */
131         void determineResolution(unsigned int resolution[2], unsigned int preferredResolution[2]);
132
133         /**
134          * @brief set the node data
135          * @param data
136          */
137         void setData(NodeBokehImage *data) { this->m_data = data; }
138         
139         /**
140          * @brief deleteDataOnFinish
141          *
142          * There are cases that the compositor uses this operation on its own (see defocus node)
143          * the deleteDataOnFinish must only be called when the data has been created by the compositor.
144          *It should not be called when the data has been created by the node-editor/user.
145          */
146         void deleteDataOnFinish() { this->m_deleteData = true; }
147 };
148 #endif