Sculpt: Invert Scrape to Fill
[blender.git] / intern / cycles / render / camera.h
1 /*
2  * Copyright 2011-2013 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef __CAMERA_H__
18 #define __CAMERA_H__
19
20 #include "kernel/kernel_types.h"
21
22 #include "graph/node.h"
23
24 #include "util/util_array.h"
25 #include "util/util_boundbox.h"
26 #include "util/util_projection.h"
27 #include "util/util_transform.h"
28 #include "util/util_types.h"
29
30 CCL_NAMESPACE_BEGIN
31
32 class Device;
33 class DeviceScene;
34 class Scene;
35
36 /* Camera
37  *
38  * The camera parameters are quite standard, tested to be both compatible with
39  * Renderman, and Blender after remapping.
40  */
41
42 class Camera : public Node {
43  public:
44   NODE_DECLARE
45
46   /* Specifies an offset for the shutter's time interval. */
47   enum MotionPosition {
48     /* Shutter opens at the current frame. */
49     MOTION_POSITION_START = 0,
50     /* Shutter is fully open at the current frame. */
51     MOTION_POSITION_CENTER = 1,
52     /* Shutter closes at the current frame. */
53     MOTION_POSITION_END = 2,
54
55     MOTION_NUM_POSITIONS,
56   };
57
58   /* Specifies rolling shutter effect. */
59   enum RollingShutterType {
60     /* No rolling shutter effect. */
61     ROLLING_SHUTTER_NONE = 0,
62     /* Sensor is being scanned vertically from top to bottom. */
63     ROLLING_SHUTTER_TOP = 1,
64
65     ROLLING_SHUTTER_NUM_TYPES,
66   };
67
68   /* Stereo Type */
69   enum StereoEye {
70     STEREO_NONE,
71     STEREO_LEFT,
72     STEREO_RIGHT,
73   };
74
75   /* motion blur */
76   float shuttertime;
77   MotionPosition motion_position;
78   array<float> shutter_curve;
79   size_t shutter_table_offset;
80
81   /* ** Rolling shutter effect. ** */
82   /* Defines rolling shutter effect type. */
83   RollingShutterType rolling_shutter_type;
84   /* Specifies exposure time of scanlines when using
85    * rolling shutter effect.
86    */
87   float rolling_shutter_duration;
88
89   /* depth of field */
90   float focaldistance;
91   float aperturesize;
92   uint blades;
93   float bladesrotation;
94
95   /* type */
96   CameraType type;
97   float fov;
98
99   /* panorama */
100   PanoramaType panorama_type;
101   float fisheye_fov;
102   float fisheye_lens;
103   float latitude_min;
104   float latitude_max;
105   float longitude_min;
106   float longitude_max;
107
108   /* panorama stereo */
109   StereoEye stereo_eye;
110   bool use_spherical_stereo;
111   float interocular_distance;
112   float convergence_distance;
113   bool use_pole_merge;
114   float pole_merge_angle_from;
115   float pole_merge_angle_to;
116
117   /* anamorphic lens bokeh */
118   float aperture_ratio;
119
120   /* sensor */
121   float sensorwidth;
122   float sensorheight;
123
124   /* clipping */
125   float nearclip;
126   float farclip;
127
128   /* screen */
129   int width, height;
130   int resolution;
131   BoundBox2D viewplane;
132   /* width and height change during preview, so we need these for calculating dice rates. */
133   int full_width, full_height;
134   /* controls how fast the dicing rate falls off for geometry out side of view */
135   float offscreen_dicing_scale;
136
137   /* border */
138   BoundBox2D border;
139   BoundBox2D viewport_camera_border;
140
141   /* transformation */
142   Transform matrix;
143
144   /* motion */
145   array<Transform> motion;
146   bool use_perspective_motion;
147   float fov_pre, fov_post;
148
149   /* computed camera parameters */
150   ProjectionTransform screentoworld;
151   ProjectionTransform rastertoworld;
152   ProjectionTransform ndctoworld;
153   Transform cameratoworld;
154
155   ProjectionTransform worldtoraster;
156   ProjectionTransform worldtoscreen;
157   ProjectionTransform worldtondc;
158   Transform worldtocamera;
159
160   ProjectionTransform rastertocamera;
161   ProjectionTransform cameratoraster;
162
163   ProjectionTransform full_rastertocamera;
164
165   float3 dx;
166   float3 dy;
167
168   float3 full_dx;
169   float3 full_dy;
170
171   float3 frustum_right_normal;
172   float3 frustum_top_normal;
173
174   /* update */
175   bool need_update;
176   bool need_device_update;
177   bool need_flags_update;
178   int previous_need_motion;
179
180   /* Kernel camera data, copied here for dicing. */
181   KernelCamera kernel_camera;
182   array<DecomposedTransform> kernel_camera_motion;
183
184   /* functions */
185   Camera();
186   ~Camera();
187
188   void compute_auto_viewplane();
189
190   void update(Scene *scene);
191
192   void device_update(Device *device, DeviceScene *dscene, Scene *scene);
193   void device_update_volume(Device *device, DeviceScene *dscene, Scene *scene);
194   void device_free(Device *device, DeviceScene *dscene, Scene *scene);
195
196   bool modified(const Camera &cam);
197   bool motion_modified(const Camera &cam);
198   void tag_update();
199
200   /* Public utility functions. */
201   BoundBox viewplane_bounds_get();
202
203   /* Calculates the width of a pixel at point in world space. */
204   float world_to_raster_size(float3 P);
205
206   /* Motion blur. */
207   float motion_time(int step) const;
208   int motion_step(float time) const;
209   bool use_motion() const;
210
211  private:
212   /* Private utility functions. */
213   float3 transform_raster_to_world(float raster_x, float raster_y);
214 };
215
216 CCL_NAMESPACE_END
217
218 #endif /* __CAMERA_H__ */