[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14189] trunk/blender/source/blender: shift+b zoom in perspective mode, ( apricot feature for better navigation on large maps)

Campbell Barton ideasman42 at gmail.com
Thu Mar 20 21:03:13 CET 2008


Revision: 14189
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14189
Author:   campbellbarton
Date:     2008-03-20 21:03:13 +0100 (Thu, 20 Mar 2008)

Log Message:
-----------
shift+b zoom in perspective mode, (apricot feature for better navigation on large maps)

Modified Paths:
--------------
    trunk/blender/source/blender/include/BSE_drawview.h
    trunk/blender/source/blender/src/drawview.c
    trunk/blender/source/blender/src/editview.c

Modified: trunk/blender/source/blender/include/BSE_drawview.h
===================================================================
--- trunk/blender/source/blender/include/BSE_drawview.h	2008-03-20 19:10:14 UTC (rev 14188)
+++ trunk/blender/source/blender/include/BSE_drawview.h	2008-03-20 20:03:13 UTC (rev 14189)
@@ -59,6 +59,8 @@
 
 void drawview3dspace(struct ScrArea *sa, void *spacedata);
 void drawview3d_render(struct View3D *v3d, int winx, int winy, float winmat[][4]);
+void draw_depth(struct ScrArea *sa, void *spacedata);
+void view3d_update_depths(struct View3D *v3d);
 
 int update_time(void);
 void calc_viewborder(struct View3D *v3d, struct rctf *viewborder_r);

Modified: trunk/blender/source/blender/src/drawview.c
===================================================================
--- trunk/blender/source/blender/src/drawview.c	2008-03-20 19:10:14 UTC (rev 14188)
+++ trunk/blender/source/blender/src/drawview.c	2008-03-20 20:03:13 UTC (rev 14189)
@@ -2889,6 +2889,69 @@
 	}
 }
 
+void draw_depth(ScrArea *sa, void *spacedata)
+{
+	View3D *v3d= spacedata;
+	Base *base;
+	Scene *sce;
+	short drawtype;
+	
+	/* temp set drawtype to solid */
+	drawtype = v3d->drawtype;
+	v3d->drawtype = OB_SOLID;
+	
+	
+	setwinmatrixview3d(sa->winx, sa->winy, NULL);	/* 0= no pick rect */
+	setviewmatrixview3d();	/* note: calls where_is_object for camera... */
+	
+	Mat4MulMat4(v3d->persmat, v3d->viewmat, sa->winmat);
+	Mat4Invert(v3d->persinv, v3d->persmat);
+	Mat4Invert(v3d->viewinv, v3d->viewmat);
+	
+	glClear(GL_DEPTH_BUFFER_BIT);
+	
+	myloadmatrix(v3d->viewmat);
+	persp(PERSP_STORE);  // store correct view for persp(PERSP_VIEW) calls
+	
+	if(v3d->flag & V3D_CLIPPING) {
+		view3d_set_clipping(v3d);
+	}
+	
+	v3d->zbuf= TRUE;
+	glEnable(GL_DEPTH_TEST);
+	
+	/* draw set first */
+	if(G.scene->set) {
+		for(SETLOOPER(G.scene->set, base)) {
+			
+			if(v3d->lay & base->lay) {
+
+				/*BIF_ThemeColorBlend(TH_WIRE, TH_BACK, 0.6f);*/ /* not needed for depths */
+
+				draw_object(base, DRAW_CONSTCOLOR);
+
+				if(base->object->transflag & OB_DUPLI) {
+					draw_dupli_objects_color(v3d, base, TH_WIRE);
+				}
+			}
+		}
+	}
+	
+	/* then draw not selected and the duplis, but skip editmode object */
+	for(base= G.scene->base.first; base; base= base->next) {
+		if(v3d->lay & base->lay) {
+			
+			/* dupli drawing */
+			if(base->object->transflag & OB_DUPLI) {
+				draw_dupli_objects(v3d, base);
+			}
+			draw_object(base, 0);
+		}
+	}
+	
+	v3d->drawtype = drawtype;
+}
+
 static void draw_viewport_fps(ScrArea *sa);
 
 

Modified: trunk/blender/source/blender/src/editview.c
===================================================================
--- trunk/blender/source/blender/src/editview.c	2008-03-20 19:10:14 UTC (rev 14188)
+++ trunk/blender/source/blender/src/editview.c	2008-03-20 20:03:13 UTC (rev 14189)
@@ -2197,13 +2197,75 @@
 	float new_dist;
 	float new_ofs[3];
 	
-	/* doesn't work fine for perspective */
-	if(G.vd->persp==1)
-		return;
+	val = get_border(&rect, 3); //box select input
+	if(!val) return;
 	
-	val = get_border(&rect, 3); //box select input
-	if(val)
-	{
+	if (G.vd->persp==1) { /* perspective */
+		View3D *v3d = G.vd;
+		bglMats mats;
+		float depth, depth_close= MAXFLOAT;
+		double cent[2],  p[3], p_corner[3];
+		int xs, ys, had_depth = 0;
+		
+		/* convert border to 3d coordinates */
+		bgl_get_mats(&mats);
+		
+		draw_depth(curarea, (void *)v3d);
+		
+		/* force updating */
+		if (v3d->depths) {
+			had_depth = 1;
+			v3d->depths->damaged = 1;
+		}
+		
+		view3d_update_depths(v3d);
+		
+		/* Constrain rect to depth bounds */
+		if (rect.xmin < 0) rect.xmin = 0;
+		if (rect.ymin < 0) rect.ymin = 0;
+		if (rect.xmax >= G.vd->depths->w) rect.xmax = G.vd->depths->w-1;
+		if (rect.ymax >= G.vd->depths->h) rect.ymax = G.vd->depths->h-1;		
+		
+		for (xs=rect.xmin; xs < rect.xmax; xs++) {
+			for (ys=rect.ymin; ys < rect.ymax; ys++) {
+				depth= v3d->depths->depths[ys*v3d->depths->w+xs];
+				if(depth < v3d->depths->depth_range[1] && depth > v3d->depths->depth_range[0]) {
+					if (depth_close > depth) {
+						depth_close = depth;
+					}
+				}
+			}
+		}
+		
+		if (had_depth==0) {
+			MEM_freeN(v3d->depths->depths);
+			v3d->depths->depths = NULL;
+		}
+		v3d->depths->damaged = 1;
+		
+		/* no depths to use*/
+		if (depth_close==MAXFLOAT) 
+			return;
+		
+		cent[0] = (((double)rect.xmin)+((double)rect.xmax)) / 2;
+		cent[1] = (((double)rect.ymin)+((double)rect.ymax)) / 2;
+		
+		if ((	!gluUnProject(cent[0], cent[1], depth_close, mats.modelview, mats.projection, mats.viewport, &p[0], &p[1], &p[2])) || 
+			(	!gluUnProject((double)rect.xmin, (double)rect.ymin, depth_close, mats.modelview, mats.projection, mats.viewport, &p_corner[0], &p_corner[1], &p_corner[2])))
+			return;
+		
+		dvec[0] = p[0]-p_corner[0];
+		dvec[1] = p[1]-p_corner[1];
+		dvec[2] = p[2]-p_corner[2];
+		
+		new_dist = VecLength(dvec);
+		if(new_dist <= G.vd->near*1.5) new_dist= G.vd->near*1.5; 
+		
+		new_ofs[0] = -p[0];
+		new_ofs[1] = -p[1];
+		new_ofs[2] = -p[2];
+		
+	} else { /* othographic */
 		/* find the current window width and height */
 		vb[0] = G.vd->area->winx;
 		vb[1] = G.vd->area->winy;
@@ -2228,10 +2290,9 @@
 		
 		/* zoom in as required, or as far as we can go */
 		new_dist = ((new_dist*scale) >= 0.001*G.vd->grid)? new_dist*scale:0.001*G.vd->grid;
-		
-		smooth_view(G.vd, new_ofs, NULL, &new_dist, NULL);
-		
 	}
+	
+	smooth_view(G.vd, new_ofs, NULL, &new_dist, NULL);
 }
 
 void fly(void)




More information about the Bf-blender-cvs mailing list