Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2005-11-28 19:59:12 +0300
committerTon Roosendaal <ton@blender.org>2005-11-28 19:59:12 +0300
commit413a86e5d9b792d2346c5b1ea1a5bc364af09e60 (patch)
treebd9989140e7856ca983cbf8a0b121c3f0492cd5f /source/blender
parentea16a99f57d5741f5e39a15b12df693b658bb22c (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.h11
-rw-r--r--source/blender/src/drawarmature.c4
-rw-r--r--source/blender/src/drawobject.c83
-rw-r--r--source/blender/src/drawview.c71
-rw-r--r--source/blender/src/view.c6
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++;
}
}