[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58398] trunk/blender/source/blender: patch [#36000] View lock offset (allow panning when the view is locked)

Campbell Barton ideasman42 at gmail.com
Fri Jul 19 12:54:02 CEST 2013


Revision: 58398
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58398
Author:   campbellbarton
Date:     2013-07-19 10:54:02 +0000 (Fri, 19 Jul 2013)
Log Message:
-----------
patch [#36000] View lock offset (allow panning when the view is locked)
own patch

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_view3d/view3d_edit.c
    trunk/blender/source/blender/editors/space_view3d/view3d_intern.h
    trunk/blender/source/blender/editors/space_view3d/view3d_ops.c
    trunk/blender/source/blender/editors/space_view3d/view3d_view.c
    trunk/blender/source/blender/makesdna/DNA_view3d_types.h

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_edit.c	2013-07-19 10:51:54 UTC (rev 58397)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_edit.c	2013-07-19 10:54:02 UTC (rev 58398)
@@ -1009,6 +1009,14 @@
 	return 0;
 }
 
+static int view3d_lock_poll(bContext *C)
+{
+	View3D *v3d = CTX_wm_view3d(C);
+	RegionView3D *rv3d = CTX_wm_region_view3d(C);
+
+	return ED_view3d_offset_lock_check(v3d, rv3d);
+}
+
 static int viewrotate_cancel(bContext *C, wmOperator *op)
 {
 	viewops_data_free(C, op);
@@ -1537,7 +1545,11 @@
 
 static void viewmove_apply(ViewOpsData *vod, int x, int y)
 {
-	if ((vod->rv3d->persp == RV3D_CAMOB) && !ED_view3d_camera_lock_check(vod->v3d, vod->rv3d)) {
+	if (ED_view3d_offset_lock_check(vod->v3d, vod->rv3d)) {
+		vod->rv3d->ofs_lock[0] -= ((vod->oldx - x) * 2.0f) / (float)vod->ar->winx;
+		vod->rv3d->ofs_lock[1] -= ((vod->oldy - y) * 2.0f) / (float)vod->ar->winy;
+	}
+	else if ((vod->rv3d->persp == RV3D_CAMOB) && !ED_view3d_camera_lock_check(vod->v3d, vod->rv3d)) {
 		const float zoomfac = BKE_screen_view3d_zoom_to_fac((float)vod->rv3d->camzoom) * 2.0f;
 		vod->rv3d->camdx += (vod->oldx - x) / (vod->ar->winx * zoomfac);
 		vod->rv3d->camdy += (vod->oldy - y) / (vod->ar->winy * zoomfac);
@@ -1614,8 +1626,6 @@
 {
 	ViewOpsData *vod;
 
-	VIEW3D_OP_OFS_LOCK_TEST(C, op);
-
 	/* makes op->customdata */
 	viewops_data_create(C, op, event);
 	vod = op->customdata;
@@ -2792,6 +2802,32 @@
 	ot->flag = 0;
 }
 
+static int view3d_center_lock_exec(bContext *C, wmOperator *UNUSED(op)) /* was view3d_home() in 2.4x */
+{
+	RegionView3D *rv3d = CTX_wm_region_view3d(C);
+
+	zero_v2(rv3d->ofs_lock);
+
+	WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, CTX_wm_view3d(C));
+
+	return OPERATOR_FINISHED;
+}
+
+void VIEW3D_OT_view_center_lock(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "View Lock Center";
+	ot->description = "Center the view lock offset";
+	ot->idname = "VIEW3D_OT_view_center_lock";
+
+	/* api callbacks */
+	ot->exec = view3d_center_lock_exec;
+	ot->poll = view3d_lock_poll;
+
+	/* flags */
+	ot->flag = 0;
+}
+
 /* ********************* Set render border operator ****************** */
 
 static int render_border_exec(bContext *C, wmOperator *op)

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_intern.h
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_intern.h	2013-07-19 10:51:54 UTC (rev 58397)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_intern.h	2013-07-19 10:54:02 UTC (rev 58398)
@@ -89,6 +89,7 @@
 void VIEW3D_OT_view_center_cursor(struct wmOperatorType *ot);
 void VIEW3D_OT_view_center_pick(struct wmOperatorType *ot);
 void VIEW3D_OT_view_center_camera(struct wmOperatorType *ot);
+void VIEW3D_OT_view_center_lock(struct wmOperatorType *ot);
 void VIEW3D_OT_view_pan(struct wmOperatorType *ot);
 void VIEW3D_OT_view_persportho(struct wmOperatorType *ot);
 void VIEW3D_OT_background_image_add(struct wmOperatorType *ot);

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_ops.c	2013-07-19 10:51:54 UTC (rev 58397)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_ops.c	2013-07-19 10:54:02 UTC (rev 58398)
@@ -148,6 +148,7 @@
 	WM_operatortype_append(VIEW3D_OT_view_center_cursor);
 	WM_operatortype_append(VIEW3D_OT_view_center_pick);
 	WM_operatortype_append(VIEW3D_OT_view_center_camera);
+	WM_operatortype_append(VIEW3D_OT_view_center_lock);
 	WM_operatortype_append(VIEW3D_OT_select);
 	WM_operatortype_append(VIEW3D_OT_select_border);
 	WM_operatortype_append(VIEW3D_OT_clip_border);
@@ -244,6 +245,7 @@
 	WM_keymap_add_item(keymap, "VIEW3D_OT_zoom_camera_1_to_1", PADENTER, KM_PRESS, KM_SHIFT, 0);
 
 	WM_keymap_add_item(keymap, "VIEW3D_OT_view_center_camera", HOMEKEY, KM_PRESS, 0, 0); /* only with camera view */
+	WM_keymap_add_item(keymap, "VIEW3D_OT_view_center_lock", HOMEKEY, KM_PRESS, 0, 0); /* only with lock view */
 
 	WM_keymap_add_item(keymap, "VIEW3D_OT_view_center_cursor", HOMEKEY, KM_PRESS, KM_ALT, 0);
 	WM_keymap_add_item(keymap, "VIEW3D_OT_view_center_pick", FKEY, KM_PRESS, KM_ALT, 0);

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_view.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_view.c	2013-07-19 10:51:54 UTC (rev 58397)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_view.c	2013-07-19 10:54:02 UTC (rev 58398)
@@ -847,6 +847,9 @@
 		}
 	}
 	else {
+		bool use_lock_ofs = false;
+
+
 		/* should be moved to better initialize later on XXX */
 		if (rv3d->viewlock)
 			ED_view3d_lock(rv3d);
@@ -866,15 +869,34 @@
 				}
 			}
 			translate_m4(rv3d->viewmat, -vec[0], -vec[1], -vec[2]);
+			use_lock_ofs = true;
 		}
 		else if (v3d->ob_centre_cursor) {
 			float vec[3];
 			copy_v3_v3(vec, give_cursor(scene, v3d));
 			translate_m4(rv3d->viewmat, -vec[0], -vec[1], -vec[2]);
+			use_lock_ofs = true;
 		}
 		else {
 			translate_m4(rv3d->viewmat, rv3d->ofs[0], rv3d->ofs[1], rv3d->ofs[2]);
 		}
+
+		/* lock offset */
+		if (use_lock_ofs) {
+			float persmat[4][4], persinv[4][4];
+			float vec[3];
+
+			/* we could calculate the real persmat/persinv here
+			 * but it would be unreliable so better to later */
+			mul_m4_m4m4(persmat, rv3d->winmat, rv3d->viewmat);
+			invert_m4_m4(persinv, persmat);
+
+			mul_v2_v2fl(vec, rv3d->ofs_lock, rv3d->is_persp ? rv3d->dist : 1.0f);
+			vec[2] = 0.0f;
+			mul_mat3_m4_v3(persinv, vec);
+			translate_m4(rv3d->viewmat, vec[0], vec[1], vec[2]);
+		}
+		/* end lock offset */
 	}
 }
 

Modified: trunk/blender/source/blender/makesdna/DNA_view3d_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_view3d_types.h	2013-07-19 10:51:54 UTC (rev 58397)
+++ trunk/blender/source/blender/makesdna/DNA_view3d_types.h	2013-07-19 10:54:02 UTC (rev 58398)
@@ -131,6 +131,7 @@
 	char viewlock;
 	char viewlock_quad;			/* options for quadview (store while out of quad view) */
 	char pad[3];
+	float ofs_lock[2];			/* normalized offset for locked view: (-1, -1) bottom left, (1, 1) upper right */
 
 	short twdrawflag;
 	short rflag;




More information about the Bf-blender-cvs mailing list