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)


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to