final fix for Sensor Fit (AUTO, HOR, VERT) in panorama lens - patch by Brecht Van Lommel and me

This commit is contained in:
Dalai Felinto 2012-11-23 02:10:13 +00:00
parent 08d5bad60d
commit f403ca34c7
2 changed files with 50 additions and 27 deletions

@ -56,13 +56,16 @@ struct BlenderCamera {
float sensor_width; float sensor_width;
float sensor_height; float sensor_height;
int full_width;
int full_height;
BoundBox2D border; BoundBox2D border;
BoundBox2D pano_viewplane; BoundBox2D pano_viewplane;
Transform matrix; 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)); memset(bcam, 0, sizeof(BlenderCamera));
@ -77,6 +80,12 @@ static void blender_camera_init(BlenderCamera *bcam)
bcam->border.top = 1.0f; bcam->border.top = 1.0f;
bcam->pano_viewplane.right = 1.0f; bcam->pano_viewplane.right = 1.0f;
bcam->pano_viewplane.top = 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) 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 */ /* compute x/y aspect and ratio */
float xaspect, yaspect; float xaspect, yaspect;
/* sensor fitting */
bool horizontal_fit; bool horizontal_fit;
/* sensor fitting */
if(bcam->sensor_fit == BlenderCamera::AUTO) { if(bcam->sensor_fit == BlenderCamera::AUTO) {
horizontal_fit = (xratio > yratio); horizontal_fit = (xratio > yratio);
*sensor_size = bcam->sensor_width; *sensor_size = bcam->sensor_width;
@ -277,22 +285,34 @@ static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int
blender_camera_viewplane(bcam, width, height, blender_camera_viewplane(bcam, width, height,
&cam->viewplane, &aspectratio, &sensor_size); &cam->viewplane, &aspectratio, &sensor_size);
/* sensor */ /* panorama sensor */
cam->sensorwidth = bcam->sensor_width; 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->type == CAMERA_PANORAMA && if(bcam->sensor_fit == BlenderCamera::AUTO) {
(bcam->sensor_fit == BlenderCamera::AUTO && horizontal_fit = (fit_xratio > fit_yratio);
bcam->panorama_type == PANORAMA_FISHEYE_EQUISOLID) sensor_size = bcam->sensor_width;
) { }
else if(bcam->sensor_fit == BlenderCamera::HORIZONTAL) {
horizontal_fit = true;
sensor_size = bcam->sensor_width;
}
else if(bcam->sensor_fit == BlenderCamera::VERTICAL) {
horizontal_fit = false;
sensor_size = bcam->sensor_height;
}
float sensor_aspectratio = bcam->pano_viewplane.width() / if(horizontal_fit) {
(bcam->pano_viewplane.height() * cam->sensorwidth = sensor_size;
(aspectratio)); cam->sensorheight = sensor_size * fit_yratio / fit_xratio;
}
cam->sensorheight = bcam->sensor_width * sensor_aspectratio; else {
} cam->sensorwidth = sensor_size * fit_xratio / fit_yratio;
else { cam->sensorheight = sensor_size;
cam->sensorheight = bcam->sensor_height; }
} }
/* clipping distances */ /* clipping distances */
@ -334,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) void BlenderSync::sync_camera(BL::Object b_override, int width, int height)
{ {
BlenderCamera bcam; BlenderCamera bcam;
blender_camera_init(&bcam); blender_camera_init(&bcam, b_scene);
/* pixel aspect */ /* pixel aspect */
BL::RenderSettings r = b_scene.render(); BL::RenderSettings r = b_scene.render();
@ -455,7 +475,7 @@ static void blender_camera_view_subset(BL::Scene b_scene, BL::Object b_ob, BL::S
/* get viewport viewplane */ /* get viewport viewplane */
BlenderCamera view_bcam; 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_from_view(&view_bcam, b_scene, b_v3d, b_rv3d, width, height, true);
blender_camera_viewplane(&view_bcam, width, height, blender_camera_viewplane(&view_bcam, width, height,
@ -463,13 +483,10 @@ static void blender_camera_view_subset(BL::Scene b_scene, BL::Object b_ob, BL::S
/* get camera viewplane */ /* get camera viewplane */
BlenderCamera cam_bcam; BlenderCamera cam_bcam;
blender_camera_init(&cam_bcam); blender_camera_init(&cam_bcam, b_scene);
blender_camera_from_object(&cam_bcam, b_ob, true); blender_camera_from_object(&cam_bcam, b_ob, true);
width = (int)(r.resolution_x()*r.resolution_percentage()/100); blender_camera_viewplane(&cam_bcam, cam_bcam.full_width, cam_bcam.full_height,
height = (int)(r.resolution_y()*r.resolution_percentage()/100);
blender_camera_viewplane(&cam_bcam, width, height,
&cam, &cam_aspect, &sensor_size); &cam, &cam_aspect, &sensor_size);
/* return */ /* return */
@ -527,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) void BlenderSync::sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height)
{ {
BlenderCamera bcam; 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_from_view(&bcam, b_scene, b_v3d, b_rv3d, width, height);
blender_camera_border(&bcam, b_scene, b_v3d, b_rv3d, width, height); blender_camera_border(&bcam, b_scene, b_v3d, b_rv3d, width, height);

@ -182,9 +182,15 @@ public:
bottom == other.bottom && top == other.top); bottom == other.bottom && top == other.top);
} }
float width() {return right - left;} float width()
{
return right - left;
}
float height() {return bottom - top;} float height()
{
return top - bottom;
}
BoundBox2D operator*(float f) const BoundBox2D operator*(float f) const
{ {