Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht@blender.org>2021-10-11 21:05:25 +0300
committerBrecht Van Lommel <brecht@blender.org>2021-10-15 19:25:45 +0300
commitb66b3f547c43e841a7d5da0ecb2c911628339f56 (patch)
treedf74d49977ea460f45086340a3392569387a560f /intern/cycles
parent7bf9c70b1402ba8d11889ea1adaca688bc58bb21 (diff)
Fix T92032: Cycles panoramic cameras do not support shift
Diffstat (limited to 'intern/cycles')
-rw-r--r--intern/cycles/blender/blender_camera.cpp57
1 files changed, 43 insertions, 14 deletions
diff --git a/intern/cycles/blender/blender_camera.cpp b/intern/cycles/blender/blender_camera.cpp
index 93f19b73f53..52acc2573f5 100644
--- a/intern/cycles/blender/blender_camera.cpp
+++ b/intern/cycles/blender/blender_camera.cpp
@@ -80,8 +80,9 @@ struct BlenderCamera {
int render_height;
BoundBox2D border;
- BoundBox2D pano_viewplane;
BoundBox2D viewport_camera_border;
+ BoundBox2D pano_viewplane;
+ float pano_aspectratio;
float passepartout_alpha;
@@ -123,10 +124,11 @@ static void blender_camera_init(BlenderCamera *bcam, BL::RenderSettings &b_rende
bcam->motion_position = Camera::MOTION_POSITION_CENTER;
bcam->border.right = 1.0f;
bcam->border.top = 1.0f;
- bcam->pano_viewplane.right = 1.0f;
- bcam->pano_viewplane.top = 1.0f;
bcam->viewport_camera_border.right = 1.0f;
bcam->viewport_camera_border.top = 1.0f;
+ bcam->pano_viewplane.right = 1.0f;
+ bcam->pano_viewplane.top = 1.0f;
+ bcam->pano_aspectratio = 0.0f;
bcam->passepartout_alpha = 0.5f;
bcam->offscreen_dicing_scale = 1.0f;
bcam->matrix = transform_identity();
@@ -358,9 +360,21 @@ static void blender_camera_viewplane(BlenderCamera *bcam,
}
if (bcam->type == CAMERA_PANORAMA) {
- /* set viewplane */
+ /* Set viewplane for panoramic camera. */
if (viewplane != NULL) {
*viewplane = bcam->pano_viewplane;
+
+ /* Modify viewplane for camera shift. */
+ const float shift_factor = (bcam->pano_aspectratio == 0.0f) ?
+ 1.0f :
+ *aspectratio / bcam->pano_aspectratio;
+ const float dx = bcam->shift.x * shift_factor;
+ const float dy = bcam->shift.y * shift_factor;
+
+ viewplane->left += dx;
+ viewplane->right += dx;
+ viewplane->bottom += dy;
+ viewplane->top += dy;
}
}
else {
@@ -375,8 +389,8 @@ static void blender_camera_viewplane(BlenderCamera *bcam,
*viewplane = (*viewplane) * bcam->zoom;
/* modify viewplane with camera shift and 3d camera view offset */
- float dx = 2.0f * (*aspectratio * bcam->shift.x + bcam->offset.x * xaspect * 2.0f);
- float dy = 2.0f * (*aspectratio * bcam->shift.y + bcam->offset.y * yaspect * 2.0f);
+ const float dx = 2.0f * (*aspectratio * bcam->shift.x + bcam->offset.x * xaspect * 2.0f);
+ const float dy = 2.0f * (*aspectratio * bcam->shift.y + bcam->offset.y * yaspect * 2.0f);
viewplane->left += dx;
viewplane->right += dx;
@@ -652,7 +666,8 @@ static void blender_camera_view_subset(BL::RenderEngine &b_engine,
int width,
int height,
BoundBox2D *view_box,
- BoundBox2D *cam_box);
+ BoundBox2D *cam_box,
+ float *view_aspect);
static void blender_camera_from_view(BlenderCamera *bcam,
BL::RenderEngine &b_engine,
@@ -682,6 +697,7 @@ static void blender_camera_from_view(BlenderCamera *bcam,
if (!skip_panorama && bcam->type == CAMERA_PANORAMA) {
/* in panorama camera view, we map viewplane to camera border */
BoundBox2D view_box, cam_box;
+ float view_aspect;
BL::RenderSettings b_render_settings(b_scene.render());
blender_camera_view_subset(b_engine,
@@ -693,9 +709,11 @@ static void blender_camera_from_view(BlenderCamera *bcam,
width,
height,
&view_box,
- &cam_box);
+ &cam_box,
+ &view_aspect);
bcam->pano_viewplane = view_box.make_relative_to(cam_box);
+ bcam->pano_aspectratio = view_aspect;
}
else {
/* magic zoom formula */
@@ -743,17 +761,18 @@ static void blender_camera_view_subset(BL::RenderEngine &b_engine,
int width,
int height,
BoundBox2D *view_box,
- BoundBox2D *cam_box)
+ BoundBox2D *cam_box,
+ float *view_aspect)
{
BoundBox2D cam, view;
- float view_aspect, cam_aspect, sensor_size;
+ float cam_aspect, sensor_size;
/* Get viewport viewplane. */
BlenderCamera view_bcam;
blender_camera_init(&view_bcam, b_render);
blender_camera_from_view(&view_bcam, b_engine, b_scene, b_v3d, b_rv3d, width, height, true);
- blender_camera_viewplane(&view_bcam, width, height, &view, &view_aspect, &sensor_size);
+ blender_camera_viewplane(&view_bcam, width, height, &view, view_aspect, &sensor_size);
/* Get camera viewplane. */
BlenderCamera cam_bcam;
@@ -768,7 +787,7 @@ static void blender_camera_view_subset(BL::RenderEngine &b_engine,
&cam_bcam, cam_bcam.full_width, cam_bcam.full_height, &cam, &cam_aspect, &sensor_size);
/* Return */
- *view_box = view * (1.0f / view_aspect);
+ *view_box = view * (1.0f / *view_aspect);
*cam_box = cam * (1.0f / cam_aspect);
}
@@ -785,8 +804,18 @@ static void blender_camera_border_subset(BL::RenderEngine &b_engine,
{
/* Determine camera viewport subset. */
BoundBox2D view_box, cam_box;
- blender_camera_view_subset(
- b_engine, b_render, b_scene, b_ob, b_v3d, b_rv3d, width, height, &view_box, &cam_box);
+ float view_aspect;
+ blender_camera_view_subset(b_engine,
+ b_render,
+ b_scene,
+ b_ob,
+ b_v3d,
+ b_rv3d,
+ width,
+ height,
+ &view_box,
+ &cam_box,
+ &view_aspect);
/* Determine viewport subset matching given border. */
cam_box = cam_box.make_relative_to(view_box);