diff options
Diffstat (limited to 'intern/cycles/blender/blender_camera.cpp')
-rw-r--r-- | intern/cycles/blender/blender_camera.cpp | 61 |
1 files changed, 46 insertions, 15 deletions
diff --git a/intern/cycles/blender/blender_camera.cpp b/intern/cycles/blender/blender_camera.cpp index 61fe7cf254d..0cbd2a0291f 100644 --- a/intern/cycles/blender/blender_camera.cpp +++ b/intern/cycles/blender/blender_camera.cpp @@ -56,13 +56,16 @@ struct BlenderCamera { float sensor_width; float sensor_height; + int full_width; + int full_height; + BoundBox2D border; BoundBox2D pano_viewplane; Transform matrix; }; -static void blender_camera_init(BlenderCamera *bcam) +static void blender_camera_init(BlenderCamera *bcam, BL::Scene b_scene) { memset(bcam, 0, sizeof(BlenderCamera)); @@ -77,6 +80,12 @@ static void blender_camera_init(BlenderCamera *bcam) bcam->border.top = 1.0f; bcam->pano_viewplane.right = 1.0f; bcam->pano_viewplane.top = 1.0f; + + /* render resolution */ + BL::RenderSettings r = b_scene.render(); + + bcam->full_width = (int)(r.resolution_x()*r.resolution_percentage()/100); + bcam->full_height = (int)(r.resolution_y()*r.resolution_percentage()/100); } static float blender_camera_focal_distance(BL::Object b_ob, BL::Camera b_camera) @@ -207,10 +216,9 @@ static void blender_camera_viewplane(BlenderCamera *bcam, int width, int height, /* compute x/y aspect and ratio */ float xaspect, yaspect; - - /* sensor fitting */ bool horizontal_fit; + /* sensor fitting */ if(bcam->sensor_fit == BlenderCamera::AUTO) { horizontal_fit = (xratio > yratio); *sensor_size = bcam->sensor_width; @@ -277,9 +285,35 @@ static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int blender_camera_viewplane(bcam, width, height, &cam->viewplane, &aspectratio, &sensor_size); - /* sensor */ - cam->sensorwidth = bcam->sensor_width; - cam->sensorheight = bcam->sensor_height; + /* panorama sensor */ + if (bcam->type == CAMERA_PANORAMA && bcam->panorama_type == PANORAMA_FISHEYE_EQUISOLID) { + float fit_xratio = bcam->full_width*bcam->pixelaspect.x; + float fit_yratio = bcam->full_height*bcam->pixelaspect.y; + bool horizontal_fit; + float sensor_size; + + if(bcam->sensor_fit == BlenderCamera::AUTO) { + horizontal_fit = (fit_xratio > fit_yratio); + sensor_size = bcam->sensor_width; + } + else if(bcam->sensor_fit == BlenderCamera::HORIZONTAL) { + horizontal_fit = true; + sensor_size = bcam->sensor_width; + } + else { /* vertical */ + horizontal_fit = false; + sensor_size = bcam->sensor_height; + } + + if(horizontal_fit) { + cam->sensorwidth = sensor_size; + cam->sensorheight = sensor_size * fit_yratio / fit_xratio; + } + else { + cam->sensorwidth = sensor_size * fit_xratio / fit_yratio; + cam->sensorheight = sensor_size; + } + } /* clipping distances */ cam->nearclip = bcam->nearclip; @@ -320,7 +354,7 @@ static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int void BlenderSync::sync_camera(BL::Object b_override, int width, int height) { BlenderCamera bcam; - blender_camera_init(&bcam); + blender_camera_init(&bcam, b_scene); /* pixel aspect */ BL::RenderSettings r = b_scene.render(); @@ -435,13 +469,13 @@ static void blender_camera_from_view(BlenderCamera *bcam, BL::Scene b_scene, BL: static void blender_camera_view_subset(BL::Scene b_scene, BL::Object b_ob, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height, BoundBox2D *view_box, BoundBox2D *cam_box) { - BL::RenderSettings r = b_scene.render(); +// BL::RenderSettings r = b_scene.render(); /* UNUSED */ BoundBox2D cam, view; float view_aspect, cam_aspect, sensor_size; /* get viewport viewplane */ BlenderCamera view_bcam; - blender_camera_init(&view_bcam); + blender_camera_init(&view_bcam, b_scene); blender_camera_from_view(&view_bcam, b_scene, b_v3d, b_rv3d, width, height, true); blender_camera_viewplane(&view_bcam, width, height, @@ -449,13 +483,10 @@ static void blender_camera_view_subset(BL::Scene b_scene, BL::Object b_ob, BL::S /* get camera viewplane */ BlenderCamera cam_bcam; - blender_camera_init(&cam_bcam); + blender_camera_init(&cam_bcam, b_scene); blender_camera_from_object(&cam_bcam, b_ob, true); - width = (int)(r.resolution_x()*r.resolution_percentage()/100); - height = (int)(r.resolution_y()*r.resolution_percentage()/100); - - blender_camera_viewplane(&cam_bcam, width, height, + blender_camera_viewplane(&cam_bcam, cam_bcam.full_width, cam_bcam.full_height, &cam, &cam_aspect, &sensor_size); /* return */ @@ -513,7 +544,7 @@ static void blender_camera_border(BlenderCamera *bcam, BL::Scene b_scene, BL::Sp void BlenderSync::sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height) { BlenderCamera bcam; - blender_camera_init(&bcam); + blender_camera_init(&bcam, b_scene); blender_camera_from_view(&bcam, b_scene, b_v3d, b_rv3d, width, height); blender_camera_border(&bcam, b_scene, b_v3d, b_rv3d, width, height); |