All pastes #221446 Raw Edit

Someone

public text v1 · immutable
#221446 ·published 2006-10-25 18:21 UTC
rendered paste body
Index: source/blender/include/BSE_view.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/include/BSE_view.h,v
retrieving revision 1.14
diff -u -r1.14 BSE_view.h
--- source/blender/include/BSE_view.h	28 Jan 2006 18:33:13 -0000	1.14
+++ source/blender/include/BSE_view.h	24 Oct 2006 22:37:54 -0000
@@ -55,6 +55,7 @@
 
 void initgrabz(float x, float y, float z);
 void window_to_3d(float *vec, short mx, short my);
+void window_to_3d_f(float *vec, float mx, float my);
 void project_short(float *vec, short *adr);
 void project_short_noclip(float *vec, short *adr);
 void project_int(float *vec, int *adr);
Index: source/blender/makesdna/DNA_userdef_types.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/makesdna/DNA_userdef_types.h,v
retrieving revision 1.58
diff -u -r1.58 DNA_userdef_types.h
--- source/blender/makesdna/DNA_userdef_types.h	19 Oct 2006 05:06:41 -0000	1.58
+++ source/blender/makesdna/DNA_userdef_types.h	24 Oct 2006 14:32:14 -0000
@@ -225,6 +225,7 @@
 #define USER_HIDE_DOT			65536
 #define USER_SHOW_ROTVIEWICON	131072
 #define USER_SHOW_VIEWPORTNAME	262144
+#define USER_ZOOM_TOCURSOR		524288
 
 /* transopts */
 
Index: source/blender/src/editview.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/src/editview.c,v
retrieving revision 1.112
diff -u -r1.112 editview.c
--- source/blender/src/editview.c	12 Oct 2006 09:32:47 -0000	1.112
+++ source/blender/src/editview.c	25 Oct 2006 00:43:08 -0000
@@ -1976,8 +1976,6 @@
 {
 	rcti rect;
 	short val;
-
-	if(G.vd->persp!=2) return;
 	
 	val= get_border(&rect, 3);
 	if(val) {
@@ -2002,6 +2000,58 @@
 	}
 }
 
+void border_zoom(void)
+{
+	//Zooms in on a border drawn by the user
+
+	rcti rect;
+	short val;
+	float dvec[3], vb[2], xscale, yscale, scale;
+	
+	val = get_border(&rect, 3); //box select input
+	if(val)
+	{
+		//find the current window width and height
+		vb[0] = G.vd->area->winx;
+		vb[1] = G.vd->area->winy;
+		
+		//convert the drawn rectangle into 3d space
+		initgrabz(-G.vd->ofs[0], -G.vd->ofs[1], -G.vd->ofs[2]);
+		window_to_3d(dvec, (rect.xmin+rect.xmax-vb[0])/2, (rect.ymin+rect.ymax-vb[1])/2);
+		
+		//center the view to the center of the rectangle
+		VecSubf(G.vd->ofs, G.vd->ofs, dvec);
+		
+		//work out the ratios, so that everything selected fits when we zoom
+		xscale = ((rect.xmax-rect.xmin)/vb[0]);
+		yscale = ((rect.ymax-rect.ymin)/vb[1]);
+		scale = (xscale >= yscale)?xscale:yscale;
+		
+		//zoom in as required, or as far as we can go
+		G.vd->dist = ((G.vd->dist*scale) >= 0.001*G.vd->grid)? G.vd->dist*scale:0.001*G.vd->grid;
+	}
+}
+
+void relative_zoom(unsigned short event)
+{
+	short mval[2];
+	float scaleFactor, dvec[3];
+	
+	if(event==PADPLUSKEY)
+		scaleFactor=.83333f;
+	else if(event==PADMINUS)
+		scaleFactor=1.2f;
+
+	getmouseco_areawin(mval);
+
+	initgrabz(G.vd->ofs[0], G.vd->ofs[1], G.vd->ofs[2]);
+
+	window_to_3d_f(dvec, (mval[0]-((G.vd->area->winx-1)/2))*(scaleFactor-1), (mval[1]-((G.vd->area->winy-1)/2))*(scaleFactor-1));
+
+	G.vd->dist*=scaleFactor;
+
+	VecAddf(G.vd->ofs, G.vd->ofs, dvec);
+}
 
 void fly(void)
 {
Index: source/blender/src/header_view3d.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/src/header_view3d.c,v
retrieving revision 1.189
diff -u -r1.189 header_view3d.c
--- source/blender/src/header_view3d.c	12 Oct 2006 14:26:14 -0000	1.189
+++ source/blender/src/header_view3d.c	23 Oct 2006 20:49:15 -0000
@@ -239,6 +239,9 @@
 	case 11: /* Camera Fly mode */
 		fly();
 		break;
+	case 12: /* Border zoom */
+		border_zoom();
+		break;
 	}
 	allqueue(REDRAWVIEW3D, 0);
 }
@@ -253,6 +256,7 @@
 	uiBlockSetButmFunc(block, do_view3d_view_cameracontrolsmenu, NULL);
 
 	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera Fly Mode|Shift F",	0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
+	if (G.vd->persp != 2) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Zoom|Shift B",	0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 12, "");
 	
 	uiDefBut(block, SEPR, 0, "",					0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
 	
Index: source/blender/src/space.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/src/space.c,v
retrieving revision 1.385
diff -u -r1.385 space.c
--- source/blender/src/space.c	19 Oct 2006 05:06:41 -0000	1.385
+++ source/blender/src/space.c	25 Oct 2006 00:54:11 -0000
@@ -1278,7 +1278,12 @@
 				if(G.qual==LR_ALTKEY)
 					view3d_edit_clipping(v3d);
 				else if(G.qual==LR_SHIFTKEY)
-					set_render_border();
+				{
+					if(G.vd->persp==2)
+						set_render_border();
+					else
+						border_zoom();
+				}
 				else if(G.qual==LR_CTRLKEY) {
 					if(okee("Bake all selected")) {
 						extern void softbody_bake(Object *ob);
@@ -2810,9 +2815,13 @@
 		uiDefButI(block, NUM, 0, "Scroll Lines:",
 			(xpos+edgsp+(4*mpref)+(6*midsp)+spref-edgsp),y3,spref+edgsp,buth,
 			&U.wheellinescroll, 0.0, 32.0, 0, 0,
-			"The number of lines scrolled at a time with the mouse wheel");	
+			"The number of lines scrolled at a time with the mouse wheel");       
 		uiBlockEndAlign(block);
 
+		uiDefButBitI(block, TOG, USER_ZOOM_TOCURSOR, 0, "Zoom to cursor",
+			(xpos+edgsp+(4*mpref)+(5*midsp)),y1,mpref,buth,
+			&(U.uiflag), 0, 0, 0, 0,
+			"Zoom relative to the mouse cursor position");	
 
 		uiDefBut(block, LABEL,0,"3D Transform Widget:",
 				 (xpos+(2*edgsp)+(5*mpref)+(5*midsp)),y6label,mpref,buth,
Index: source/blender/src/toets.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/src/toets.c,v
retrieving revision 1.84
diff -u -r1.84 toets.c
--- source/blender/src/toets.c	28 Sep 2006 01:55:44 -0000	1.84
+++ source/blender/src/toets.c	24 Oct 2006 23:07:59 -0000
@@ -241,14 +241,26 @@
 			if(G.vd->persp==2) {
 				G.vd->camzoom= MAX2(-30, G.vd->camzoom-5);
 			}
-			else if(G.vd->dist<10.0*G.vd->far) G.vd->dist*=1.2f;
+			else if(G.vd->dist<10.0*G.vd->far)
+			{
+				if(U.uiflag & USER_ZOOM_TOCURSOR)
+					relative_zoom(event);
+				else
+					G.vd->dist*=1.2f;
+			}
 			if(G.vd->persp!=1) preview3d_event= 0;
 		}
 		else if(event==PADPLUSKEY) {
 			if(G.vd->persp==2) {
 				G.vd->camzoom= MIN2(300, G.vd->camzoom+5);
 			}
-			else if(G.vd->dist> 0.001*G.vd->grid) G.vd->dist*=.83333f;
+			else if(G.vd->dist> 0.001*G.vd->grid)
+			{
+				if(U.uiflag & USER_ZOOM_TOCURSOR)
+					relative_zoom(event);
+				else
+					G.vd->dist*=.83333f;
+			}
 			if(G.vd->persp!=1) preview3d_event= 0;
 		}
 		else if(event==PAD5) {
Index: source/blender/src/view.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/src/view.c,v
retrieving revision 1.71
diff -u -r1.71 view.c
--- source/blender/src/view.c	23 Oct 2006 16:15:23 -0000	1.71
+++ source/blender/src/view.c	25 Oct 2006 18:17:40 -0000
@@ -151,6 +151,11 @@
 
 void window_to_3d(float *vec, short mx, short my)
 {
+	window_to_3d_f(vec, mx, my);
+}
+
+void window_to_3d_f(float *vec, float mx, float my)
+{
 	/* always call initgrabz */
 	float dx, dy;