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.
This commit is contained in:
Ton Roosendaal
2005-11-28 16:59:12 +00:00
parent ea16a99f57
commit 413a86e5d9
5 changed files with 82 additions and 93 deletions

View File

@@ -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);

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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();

View File

@@ -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++;
}
}