Revision: 16381 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16381 Author: blendix Date: 2008-09-05 15:08:50 +0200 (Fri, 05 Sep 2008)
Log Message: ----------- Two more apricot branch features: * Auto Depth: use the depth buffer for improving pan/zoom/rotate in large scenes. * The viewport drawtype for objects in groups now aren't just taken from the original object, but the minimum together with the parent drawtype is used. Modified Paths: -------------- trunk/blender/source/blender/makesdna/DNA_userdef_types.h trunk/blender/source/blender/src/drawview.c trunk/blender/source/blender/src/space.c trunk/blender/source/blender/src/view.c Modified: trunk/blender/source/blender/makesdna/DNA_userdef_types.h =================================================================== --- trunk/blender/source/blender/makesdna/DNA_userdef_types.h 2008-09-05 13:00:34 UTC (rev 16380) +++ trunk/blender/source/blender/makesdna/DNA_userdef_types.h 2008-09-05 13:08:50 UTC (rev 16381) @@ -268,6 +268,7 @@ #define USER_GLOBALUNDO (1 << 13) #define USER_ORBIT_SELECTION (1 << 14) // old flag for #define USER_KEYINSERTAVAI (1 << 15) +#define USER_ORBIT_ZBUF (1 << 15) #define USER_HIDE_DOT (1 << 16) #define USER_SHOW_ROTVIEWICON (1 << 17) #define USER_SHOW_VIEWPORTNAME (1 << 18) Modified: trunk/blender/source/blender/src/drawview.c =================================================================== --- trunk/blender/source/blender/src/drawview.c 2008-09-05 13:00:34 UTC (rev 16380) +++ trunk/blender/source/blender/src/drawview.c 2008-09-05 13:08:50 UTC (rev 16381) @@ -2689,7 +2689,8 @@ tbase.object= dob->ob; /* extra service: draw the duplicator in drawtype of parent */ - dt= tbase.object->dt; tbase.object->dt= base->object->dt; + /* MIN2 for the drawtype to allow bounding box objects in groups for lods */ + dt= tbase.object->dt; tbase.object->dt= MIN2(tbase.object->dt, base->object->dt); dtx= tbase.object->dtx; tbase.object->dtx= base->object->dtx; /* negative scale flag has to propagate */ Modified: trunk/blender/source/blender/src/space.c =================================================================== --- trunk/blender/source/blender/src/space.c 2008-09-05 13:00:34 UTC (rev 16380) +++ trunk/blender/source/blender/src/space.c 2008-09-05 13:08:50 UTC (rev 16381) @@ -3738,6 +3738,11 @@ "Snap objects and sub-objects to grid units when scaling"); uiBlockEndAlign(block); + uiDefButBitI(block, TOG, USER_ORBIT_ZBUF, B_DRAWINFO, "Auto Depth", + (xpos+edgsp+mpref+spref+(2*midsp)),y2,spref,buth, + &(U.uiflag), 0, 0, 0, 0, + "Use the depth under the mouse to improve view pan/rotate/zoom functionality"); + uiDefButBitI(block, TOG, USER_LOCKAROUND, B_DRAWINFO, "Global Pivot", (xpos+edgsp+mpref+spref+(2*midsp)),y1,spref,buth, &(U.uiflag), 0, 0, 0, 0, Modified: trunk/blender/source/blender/src/view.c =================================================================== --- trunk/blender/source/blender/src/view.c 2008-09-05 13:00:34 UTC (rev 16380) +++ trunk/blender/source/blender/src/view.c 2008-09-05 13:08:50 UTC (rev 16381) @@ -793,6 +793,82 @@ BIF_view3d_previewrender_signal(curarea, PR_DBASE|PR_DISPRECT); } +int view_autodist( float mouse_worldloc[3] ) //, float *autodist ) +{ + View3D *v3d = G.vd; + + /* Zooms in on a border drawn by the user */ + short mval[2]; + rcti rect; + + /* ZBuffer depth vars */ + bglMats mats; + float depth, depth_close= MAXFLOAT; + int had_depth = 0; + double cent[2], p[3]; + int xs, ys; + + getmouseco_areawin(mval); + + persp(PERSP_VIEW); + + rect.xmax = mval[0] + 4; + rect.ymax = mval[1] + 4; + + rect.xmin = mval[0] - 4; + rect.ymin = mval[1] - 4; + + /* Get Z Depths, needed for perspective, nice for ortho */ + bgl_get_mats(&mats); + draw_depth(curarea, (void *)v3d, NULL); + + /* 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 >= v3d->depths->w) rect.xmax = v3d->depths->w-1; + if (rect.ymax >= v3d->depths->h) rect.ymax = v3d->depths->h-1; + + /* Find the closest Z pixel */ + 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 (depth_close==MAXFLOAT) + return 0; + + if (had_depth==0) { + MEM_freeN(v3d->depths->depths); + v3d->depths->depths = NULL; + } + v3d->depths->damaged = 1; + + cent[0] = (double)mval[0]; + cent[1] = (double)mval[1]; + + if (!gluUnProject(cent[0], cent[1], depth_close, mats.modelview, mats.projection, mats.viewport, &p[0], &p[1], &p[2])) + return 0; + + mouse_worldloc[0] = (float)p[0]; + mouse_worldloc[1] = (float)p[1]; + mouse_worldloc[2] = (float)p[2]; + return 1; +} + void viewmove(int mode) { static float lastofs[3] = {0,0,0}; @@ -825,15 +901,11 @@ Mat3MulVecfl(mat, upvec); VecAddf(G.vd->ofs, G.vd->ofs, upvec); } - - /* sometimes this routine is called from headerbuttons */ areawinset(curarea->win); - initgrabz(-G.vd->ofs[0], -G.vd->ofs[1], -G.vd->ofs[2]); - QUATCOPY(oldquat, G.vd->viewquat); getmouseco_areawin(mval_area); /* for zoom to mouse loc */ @@ -867,9 +939,44 @@ VECCOPY(obofs, lastofs); VecMulf(obofs, -1.0f); } + else if (U.uiflag & USER_ORBIT_ZBUF) { + if ((use_sel=view_autodist(obofs))) { + if (G.vd->persp==V3D_PERSP) { + float my_origin[3]; /* original G.vd->ofs */ + float my_pivot[3]; /* view */ + + VECCOPY(my_origin, G.vd->ofs); + VecMulf(my_origin, -1.0f); /* ofs is flipped */ + + /* Set the dist value to be the distance from this 3d point */ + /* this means youll always be able to zoom into it and panning wont go bad when dist was zero */ + + /* remove dist value */ + upvec[0] = upvec[1] = 0; + upvec[2] = G.vd->dist; + Mat3CpyMat4(mat, G.vd->viewinv); + Mat3MulVecfl(mat, upvec); + VecSubf(my_pivot, G.vd->ofs, upvec); + VecMulf(my_pivot, -1.0f); /* ofs is flipped */ + + /* find a new ofs value that is allong the view axis (rather then the mouse location) */ + lambda_cp_line_ex(obofs, my_pivot, my_origin, dvec); + dist0 = G.vd->dist = VecLenf(my_pivot, dvec); + + VecMulf(dvec, -1.0f); + VECCOPY(G.vd->ofs, dvec); + } + VecMulf(obofs, -1.0f); + VECCOPY(ofs, G.vd->ofs); + } else { + ofs[0] = ofs[1] = ofs[2] = 0.0f; + } + } else ofs[0] = ofs[1] = ofs[2] = 0.0f; - + + initgrabz(-G.vd->ofs[0], -G.vd->ofs[1], -G.vd->ofs[2]); + reverse= 1.0f; if (G.vd->persmat[2][1] < 0.0f) reverse= -1.0f; @@ -1046,10 +1153,21 @@ zfac*G.vd->dist < 10.0*G.vd->far) view_zoom_mouseloc(zfac, mval_area); - /* these limits are in toets.c too */ - if(G.vd->dist<0.001*G.vd->grid) G.vd->dist= 0.001*G.vd->grid; - if(G.vd->dist>10.0*G.vd->far) G.vd->dist=10.0*G.vd->far; + if ((U.uiflag & USER_ORBIT_ZBUF) && (U.viewzoom==USER_ZOOM_CONT) && (G.vd->persp==V3D_PERSP)) { + /* Secret apricot feature, translate the view when in continues mode */ + upvec[0] = upvec[1] = 0; + upvec[2] = (dist0 - G.vd->dist) * G.vd->grid; + G.vd->dist = dist0; + Mat3CpyMat4(mat, G.vd->viewinv); + Mat3MulVecfl(mat, upvec); + VecAddf(G.vd->ofs, G.vd->ofs, upvec); + } else { + /* these limits are in toets.c too */ + if(G.vd->dist<0.001*G.vd->grid) G.vd->dist= 0.001*G.vd->grid; + if(G.vd->dist>10.0*G.vd->far) G.vd->dist=10.0*G.vd->far; + } + if(G.vd->persp==V3D_ORTHO || G.vd->persp==V3D_CAMOB) preview3d_event= 0; } @@ -2353,3 +2471,4 @@ v3d->persp= V3D_CAMOB; } } + _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs