Revision: 17975 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17975 Author: ton Date: 2008-12-20 19:43:21 +0100 (Sat, 20 Dec 2008)
Log Message: ----------- 2.5 View3D: ported selection code, another 2000 lines :) Border select (BKEY) in 3d window now works. For lasso and circle I have to add WM support still. Modified Paths: -------------- branches/blender2.5/blender/source/blender/editors/space_view3d/drawobject.c branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_edit.c branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_header.c branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_intern.h branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_ops.c branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_view.c Added Paths: ----------- branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_select.c Modified: branches/blender2.5/blender/source/blender/editors/space_view3d/drawobject.c =================================================================== --- branches/blender2.5/blender/source/blender/editors/space_view3d/drawobject.c 2008-12-20 17:09:45 UTC (rev 17974) +++ branches/blender2.5/blender/source/blender/editors/space_view3d/drawobject.c 2008-12-20 18:43:21 UTC (rev 17975) @@ -133,10 +133,9 @@ void EM_free_index_arrays(void) {} // XXX #define EM_FGON 0 EditFace *EM_get_actFace(int x) {return NULL;} // XXX -int em_solidoffs; // XXX -int em_wireoffs; -int em_vertoffs; +extern unsigned int em_vertoffs, em_solidoffs, em_wireoffs; + /* check for glsl drawing */ int draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, int dt) @@ -1260,6 +1259,7 @@ data->func(data->userData, eed, s[0][0], s[0][1], s[1][0], s[1][1], index); } } + void mesh_foreachScreenEdge(ARegion *ar, View3D *v3d, void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index), void *userData, int clipVerts) { struct { void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index); void *userData; ARegion *ar; View3D *v3d; int clipVerts; float pmat[4][4], vmat[4][4]; } data; @@ -1292,6 +1292,7 @@ data->func(data->userData, efa, s[0], s[1], index); } } + void mesh_foreachScreenFace(ARegion *ar, View3D *v3d, void (*func)(void *userData, EditFace *efa, int x, int y, int index), void *userData) { struct { void (*func)(void *userData, EditFace *efa, int x, int y, int index); void *userData; ARegion *ar; View3D *v3d; float pmat[4][4], vmat[4][4]; } data; Modified: branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_edit.c =================================================================== --- branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_edit.c 2008-12-20 17:09:45 UTC (rev 17974) +++ branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_edit.c 2008-12-20 18:43:21 UTC (rev 17975) @@ -824,7 +824,7 @@ else { Base *base= FIRSTBASE; while(base) { - if TESTBASE(v3d, base) { + if(TESTBASE(v3d, base)) { minmax_object(base->object, min, max); /* account for duplis */ minmax_object_duplis(base->object, min, max); @@ -894,436 +894,7 @@ ot->poll= ED_operator_areaactive; } -/* ************************** mouse select ************************* */ - -#define MAXPICKBUF 10000 -/* The max number of menu items in an object select menu */ -#define SEL_MENU_SIZE 22 - -void set_active_base(Scene *scene, Base *base) -{ - Base *tbase; - - /* activating a non-mesh, should end a couple of modes... */ -// if(base && base->object->type!=OB_MESH) -// XXX exit_paint_modes(); - - /* sets scene->basact */ - BASACT= base; - - if(base) { - - /* signals to buttons */ -// redraw_test_buttons(base->object); - - /* signal to ipo */ -// allqueue(REDRAWIPO, base->object->ipowin); - -// allqueue(REDRAWACTION, 0); -// allqueue(REDRAWNLA, 0); -// allqueue(REDRAWNODE, 0); - - /* signal to action */ -// select_actionchannel_by_name(base->object->action, "Object", 1); - - /* disable temporal locks */ - for(tbase=FIRSTBASE; tbase; tbase= tbase->next) { - if(base!=tbase && (tbase->object->shapeflag & OB_SHAPE_TEMPLOCK)) { - tbase->object->shapeflag &= ~OB_SHAPE_TEMPLOCK; - DAG_object_flush_update(G.scene, tbase->object, OB_RECALC_DATA); - } - } - } -} - - -/* simple API for object selection, rather than just using the flag - * this takes into account the 'restrict selection in 3d view' flag. - * deselect works always, the restriction just prevents selection */ -void select_base_v3d(Base *base, short mode) -{ - if (base) { - if (mode==BA_SELECT) { - if (!(base->object->restrictflag & OB_RESTRICT_SELECT)) - if (mode==BA_SELECT) base->flag |= SELECT; - } - else if (mode==BA_DESELECT) { - base->flag &= ~SELECT; - } - } -} - -static void deselectall_except(Scene *scene, Base *b) /* deselect all except b */ -{ - Base *base; - - for(base= FIRSTBASE; base; base= base->next) { - if (base->flag & SELECT) { - if(b!=base) { - select_base_v3d(base, BA_DESELECT); - base->object->flag= base->flag; - } - } - } -} - -static Base *mouse_select_menu(Scene *scene, ARegion *ar, View3D *v3d, unsigned int *buffer, int hits, short *mval) -{ - Base *baseList[SEL_MENU_SIZE]={NULL}; /*baseList is used to store all possible bases to bring up a menu */ - Base *base; - short baseCount = 0; - char menuText[20 + SEL_MENU_SIZE*32] = "Select Object%t"; /* max ob name = 22 */ - char str[32]; - - for(base=FIRSTBASE; base; base= base->next) { - if (BASE_SELECTABLE(v3d, base)) { - baseList[baseCount] = NULL; - - /* two selection methods, the CTRL select uses max dist of 15 */ - if(buffer) { - int a; - for(a=0; a<hits; a++) { - /* index was converted */ - if(base->selcol==buffer[ (4 * a) + 3 ]) baseList[baseCount] = base; - } - } - else { - int temp, dist=15; - - project_short(ar, v3d, base->object->obmat[3], &base->sx); - - temp= abs(base->sx -mval[0]) + abs(base->sy -mval[1]); - if(temp<dist ) baseList[baseCount] = base; - } - - if(baseList[baseCount]) { - if (baseCount < SEL_MENU_SIZE) { - baseList[baseCount] = base; - sprintf(str, "|%s %%x%d", base->object->id.name+2, baseCount+1); /* max ob name == 22 */ - strcat(menuText, str); - baseCount++; - } - } - } - } - - if(baseCount<=1) return baseList[0]; - else { - baseCount = -1; // XXX = pupmenu(menuText); - - if (baseCount != -1) { /* If nothing is selected then dont do anything */ - return baseList[baseCount-1]; - } - else return NULL; - } -} - -/* we want a select buffer with bones, if there are... */ -/* so check three selection levels and compare */ -static short mixed_bones_object_selectbuffer(Scene *scene, ARegion *ar, View3D *v3d, unsigned int *buffer, short *mval) -{ - rcti rect; - int offs; - short a, hits15, hits9=0, hits5=0; - short has_bones15=0, has_bones9=0, has_bones5=0; - - BLI_init_rcti(&rect, mval[0]-14, mval[0]+14, mval[1]-14, mval[1]+14); - hits15= view3d_opengl_select(scene, ar, v3d, buffer, MAXPICKBUF, &rect); - if(hits15>0) { - for(a=0; a<hits15; a++) if(buffer[4*a+3] & 0xFFFF0000) has_bones15= 1; - - offs= 4*hits15; - BLI_init_rcti(&rect, mval[0]-9, mval[0]+9, mval[1]-9, mval[1]+9); - hits9= view3d_opengl_select(scene, ar, v3d, buffer+offs, MAXPICKBUF-offs, &rect); - if(hits9>0) { - for(a=0; a<hits9; a++) if(buffer[offs+4*a+3] & 0xFFFF0000) has_bones9= 1; - - offs+= 4*hits9; - BLI_init_rcti(&rect, mval[0]-5, mval[0]+5, mval[1]-5, mval[1]+5); - hits5= view3d_opengl_select(scene, ar, v3d, buffer+offs, MAXPICKBUF-offs, &rect); - if(hits5>0) { - for(a=0; a<hits5; a++) if(buffer[offs+4*a+3] & 0xFFFF0000) has_bones5= 1; - } - } - - if(has_bones5) { - offs= 4*hits15 + 4*hits9; - memcpy(buffer, buffer+offs, 4*offs); - return hits5; - } - if(has_bones9) { - offs= 4*hits15; - memcpy(buffer, buffer+offs, 4*offs); - return hits9; - } - if(has_bones15) { - return hits15; - } - - if(hits5>0) { - offs= 4*hits15 + 4*hits9; - memcpy(buffer, buffer+offs, 4*offs); - return hits5; - } - if(hits9>0) { - offs= 4*hits15; - memcpy(buffer, buffer+offs, 4*offs); - return hits9; - } - return hits15; - } - - return 0; -} - -/* mval is region coords */ -static void mouse_select(Scene *scene, ARegion *ar, View3D *v3d, short *mval) -{ - Base *base, *startbase=NULL, *basact=NULL, *oldbasact=NULL; - unsigned int buffer[4*MAXPICKBUF]; - int temp, a, dist=100; - short hits; - short ctrl=0, shift=0, alt=0; - - /* always start list from basact in wire mode */ - startbase= FIRSTBASE; - if(BASACT && BASACT->next) startbase= BASACT->next; - - /* This block uses the control key to make the object selected by its center point rather then its contents */ - if(G.obedit==0 && ctrl) { - - /* note; shift+alt goes to group-flush-selecting */ - if(alt && ctrl) - basact= mouse_select_menu(scene, ar, v3d, NULL, 0, mval); - else { - base= startbase; - while(base) { - if (BASE_SELECTABLE(v3d, base)) { - project_short(ar, v3d, base->object->obmat[3], &base->sx); - - temp= abs(base->sx -mval[0]) + abs(base->sy -mval[1]); - if(base==BASACT) temp+=10; - if(temp<dist ) { - - dist= temp; - basact= base; - } - } - base= base->next; - - if(base==0) base= FIRSTBASE; - if(base==startbase) break; - } - } - } - else { - /* if objects have posemode set, the bones are in the same selection buffer */ - - hits= mixed_bones_object_selectbuffer(scene, ar, v3d, buffer, mval); - - if(hits>0) { - int has_bones= 0; - - for(a=0; a<hits; a++) if(buffer[4*a+3] & 0xFFFF0000) has_bones= 1; - - /* note; shift+alt goes to group-flush-selecting */ - if(has_bones==0 && (alt)) - basact= mouse_select_menu(scene, ar, v3d, buffer, hits, mval); - else { - static short lastmval[2]={-100, -100}; - int donearest= 0; - - /* define if we use solid nearest select or not */ - if(v3d->drawtype>OB_WIRE) { - donearest= 1; - if( ABS(mval[0]-lastmval[0])<3 && ABS(mval[1]-lastmval[1])<3) { - if(!has_bones) /* hrms, if theres bones we always do nearest */ - donearest= 0; - } - } - lastmval[0]= mval[0]; lastmval[1]= mval[1]; - - if(donearest) { - unsigned int min= 0xFFFFFFFF; - int selcol= 0, notcol=0; - - - if(has_bones) { - /* we skip non-bone hits */ - for(a=0; a<hits; a++) { - if( min > buffer[4*a+1] && (buffer[4*a+3] & 0xFFFF0000) ) { - min= buffer[4*a+1]; - selcol= buffer[4*a+3] & 0xFFFF; - } - } - } - else { - /* only exclude active object when it is selected... */ - if(BASACT && (BASACT->flag & SELECT) && hits>1) notcol= BASACT->selcol; - - for(a=0; a<hits; a++) { - if( min > buffer[4*a+1] && notcol!=(buffer[4*a+3] & 0xFFFF)) { - min= buffer[4*a+1]; - selcol= buffer[4*a+3] & 0xFFFF; - } - } - } - - base= FIRSTBASE; - while(base) { - if(base->lay & v3d->lay) { - if(base->selcol==selcol) break; - } - base= base->next; - } - if(base) basact= base; - } - else { - - base= startbase; - while(base) { - /* skip objects with select restriction, to prevent prematurely ending this loop - * with an un-selectable choice */ - if (base->object->restrictflag & OB_RESTRICT_SELECT) { @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs