[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51594] trunk/blender: Patch #29142: Reduce hopping when switching between perspective and orthographic on 3D view

Sergey Sharybin sergey.vfx at gmail.com
Wed Oct 24 18:15:46 CEST 2012


Revision: 51594
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51594
Author:   nazgul
Date:     2012-10-24 16:15:46 +0000 (Wed, 24 Oct 2012)
Log Message:
-----------
Patch #29142: Reduce hopping when switching between perspective and orthographic on 3D view

Patch by Yasuhiro Fujii, thanks!

Original issue was that in vases viewport's lens are different from default
value switching between perspective and orthographic projections will change
viewplane a lot, which is disorienting and annoying.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_camera.cpp
    trunk/blender/source/blender/blenkernel/intern/camera.c
    trunk/blender/source/blender/editors/include/ED_view3d.h
    trunk/blender/source/blender/editors/space_view3d/view3d_edit.c
    trunk/blender/source/blender/editors/space_view3d/view3d_view.c

Modified: trunk/blender/intern/cycles/blender/blender_camera.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_camera.cpp	2012-10-24 16:15:36 UTC (rev 51593)
+++ trunk/blender/intern/cycles/blender/blender_camera.cpp	2012-10-24 16:15:46 UTC (rev 51594)
@@ -411,8 +411,14 @@
 		bcam->farclip *= 0.5f;
 		bcam->nearclip = -bcam->farclip;
 
+		float sensor_size;
+		if(bcam->sensor_fit == BlenderCamera::VERTICAL)
+			sensor_size = bcam->sensor_height;
+		else
+			sensor_size = bcam->sensor_width;
+
 		bcam->type = CAMERA_ORTHOGRAPHIC;
-		bcam->ortho_scale = b_rv3d.view_distance();
+		bcam->ortho_scale = b_rv3d.view_distance() * sensor_size / b_v3d.lens();
 	}
 
 	bcam->zoom *= 2.0f;

Modified: trunk/blender/source/blender/blenkernel/intern/camera.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/camera.c	2012-10-24 16:15:36 UTC (rev 51593)
+++ trunk/blender/source/blender/blenkernel/intern/camera.c	2012-10-24 16:15:46 UTC (rev 51594)
@@ -262,11 +262,12 @@
 	}
 	else if (rv3d->persp == RV3D_ORTHO) {
 		/* orthographic view */
+		int sensor_size = BKE_camera_sensor_size(params->sensor_fit, params->sensor_x, params->sensor_y);
 		params->clipend *= 0.5f;    // otherwise too extreme low zbuffer quality
 		params->clipsta = -params->clipend;
 
 		params->is_ortho = TRUE;
-		params->ortho_scale = rv3d->dist;
+		params->ortho_scale = rv3d->dist * sensor_size / v3d->lens;
 		params->zoom = 2.0f;
 	}
 	else {

Modified: trunk/blender/source/blender/editors/include/ED_view3d.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_view3d.h	2012-10-24 16:15:36 UTC (rev 51593)
+++ trunk/blender/source/blender/editors/include/ED_view3d.h	2012-10-24 16:15:46 UTC (rev 51594)
@@ -295,6 +295,7 @@
 void ED_view3D_background_image_remove(struct View3D *v3d, struct BGpic *bgpic);
 void ED_view3D_background_image_clear(struct View3D *v3d);
 
+float ED_view3d_offset_distance(float mat[4][4], float ofs[3]);
 float ED_view3d_grid_scale(struct Scene *scene, struct View3D *v3d, const char **grid_unit);
 
 /* view matrix properties utilities */

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_edit.c	2012-10-24 16:15:36 UTC (rev 51593)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_edit.c	2012-10-24 16:15:46 UTC (rev 51594)
@@ -96,6 +96,7 @@
 void ED_view3d_camera_lock_init(View3D *v3d, RegionView3D *rv3d)
 {
 	if (ED_view3d_camera_lock_check(v3d, rv3d)) {
+		rv3d->dist = ED_view3d_offset_distance(v3d->camera->obmat, rv3d->ofs);
 		ED_view3d_from_object(v3d->camera, rv3d->ofs, rv3d->viewquat, &rv3d->dist, NULL);
 	}
 }
@@ -894,6 +895,7 @@
 
 			/* changed since 2.4x, use the camera view */
 			if (vod->v3d->camera) {
+				rv3d->dist = ED_view3d_offset_distance(vod->v3d->camera->obmat, rv3d->ofs);
 				ED_view3d_from_object(vod->v3d->camera, rv3d->ofs, rv3d->viewquat, &rv3d->dist, NULL);
 			}
 
@@ -3924,6 +3926,18 @@
 	return (*depth == FLT_MAX) ? 0 : 1;
 }
 
+float ED_view3d_offset_distance(float mat[4][4], float ofs[3]) {
+	float pos[4] = {0.0f, 0.0f, 0.0f, 1.0f};
+	float dir[4] = {0.0f, 0.0f, 1.0f, 0.0f};
+
+	mul_m4_v4(mat, pos);
+	add_v3_v3(pos, ofs);
+	mul_m4_v4(mat, dir);
+	normalize_v3(dir);
+
+	return dot_v3v3(pos, dir);
+}
+
 /**
  * Set the view transformation from a 4x4 matrix.
  *

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_view.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_view.c	2012-10-24 16:15:36 UTC (rev 51593)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_view.c	2012-10-24 16:15:46 UTC (rev 51594)
@@ -161,6 +161,7 @@
 	if (lens) sms.new_lens = *lens;
 
 	if (camera) {
+		sms.new_dist = ED_view3d_offset_distance(camera->obmat, ofs);
 		ED_view3d_from_object(camera, sms.new_ofs, sms.new_quat, &sms.new_dist, &sms.new_lens);
 		sms.to_camera = TRUE; /* restore view3d values in end */
 	}
@@ -185,7 +186,7 @@
 
 			/* original values */
 			if (oldcamera) {
-				sms.orig_dist = rv3d->dist;  /* below function does weird stuff with it... */
+				sms.orig_dist = ED_view3d_offset_distance(oldcamera->obmat, rv3d->ofs);
 				ED_view3d_from_object(oldcamera, sms.orig_ofs, sms.orig_quat, &sms.orig_dist, &sms.orig_lens);
 			}
 			else {




More information about the Bf-blender-cvs mailing list