Code refactor: add ProjectionTransform separate from regular Transform.
[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_boundbox.h"
25 #include "util/util_projection.h"
26 #include "util/util_transform.h"
27 #include "util/util_types.h"
28
29 CCL_NAMESPACE_BEGIN
30
31 class Device;
32 class DeviceScene;
33 class Scene;
34
35 /* Camera
36  *
37  * The camera parameters are quite standard, tested to be both compatible with
38  * Renderman, and Blender after remapping.
39  */
40
41 class Camera : public Node {
42 public:
43         NODE_DECLARE
44
45         /* Specifies an offset for the shutter's time interval. */
46         enum MotionPosition {
47                 /* Shutter opens at the current frame. */
48                 MOTION_POSITION_START = 0,
49                 /* Shutter is fully open at the current frame. */
50                 MOTION_POSITION_CENTER = 1,
51                 /* Shutter closes at the current frame. */
52                 MOTION_POSITION_END = 2,
53
54                 MOTION_NUM_POSITIONS,
55         };
56
57         /* Specifies rolling shutter effect. */
58         enum RollingShutterType {
59                 /* No rolling shutter effect. */
60                 ROLLING_SHUTTER_NONE = 0,
61                 /* Sensor is being scanned vertically from top to bottom. */
62                 ROLLING_SHUTTER_TOP = 1,
63
64                 ROLLING_SHUTTER_NUM_TYPES,
65         };
66
67         /* Stereo Type */
68         enum StereoEye {
69                 STEREO_NONE,
70                 STEREO_LEFT,
71                 STEREO_RIGHT,
72         };
73
74         /* motion blur */
75         float shuttertime;
76         MotionPosition motion_position;
77         array<float> shutter_curve;
78         size_t shutter_table_offset;
79
80         /* ** Rolling shutter effect. ** */
81         /* Defines rolling shutter effect type. */
82         RollingShutterType rolling_shutter_type;
83         /* Specifies exposure time of scanlines when using
84          * rolling shutter effect.
85          */
86         float rolling_shutter_duration;
87
88         /* depth of field */
89         float focaldistance;
90         float aperturesize;
91         uint blades;
92         float bladesrotation;
93
94         /* type */
95         CameraType type;
96         float fov;
97
98         /* panorama */
99         PanoramaType panorama_type;
100         float fisheye_fov;
101         float fisheye_lens;
102         float latitude_min;
103         float latitude_max;
104         float longitude_min;
105         float longitude_max;
106
107         /* panorama stereo */
108         StereoEye stereo_eye;
109         bool use_spherical_stereo;
110         float interocular_distance;
111         float convergence_distance;
112         bool use_pole_merge;
113         float pole_merge_angle_from;
114         float pole_merge_angle_to;
115
116         /* anamorphic lens bokeh */
117         float aperture_ratio;
118
119         /* sensor */
120         float sensorwidth;
121         float sensorheight;
122
123         /* clipping */
124         float nearclip;
125         float farclip;
126
127         /* screen */
128         int width, height;
129         int resolution;
130         BoundBox2D viewplane;
131         /* width and height change during preview, so we need these for calculating dice rates. */
132         int full_width, full_height;
133         /* controls how fast the dicing rate falls off for geometry out side of view */
134         float offscreen_dicing_scale;
135
136         /* border */
137         BoundBox2D border;
138         BoundBox2D viewport_camera_border;
139
140         /* transformation */
141         Transform matrix;
142
143         /* motion */
144         MotionTransform motion;
145         bool use_motion, use_perspective_motion;
146         float fov_pre, fov_post;
147         PerspectiveMotionTransform perspective_motion;
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         float3 dx;
164         float3 dy;
165
166         float3 full_dx;
167         float3 full_dy;
168
169         float3 frustum_right_normal;
170         float3 frustum_top_normal;
171
172         /* update */
173         bool need_update;
174         bool need_device_update;
175         bool need_flags_update;
176         int previous_need_motion;
177
178         /* Kernel camera data, copied here for dicing. */
179         KernelCamera kernel_camera;
180
181         /* functions */
182         Camera();
183         ~Camera();
184         
185         void compute_auto_viewplane();
186
187         void update(Scene *scene);
188
189         void device_update(Device *device, DeviceScene *dscene, Scene *scene);
190         void device_update_volume(Device *device, DeviceScene *dscene, Scene *scene);
191         void device_free(Device *device, DeviceScene *dscene, Scene *scene);
192
193         bool modified(const Camera& cam);
194         bool motion_modified(const Camera& cam);
195         void tag_update();
196
197         /* Public utility functions. */
198         BoundBox viewplane_bounds_get();
199
200         /* Calculates the width of a pixel at point in world space. */
201         float world_to_raster_size(float3 P);
202
203 private:
204         /* Private utility functions. */
205         float3 transform_raster_to_world(float raster_x, float raster_y);
206 };
207
208 CCL_NAMESPACE_END
209
210 #endif /* __CAMERA_H__ */
211