diff options
author | Ton Roosendaal <ton@blender.org> | 2005-11-28 19:59:12 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2005-11-28 19:59:12 +0300 |
commit | 413a86e5d9b792d2346c5b1ea1a5bc364af09e60 (patch) | |
tree | bd9989140e7856ca983cbf8a0b121c3f0492cd5f /source/blender | |
parent | ea16a99f57d5741f5e39a15b12df693b658bb22c (diff) |
As reported on bf-committers maillist: new object centers were drawing in
sets. To fix it, I got rid of a very ancient hack to enable set grey wire
drawing (setting a global to pretend it's picking select draw).
Now this setting is nicely passed on via functions as argument.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/include/BDR_drawobject.h | 11 | ||||
-rw-r--r-- | source/blender/src/drawarmature.c | 4 | ||||
-rw-r--r-- | source/blender/src/drawobject.c | 83 | ||||
-rw-r--r-- | source/blender/src/drawview.c | 71 | ||||
-rw-r--r-- | source/blender/src/view.c | 6 |
5 files changed, 82 insertions, 93 deletions
diff --git a/source/blender/include/BDR_drawobject.h b/source/blender/include/BDR_drawobject.h index 839c1f45f42..c9b3a357a97 100644 --- a/source/blender/include/BDR_drawobject.h +++ b/source/blender/include/BDR_drawobject.h @@ -49,9 +49,6 @@ struct BezTriple; struct EditVert; struct EditFace; -void drawaxes(float size); -void drawcamera(struct Object *ob); - void mesh_foreachScreenVert(void (*func)(void *userData, struct EditVert *eve, int x, int y, int index), void *userData, int clipVerts); void mesh_foreachScreenEdge(void (*func)(void *userData, struct EditEdge *eed, int x0, int y0, int x1, int y1, int index), void *userData, int clipVerts); void mesh_foreachScreenFace(void (*func)(void *userData, struct EditFace *efa, int x, int y, int index), void *userData); @@ -61,7 +58,13 @@ void nurbs_foreachScreenVert(void (*func)(void *userData, struct Nurb *nu, struc void drawcircball(int mode, float *cent, float rad, float tmat[][4]); void get_local_bounds(struct Object *ob, float *centre, float *size); -void draw_object(struct Base *base); + +/* drawing flags: */ +#define DRAW_PICKING 1 +#define DRAW_CONSTCOLOR 2 +void draw_object(struct Base *base, int flag); +void drawaxes(float size, int flag); + void draw_object_ext(struct Base *base); void drawsolidcube(float size); extern void draw_object_backbufsel(struct Object *ob); diff --git a/source/blender/src/drawarmature.c b/source/blender/src/drawarmature.c index e2edf634d30..b4c31179e2d 100644 --- a/source/blender/src/drawarmature.c +++ b/source/blender/src/drawarmature.c @@ -1486,7 +1486,7 @@ static void draw_pose_channels(Base *base, int dt) glPushMatrix(); glMultMatrixf(pchan->pose_mat); glTranslatef(0.0f, pchan->bone->length, 0.0f); - drawaxes(0.25f*pchan->bone->length); + drawaxes(0.25f*pchan->bone->length, 0); glPopMatrix(); } } @@ -1663,7 +1663,7 @@ static void draw_ebones(Object *ob, int dt) glPushMatrix(); set_matrix_editbone(eBone); glTranslatef(0.0f, eBone->length, 0.0f); - drawaxes(eBone->length*0.25f); + drawaxes(eBone->length*0.25f, 0); glPopMatrix(); } diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index c78e4c53859..3261c884ca6 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -238,7 +238,8 @@ static float cube[8][3] = { { 1.0, 1.0, -1.0}, }; -void drawaxes(float size) +/* flag is same as for draw_object */ +void drawaxes(float size, int flag) { int axis; @@ -268,7 +269,7 @@ void drawaxes(float size) glRasterPos3fv(v2); // patch for 3d cards crashing on glSelect for text drawing (IBM) - if((G.f & G_PICKSEL) == 0) { + if((flag & DRAW_PICKING) == 0) { if (axis==0) BMF_DrawString(G.font, "x"); else if (axis==1) @@ -800,7 +801,8 @@ static void draw_focus_cross(float dist, float size) glEnd(); } -void drawcamera(Object *ob) +/* flag similar to draw_object() */ +static void drawcamera(Object *ob, int flag) { /* a standing up pyramid with (0,0,0) as top */ Camera *cam; @@ -880,26 +882,28 @@ void drawcamera(Object *ob) glEnd(); } - if(cam->flag & (CAM_SHOWLIMITS+CAM_SHOWMIST)) { - myloadmatrix(G.vd->viewmat); - Mat4CpyMat4(vec, ob->obmat); - Mat4Ortho(vec); - mymultmatrix(vec); + if(flag==0) { + if(cam->flag & (CAM_SHOWLIMITS+CAM_SHOWMIST)) { + myloadmatrix(G.vd->viewmat); + Mat4CpyMat4(vec, ob->obmat); + Mat4Ortho(vec); + mymultmatrix(vec); - MTC_Mat4SwapMat4(G.vd->persmat, tmat); - mygetsingmatrix(G.vd->persmat); + MTC_Mat4SwapMat4(G.vd->persmat, tmat); + mygetsingmatrix(G.vd->persmat); - if(cam->flag & CAM_SHOWLIMITS) { - draw_limit_line(cam->clipsta, cam->clipend, 0x77FFFF); - /* yafray: dof focus point */ - if (G.scene->r.renderer==R_YAFRAY) draw_focus_cross(cam->YF_dofdist, cam->drawsize); - } + if(cam->flag & CAM_SHOWLIMITS) { + draw_limit_line(cam->clipsta, cam->clipend, 0x77FFFF); + /* yafray: dof focus point */ + if (G.scene->r.renderer==R_YAFRAY) draw_focus_cross(cam->YF_dofdist, cam->drawsize); + } - wrld= G.scene->world; - if(cam->flag & CAM_SHOWMIST) - if(wrld) draw_limit_line(wrld->miststa, wrld->miststa+wrld->mistdist, 0xFFFFFF); - - MTC_Mat4SwapMat4(G.vd->persmat, tmat); + wrld= G.scene->world; + if(cam->flag & CAM_SHOWMIST) + if(wrld) draw_limit_line(wrld->miststa, wrld->miststa+wrld->mistdist, 0xFFFFFF); + + MTC_Mat4SwapMat4(G.vd->persmat, tmat); + } } } @@ -3472,7 +3476,8 @@ static void draw_hooks(Object *ob) } } -void draw_object(Base *base) +/* flag can be DRAW_PICKING and/or DRAW_CONSTCOLOR */ +void draw_object(Base *base, int flag) { static int warning_recursive= 0; Object *ob; @@ -3490,7 +3495,8 @@ void draw_object(Base *base) ob= base->object; /* xray delay? */ - if(!(G.f & G_PICKSEL)) { + if((flag & DRAW_PICKING)==0) { + /* xray and transp are set when it is drawing the 2nd/3rd pass */ if(!G.vd->xray && !G.vd->transp && (ob->dtx & OB_DRAWXRAY)) { add_view3d_after(G.vd, base, V3D_XRAY); return; @@ -3499,7 +3505,7 @@ void draw_object(Base *base) /* draw keys? */ if(base==(G.scene->basact) || (base->flag & (SELECT+BA_WAS_SEL))) { - if(warning_recursive==0 && ob!=G.obedit) { + if(flag==0 && warning_recursive==0 && ob!=G.obedit) { if(ob->ipo && ob->ipo->showkey && (ob->ipoflag & OB_DRAWKEY)) { ListBase elems; CfraElem *ce; @@ -3531,7 +3537,7 @@ void draw_object(Base *base) base->flag= 0; where_is_object_time(ob, (G.scene->r.cfra)); - draw_object(base); + draw_object(base, 0); } ce= ce->next; } @@ -3545,7 +3551,7 @@ void draw_object(Base *base) base->flag= SELECT; where_is_object_time(ob, (G.scene->r.cfra)); - draw_object(base); + draw_object(base, 0); } ce= ce->next; } @@ -3576,7 +3582,7 @@ void draw_object(Base *base) mymultmatrix(ob->obmat); /* which wire color */ - if((G.f & G_PICKSEL) == 0) { + if((flag & DRAW_CONSTCOLOR) == 0) { project_short(ob->obmat[3], &base->sx); if((G.moving & G_TRANSFORM_OBJ) && (base->flag & (SELECT+BA_WAS_SEL))) BIF_ThemeColor(TH_TRANSFORM); @@ -3653,7 +3659,7 @@ void draw_object(Base *base) /* draw outline for selected solid objects, mesh does itself */ if((G.vd->flag & V3D_SELECT_OUTLINE) && ob->type!=OB_MESH) { if(dt>OB_WIRE && dt<OB_TEXTURE && ob!=G.obedit) { - if (!(ob->dtx&OB_DRAWWIRE) && (ob->flag&SELECT) && !(G.f&G_PICKSEL)) { + if (!(ob->dtx&OB_DRAWWIRE) && (ob->flag&SELECT) && !(flag&DRAW_PICKING)) { drawSolidSelect(base); } } @@ -3671,7 +3677,7 @@ void draw_object(Base *base) if(paf) { if(col || (ob->flag & SELECT)) cpack(0xFFFFFF); /* for visibility, also while wpaint */ if(paf->flag & PAF_STATIC) draw_static_particle_system(ob, paf, dt); - else if((G.f & G_PICKSEL) == 0) draw_particle_system(ob, paf); // selection errors happen to easy + else if((flag & DRAW_PICKING) == 0) draw_particle_system(ob, paf); // selection errors happen to easy if(col) cpack(col); } } @@ -3792,14 +3798,14 @@ void draw_object(Base *base) empty_object= drawmball(ob, dt); break; case OB_EMPTY: - drawaxes(1.0); + drawaxes(1.0, flag); break; case OB_LAMP: drawlamp(ob); if(dtx || (base->flag & SELECT)) mymultmatrix(ob->obmat); break; case OB_CAMERA: - drawcamera(ob); + drawcamera(ob, flag); break; case OB_LATTICE: drawlattice(ob); @@ -3809,7 +3815,7 @@ void draw_object(Base *base) empty_object= draw_armature(base, dt); break; default: - drawaxes(1.0); + drawaxes(1.0, flag); } if(ob->pd && ob->pd->forcefield) draw_forcefield(ob); @@ -3818,13 +3824,14 @@ void draw_object(Base *base) if(dtx) { if(G.f & G_SIMULATION); else if(dtx & OB_AXIS) { - drawaxes(1.0f); + drawaxes(1.0f, flag); } if(dtx & OB_BOUNDBOX) draw_bounding_volume(ob); if(dtx & OB_TEXSPACE) drawtexspace(ob); if(dtx & OB_DRAWNAME) { - // patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing - if((G.f & G_PICKSEL) == 0) { + /* patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing */ + /* but, we also dont draw names for sets or duplicators */ + if(flag == 0) { glRasterPos3f(0.0, 0.0, 0.0); BMF_DrawString(G.font, " "); @@ -3859,15 +3866,19 @@ void draw_object(Base *base) /* object centers, need to be drawn in viewmat space for speed, but OK for picking select */ if((G.f & (G_VERTEXPAINT|G_FACESELECT|G_TEXTUREPAINT|G_WEIGHTPAINT))==0) { + /* we don't draw centers for duplicators and sets */ + if((flag & DRAW_CONSTCOLOR)==0) { if((G.scene->basact)==base) drawcentercircle(ob->obmat[3], ACTIVE, ob->id.lib || ob->id.us>1); else if(base->flag & SELECT) drawcentercircle(ob->obmat[3], SELECT, ob->id.lib || ob->id.us>1); else if(empty_object || (G.vd->flag & V3D_DRAW_CENTERS)) drawcentercircle(ob->obmat[3], DESELECT, ob->id.lib || ob->id.us>1); + } } - if((G.f & (G_PICKSEL))==0) { + /* not for sets, duplicators or picking */ + if(flag==0) { ListBase *list; /* draw hook center and offset line */ @@ -3932,7 +3943,7 @@ void draw_object_ext(Base *base) if(G.vd->flag & V3D_CLIPPING) view3d_set_clipping(G.vd); - draw_object(base); + draw_object(base, 0); if(G.vd->flag & V3D_CLIPPING) view3d_clr_clipping(); diff --git a/source/blender/src/drawview.c b/source/blender/src/drawview.c index 7ded0b5b66c..b470d2ab6af 100644 --- a/source/blender/src/drawview.c +++ b/source/blender/src/drawview.c @@ -2053,7 +2053,7 @@ void add_view3d_after(View3D *v3d, Base *base, int type) } /* clears zbuffer and draws it over */ -static void view3d_draw_xray(View3D *v3d) +static void view3d_draw_xray(View3D *v3d, int flag) { View3DAfter *v3da, *next; int doit= 0; @@ -2068,7 +2068,7 @@ static void view3d_draw_xray(View3D *v3d) for(v3da= v3d->afterdraw.first; v3da; v3da= next) { next= v3da->next; if(v3da->type==V3D_XRAY) { - draw_object(v3da->base); + draw_object(v3da->base, flag); BLI_remlink(&v3d->afterdraw, v3da); MEM_freeN(v3da); } @@ -2078,7 +2078,7 @@ static void view3d_draw_xray(View3D *v3d) } /* disables write in zbuffer and draws it over */ -static void view3d_draw_transp(View3D *v3d) +static void view3d_draw_transp(View3D *v3d, int flag) { View3DAfter *v3da, *next; @@ -2088,7 +2088,7 @@ static void view3d_draw_transp(View3D *v3d) for(v3da= v3d->afterdraw.first; v3da; v3da= next) { next= v3da->next; if(v3da->type==V3D_TRANSP) { - draw_object(v3da->base); + draw_object(v3da->base, flag); BLI_remlink(&v3d->afterdraw, v3da); MEM_freeN(v3da); } @@ -2195,14 +2195,8 @@ void drawview3dspace(ScrArea *sa, void *spacedata) object_handle_update(base->object); - /* patch: color remains constant, only set it for wire, so transparant works */ - if(v3d->zbuf==0 || base->object->dt<=OB_WIRE) - G.f |= G_PICKSEL; - else - G.f &= ~G_PICKSEL; - BIF_ThemeColorBlend(TH_WIRE, TH_BACK, 0.6f); - draw_object(base); + draw_object(base, DRAW_CONSTCOLOR); if(base->object->transflag & OB_DUPLI) { extern ListBase duplilist; @@ -2215,7 +2209,7 @@ void drawview3dspace(ScrArea *sa, void *spacedata) ob= duplilist.first; while(ob) { tbase.object= ob; - draw_object(&tbase); + draw_object(&tbase, DRAW_CONSTCOLOR); ob= ob->id.next; } free_duplilist(); @@ -2224,12 +2218,10 @@ void drawview3dspace(ScrArea *sa, void *spacedata) } base= base->next; } - - G.f &= ~G_PICKSEL; /* Transp and X-ray afterdraw stuff */ - view3d_draw_xray(v3d); // clears zbuffer if it is used! - view3d_draw_transp(v3d); + view3d_draw_xray(v3d, DRAW_CONSTCOLOR); // clears zbuffer if it is used! + view3d_draw_transp(v3d, DRAW_CONSTCOLOR); } /* update all objects, ipos, matrices, displists, etc. Flags set by depgraph or manual, no layer check here, gets correct flushed */ @@ -2246,8 +2238,6 @@ void drawview3dspace(ScrArea *sa, void *spacedata) extern ListBase duplilist; Base tbase; - /* patch: color remains constant */ - G.f |= G_PICKSEL; BIF_ThemeColorBlend(TH_BACK, TH_WIRE, 0.5); tbase.flag= OB_FROMDUPLI; @@ -2256,15 +2246,13 @@ void drawview3dspace(ScrArea *sa, void *spacedata) ob= duplilist.first; while(ob) { tbase.object= ob; - draw_object(&tbase); + draw_object(&tbase, DRAW_CONSTCOLOR); ob= ob->id.next; } free_duplilist(); - - G.f &= ~G_PICKSEL; } if((base->flag & SELECT)==0) { - if(base->object!=G.obedit) draw_object(base); + if(base->object!=G.obedit) draw_object(base, 0); } } } @@ -2272,7 +2260,7 @@ void drawview3dspace(ScrArea *sa, void *spacedata) for(base= G.scene->base.first; base; base= base->next) { if(v3d->lay & base->lay) { if (base->object==G.obedit || ( base->flag & SELECT) ) - draw_object(base); + draw_object(base, 0); } } @@ -2284,8 +2272,8 @@ void drawview3dspace(ScrArea *sa, void *spacedata) if(G.scene->radio) RAD_drawall(v3d->drawtype>=OB_SOLID); /* Transp and X-ray afterdraw stuff */ - view3d_draw_xray(v3d); // clears zbuffer if it is used! - view3d_draw_transp(v3d); + view3d_draw_xray(v3d, 0); // clears zbuffer if it is used! + view3d_draw_transp(v3d, 0); if(v3d->flag & V3D_CLIPPING) view3d_clr_clipping(); @@ -2402,14 +2390,8 @@ void drawview3d_render(struct View3D *v3d) else { where_is_object(base->object); - /* patch: color remains constant, only set it for wire, so transparant works */ - if(v3d->zbuf==0 || base->object->dt<=OB_WIRE) - G.f |= G_PICKSEL; - else - G.f &= ~G_PICKSEL; - BIF_ThemeColorBlend(TH_WIRE, TH_BACK, 0.6f); - draw_object(base); + draw_object(base, DRAW_CONSTCOLOR); if(base->object->transflag & OB_DUPLI) { extern ListBase duplilist; @@ -2420,7 +2402,7 @@ void drawview3d_render(struct View3D *v3d) ob= duplilist.first; while(ob) { tbase.object= ob; - draw_object(&tbase); + draw_object(&tbase, DRAW_CONSTCOLOR); ob= ob->id.next; } free_duplilist(); @@ -2431,10 +2413,8 @@ void drawview3d_render(struct View3D *v3d) } /* Transp and X-ray afterdraw stuff */ - view3d_draw_xray(v3d); // clears zbuffer if it is used! - view3d_draw_transp(v3d); - - G.f &= ~G_PICKSEL; + view3d_draw_xray(v3d, DRAW_CONSTCOLOR); // clears zbuffer if it is used! + view3d_draw_transp(v3d, DRAW_CONSTCOLOR); } /* first not selected and duplis */ @@ -2449,11 +2429,8 @@ void drawview3d_render(struct View3D *v3d) extern ListBase duplilist; Base tbase; - /* always draw original first because of make_displist */ - draw_object(base); + draw_object(base, 0); - /* patch: color remains constant */ - G.f |= G_PICKSEL; BIF_ThemeColorBlend(TH_WIRE, TH_BACK, 0.5f); tbase.flag= OB_FROMDUPLI; @@ -2461,15 +2438,13 @@ void drawview3d_render(struct View3D *v3d) ob= duplilist.first; while(ob) { tbase.object= ob; - draw_object(&tbase); + draw_object(&tbase, DRAW_CONSTCOLOR); ob= ob->id.next; } free_duplilist(); - - G.f &= ~G_PICKSEL; } else if((base->flag & SELECT)==0) { - draw_object(base); + draw_object(base, 0); } } } @@ -2483,7 +2458,7 @@ void drawview3d_render(struct View3D *v3d) if ( ((base)->flag & SELECT) && ((base)->lay & v3d->lay) ) { if ELEM3(base->object->type, OB_LAMP, OB_CAMERA, OB_LATTICE); - else draw_object(base); + else draw_object(base, 0); } base= base->next; @@ -2492,8 +2467,8 @@ void drawview3d_render(struct View3D *v3d) if(G.scene->radio) RAD_drawall(v3d->drawtype>=OB_SOLID); /* Transp and X-ray afterdraw stuff */ - view3d_draw_xray(v3d); // clears zbuffer if it is used! - view3d_draw_transp(v3d); + view3d_draw_xray(v3d, 0); // clears zbuffer if it is used! + view3d_draw_transp(v3d, 0); if(v3d->flag & V3D_CLIPPING) view3d_clr_clipping(); diff --git a/source/blender/src/view.c b/source/blender/src/view.c index c421f34a838..e13a23691f9 100644 --- a/source/blender/src/view.c +++ b/source/blender/src/view.c @@ -998,10 +998,10 @@ short view3d_opengl_select(unsigned int *buffer, unsigned int bufsize, short x1 code= 1; if(G.obedit && G.obedit->type==OB_MBALL) { - draw_object(BASACT); + draw_object(BASACT, DRAW_PICKING|DRAW_CONSTCOLOR); } else if ((G.obedit && G.obedit->type==OB_ARMATURE)) { - draw_object(BASACT); + draw_object(BASACT, DRAW_PICKING|DRAW_CONSTCOLOR); } else { Base *base; @@ -1011,7 +1011,7 @@ short view3d_opengl_select(unsigned int *buffer, unsigned int bufsize, short x1 if(base->lay & G.vd->lay) { base->selcol= code; glLoadName(code); - draw_object(base); + draw_object(base, DRAW_PICKING|DRAW_CONSTCOLOR); code++; } } |