diff options
author | Brecht Van Lommel <brecht@blender.org> | 2021-10-24 15:19:19 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2021-10-26 16:36:39 +0300 |
commit | d7d40745fa09061a3117bd3669c5a46bbf611eae (patch) | |
tree | 8dbaca086ecbb09aad62c25e9ece66332fe79af3 /intern/cycles/scene/camera.h | |
parent | b698fe1e047e56e8ed67ba47464c0017d9c50eea (diff) |
Cycles: changes to source code folders structure
* Split render/ into scene/ and session/. The scene/ folder now contains the
scene and its nodes. The session/ folder contains the render session and
associated data structures like drivers and render buffers.
* Move top level kernel headers into new folders kernel/camera/, kernel/film/,
kernel/light/, kernel/sample/, kernel/util/
* Move integrator related kernel headers into kernel/integrator/
* Move OSL shaders from kernel/shaders/ to kernel/osl/shaders/
For patches and branches, git merge and rebase should be able to detect the
renames and move over code to the right file.
Diffstat (limited to 'intern/cycles/scene/camera.h')
-rw-r--r-- | intern/cycles/scene/camera.h | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/intern/cycles/scene/camera.h b/intern/cycles/scene/camera.h new file mode 100644 index 00000000000..cb8ecac1a7e --- /dev/null +++ b/intern/cycles/scene/camera.h @@ -0,0 +1,236 @@ +/* + * Copyright 2011-2013 Blender Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CAMERA_H__ +#define __CAMERA_H__ + +#include "kernel/kernel_types.h" + +#include "graph/node.h" + +#include "util/util_array.h" +#include "util/util_boundbox.h" +#include "util/util_projection.h" +#include "util/util_transform.h" +#include "util/util_types.h" + +CCL_NAMESPACE_BEGIN + +class Device; +class DeviceScene; +class Scene; + +/* Camera + * + * The camera parameters are quite standard, tested to be both compatible with + * Renderman, and Blender after remapping. + */ + +class Camera : public Node { + public: + NODE_DECLARE + + /* Specifies an offset for the shutter's time interval. */ + enum MotionPosition { + /* Shutter opens at the current frame. */ + MOTION_POSITION_START = 0, + /* Shutter is fully open at the current frame. */ + MOTION_POSITION_CENTER = 1, + /* Shutter closes at the current frame. */ + MOTION_POSITION_END = 2, + + MOTION_NUM_POSITIONS, + }; + + /* Specifies rolling shutter effect. */ + enum RollingShutterType { + /* No rolling shutter effect. */ + ROLLING_SHUTTER_NONE = 0, + /* Sensor is being scanned vertically from top to bottom. */ + ROLLING_SHUTTER_TOP = 1, + + ROLLING_SHUTTER_NUM_TYPES, + }; + + /* Stereo Type */ + enum StereoEye { + STEREO_NONE, + STEREO_LEFT, + STEREO_RIGHT, + }; + + /* motion blur */ + NODE_SOCKET_API(float, shuttertime) + NODE_SOCKET_API(MotionPosition, motion_position) + NODE_SOCKET_API_ARRAY(array<float>, shutter_curve) + size_t shutter_table_offset; + + /* ** Rolling shutter effect. ** */ + /* Defines rolling shutter effect type. */ + NODE_SOCKET_API(RollingShutterType, rolling_shutter_type) + /* Specifies exposure time of scan-lines when using + * rolling shutter effect. + */ + NODE_SOCKET_API(float, rolling_shutter_duration) + + /* depth of field */ + NODE_SOCKET_API(float, focaldistance) + NODE_SOCKET_API(float, aperturesize) + NODE_SOCKET_API(uint, blades) + NODE_SOCKET_API(float, bladesrotation) + + /* type */ + NODE_SOCKET_API(CameraType, camera_type) + NODE_SOCKET_API(float, fov) + + /* panorama */ + NODE_SOCKET_API(PanoramaType, panorama_type) + NODE_SOCKET_API(float, fisheye_fov) + NODE_SOCKET_API(float, fisheye_lens) + NODE_SOCKET_API(float, latitude_min) + NODE_SOCKET_API(float, latitude_max) + NODE_SOCKET_API(float, longitude_min) + NODE_SOCKET_API(float, longitude_max) + + /* panorama stereo */ + NODE_SOCKET_API(StereoEye, stereo_eye) + NODE_SOCKET_API(bool, use_spherical_stereo) + NODE_SOCKET_API(float, interocular_distance) + NODE_SOCKET_API(float, convergence_distance) + NODE_SOCKET_API(bool, use_pole_merge) + NODE_SOCKET_API(float, pole_merge_angle_from) + NODE_SOCKET_API(float, pole_merge_angle_to) + + /* anamorphic lens bokeh */ + NODE_SOCKET_API(float, aperture_ratio) + + /* sensor */ + NODE_SOCKET_API(float, sensorwidth) + NODE_SOCKET_API(float, sensorheight) + + /* clipping */ + NODE_SOCKET_API(float, nearclip) + NODE_SOCKET_API(float, farclip) + + /* screen */ + BoundBox2D viewplane; + NODE_SOCKET_API_STRUCT_MEMBER(float, viewplane, left) + NODE_SOCKET_API_STRUCT_MEMBER(float, viewplane, right) + NODE_SOCKET_API_STRUCT_MEMBER(float, viewplane, bottom) + NODE_SOCKET_API_STRUCT_MEMBER(float, viewplane, top) + + /* width and height change during preview, so we need these for calculating dice rates. */ + NODE_SOCKET_API(int, full_width) + NODE_SOCKET_API(int, full_height) + /* controls how fast the dicing rate falls off for geometry out side of view */ + NODE_SOCKET_API(float, offscreen_dicing_scale) + + /* border */ + BoundBox2D border; + NODE_SOCKET_API_STRUCT_MEMBER(float, border, left) + NODE_SOCKET_API_STRUCT_MEMBER(float, border, right) + NODE_SOCKET_API_STRUCT_MEMBER(float, border, bottom) + NODE_SOCKET_API_STRUCT_MEMBER(float, border, top) + + BoundBox2D viewport_camera_border; + NODE_SOCKET_API_STRUCT_MEMBER(float, viewport_camera_border, left) + NODE_SOCKET_API_STRUCT_MEMBER(float, viewport_camera_border, right) + NODE_SOCKET_API_STRUCT_MEMBER(float, viewport_camera_border, bottom) + NODE_SOCKET_API_STRUCT_MEMBER(float, viewport_camera_border, top) + + /* transformation */ + NODE_SOCKET_API(Transform, matrix) + + /* motion */ + NODE_SOCKET_API_ARRAY(array<Transform>, motion) + NODE_SOCKET_API(bool, use_perspective_motion) + NODE_SOCKET_API(float, fov_pre) + NODE_SOCKET_API(float, fov_post) + + /* computed camera parameters */ + ProjectionTransform screentoworld; + ProjectionTransform rastertoworld; + ProjectionTransform ndctoworld; + Transform cameratoworld; + + ProjectionTransform worldtoraster; + ProjectionTransform worldtoscreen; + ProjectionTransform worldtondc; + Transform worldtocamera; + + ProjectionTransform rastertocamera; + ProjectionTransform cameratoraster; + + ProjectionTransform full_rastertocamera; + + float3 dx; + float3 dy; + + float3 full_dx; + float3 full_dy; + + float3 frustum_right_normal; + float3 frustum_top_normal; + float3 frustum_left_normal; + float3 frustum_bottom_normal; + + /* update */ + bool need_device_update; + bool need_flags_update; + int previous_need_motion; + + /* Kernel camera data, copied here for dicing. */ + KernelCamera kernel_camera; + array<DecomposedTransform> kernel_camera_motion; + + private: + int width; + int height; + + public: + /* functions */ + Camera(); + ~Camera(); + + void compute_auto_viewplane(); + + void update(Scene *scene); + + void device_update(Device *device, DeviceScene *dscene, Scene *scene); + void device_update_volume(Device *device, DeviceScene *dscene, Scene *scene); + void device_free(Device *device, DeviceScene *dscene, Scene *scene); + + /* Public utility functions. */ + BoundBox viewplane_bounds_get(); + + /* Calculates the width of a pixel at point in world space. */ + float world_to_raster_size(float3 P); + + /* Motion blur. */ + float motion_time(int step) const; + int motion_step(float time) const; + bool use_motion() const; + + void set_screen_size(int width_, int height_); + + private: + /* Private utility functions. */ + float3 transform_raster_to_world(float raster_x, float raster_y); +}; + +CCL_NAMESPACE_END + +#endif /* __CAMERA_H__ */ |