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