forked from bartvdbraak/blender
final fix for Sensor Fit (AUTO, HOR, VERT) in panorama lens - patch by Brecht Van Lommel and me
This commit is contained in:
parent
08d5bad60d
commit
f403ca34c7
@ -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
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user