Revision: 52498
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52498
Author:   dfelinto
Date:     2012-11-23 02:10:13 +0000 (Fri, 23 Nov 2012)
Log Message:
-----------
final fix for Sensor Fit (AUTO, HOR, VERT) in panorama lens - patch by Brecht 
Van Lommel and me

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_camera.cpp
    trunk/blender/intern/cycles/util/util_boundbox.h

Modified: trunk/blender/intern/cycles/blender/blender_camera.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_camera.cpp      2012-11-22 
23:19:15 UTC (rev 52497)
+++ trunk/blender/intern/cycles/blender/blender_camera.cpp      2012-11-23 
02:10:13 UTC (rev 52498)
@@ -56,13 +56,16 @@
        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 @@
        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 @@
 
        /* compute x/y aspect and ratio */
        float xaspect, yaspect;
+       bool horizontal_fit;
 
        /* sensor fitting */
-       bool horizontal_fit;
-
        if(bcam->sensor_fit == BlenderCamera::AUTO) {
                horizontal_fit = (xratio > yratio);
                *sensor_size = bcam->sensor_width;
@@ -277,23 +285,35 @@
        blender_camera_viewplane(bcam, width, height,
                &cam->viewplane, &aspectratio, &sensor_size);
 
-       /* sensor */
-       cam->sensorwidth = bcam->sensor_width;
+       /* 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->type == CAMERA_PANORAMA &&
-          (bcam->sensor_fit == BlenderCamera::AUTO &&
-               bcam->panorama_type == PANORAMA_FISHEYE_EQUISOLID)
-          ) {
+               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 if(bcam->sensor_fit == BlenderCamera::VERTICAL) {
+                       horizontal_fit = false;
+                       sensor_size = bcam->sensor_height;
+               }
 
-               float sensor_aspectratio = bcam->pano_viewplane.width() /
-                                                                 
(bcam->pano_viewplane.height() *
-                                                                 
(aspectratio));
-
-               cam->sensorheight = bcam->sensor_width * sensor_aspectratio;
+               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;
+               }
        }
-       else {
-               cam->sensorheight = bcam->sensor_height;
-       }
 
        /* clipping distances */
        cam->nearclip = bcam->nearclip;
@@ -334,7 +354,7 @@
 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();
@@ -455,7 +475,7 @@
 
        /* 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,
@@ -463,13 +483,10 @@
 
        /* 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 */
@@ -527,7 +544,7 @@
 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);
 

Modified: trunk/blender/intern/cycles/util/util_boundbox.h
===================================================================
--- trunk/blender/intern/cycles/util/util_boundbox.h    2012-11-22 23:19:15 UTC 
(rev 52497)
+++ trunk/blender/intern/cycles/util/util_boundbox.h    2012-11-23 02:10:13 UTC 
(rev 52498)
@@ -182,9 +182,15 @@
                        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
        {

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to