diff options
Diffstat (limited to 'source/blender/src/drawobject.c')
-rw-r--r-- | source/blender/src/drawobject.c | 76 |
1 files changed, 41 insertions, 35 deletions
diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index 10fdbee4dba..b4bdd066ed4 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -158,7 +158,7 @@ static int set_gl_material(int nr) } /* returns 1: when there's alpha needed to be drawn in a 2nd pass */ -static int init_gl_materials(Object *ob) +static int init_gl_materials(Object *ob, int check_alpha) { extern Material defmaterial; // render module abuse... Material *ma; @@ -189,7 +189,7 @@ static int init_gl_materials(Object *ob) matbuf[a][0][2]= (ma->ref+ma->emit)*ma->b; /* draw transparent, not in pick-select, nor editmode */ - if(!(G.f & G_PICKSEL) && (ob->dtx & OB_DRAWTRANSP) && !(G.obedit && G.obedit->data==ob->data)) { + if(check_alpha && !(G.f & G_PICKSEL) && (ob->dtx & OB_DRAWTRANSP) && !(G.obedit && G.obedit->data==ob->data)) { if(G.vd->transp) { // drawing the transparent pass if(ma->alpha==1.0) matbuf[a][0][3]= 0.0; // means skip solid else matbuf[a][0][3]= ma->alpha; @@ -1754,8 +1754,9 @@ static int wpaint__setSolidDrawOptions(void *userData, int index, int *drawSmoot return 1; } -static void draw_mesh_fancy(Object *ob, DerivedMesh *baseDM, DerivedMesh *dm, int dt) +static void draw_mesh_fancy(Base *base, DerivedMesh *baseDM, DerivedMesh *dm, int dt) { + Object *ob= base->object; Mesh *me = ob->data; Material *ma= give_current_material(ob, 1); int hasHaloMat = (ma && (ma->mode&MA_HALO)); @@ -1780,7 +1781,7 @@ static void draw_mesh_fancy(Object *ob, DerivedMesh *baseDM, DerivedMesh *dm, in } else if( (ob==OBACT && (G.f & G_FACESELECT)) || (G.vd->drawtype==OB_TEXTURE && dt>OB_SOLID)) { - if ((G.vd->flag&V3D_SELECT_OUTLINE) && (ob->flag&SELECT) && !(G.f&(G_FACESELECT|G_PICKSEL)) && !draw_wire) { + if ((G.vd->flag&V3D_SELECT_OUTLINE) && (base->flag&SELECT) && !(G.f&(G_FACESELECT|G_PICKSEL)) && !draw_wire) { draw_mesh_object_outline(ob, dm); } @@ -1788,7 +1789,7 @@ static void draw_mesh_fancy(Object *ob, DerivedMesh *baseDM, DerivedMesh *dm, in } else if(dt==OB_SOLID ) { - if ((G.vd->flag&V3D_SELECT_OUTLINE) && (ob->flag&SELECT) && !draw_wire) { + if ((G.vd->flag&V3D_SELECT_OUTLINE) && (base->flag&SELECT) && !draw_wire) { draw_mesh_object_outline(ob, dm); } @@ -1802,7 +1803,7 @@ static void draw_mesh_fancy(Object *ob, DerivedMesh *baseDM, DerivedMesh *dm, in glFrontFace(GL_CCW); glDisable(GL_LIGHTING); - if(ob->flag & SELECT) { + if(base->flag & SELECT) { BIF_ThemeColor((ob==OBACT)?TH_ACTIVE:TH_SELECT); } else { BIF_ThemeColor(TH_WIRE); @@ -1836,11 +1837,11 @@ static void draw_mesh_fancy(Object *ob, DerivedMesh *baseDM, DerivedMesh *dm, in else { dl = ob->disp.first; if (!dl || !dl->col1) { - shadeDispList(ob); + shadeDispList(base); dl = find_displist(&ob->disp, DL_VERTCOL); } - if ((G.vd->flag&V3D_SELECT_OUTLINE) && (ob->flag&SELECT) && !draw_wire) { + if ((G.vd->flag&V3D_SELECT_OUTLINE) && (base->flag&SELECT) && !draw_wire) { draw_mesh_object_outline(ob, dm); } @@ -1852,7 +1853,7 @@ static void draw_mesh_fancy(Object *ob, DerivedMesh *baseDM, DerivedMesh *dm, in dm->drawFacesColored(dm, me->flag&ME_TWOSIDED, (unsigned char*) obCol1, (unsigned char*) obCol2); } - if(ob->flag & SELECT) { + if(base->flag & SELECT) { BIF_ThemeColor((ob==OBACT)?TH_ACTIVE:TH_SELECT); } else { BIF_ThemeColor(TH_WIRE); @@ -1866,7 +1867,7 @@ static void draw_mesh_fancy(Object *ob, DerivedMesh *baseDM, DerivedMesh *dm, in * overlaying the wires. */ if (dt!=OB_WIRE) { - if(ob->flag & SELECT) { + if(base->flag & SELECT) { BIF_ThemeColor((ob==OBACT)?TH_ACTIVE:TH_SELECT); } else { BIF_ThemeColor(TH_WIRE); @@ -1914,7 +1915,7 @@ static int draw_mesh_object(Base *base, int dt) cageDM = editmesh_get_derived_cage_and_final(&finalDM, &cageNeedsFree, &finalNeedsFree); } - if(dt>OB_WIRE) init_gl_materials(ob); // no transp in editmode, the fancy draw over goes bad then + if(dt>OB_WIRE) init_gl_materials(ob, 0); // no transp in editmode, the fancy draw over goes bad then draw_em_fancy(ob, G.editMesh, cageDM, finalDM, dt); if (cageNeedsFree) cageDM->release(cageDM); @@ -1928,8 +1929,8 @@ static int draw_mesh_object(Base *base, int dt) DerivedMesh *baseDM = mesh_get_derived_deform(ob, &baseDMneedsFree); DerivedMesh *realDM = mesh_get_derived_final(ob, &realDMneedsFree); - if(dt==OB_SOLID) has_alpha= init_gl_materials(ob); - if(baseDM && realDM) draw_mesh_fancy(ob, baseDM, realDM, dt); + if(dt==OB_SOLID) has_alpha= init_gl_materials(ob, (base->flag & OB_FROMDUPLI)==0); + if(baseDM && realDM) draw_mesh_fancy(base, baseDM, realDM, dt); if(me->totvert==0) retval= 1; @@ -2352,8 +2353,9 @@ static void drawDispListshaded(ListBase *lb, Object *ob) } /* returns 1 when nothing was drawn */ -static int drawDispList(Object *ob, int dt) +static int drawDispList(Base *base, int dt) { + Object *ob= base->object; ListBase *lb=0; DispList *dl; Curve *cu; @@ -2382,11 +2384,11 @@ static int drawDispList(Object *ob, int dt) } else { if(dt==OB_SHADED) { - if(ob->disp.first==0) shadeDispList(ob); + if(ob->disp.first==0) shadeDispList(base); drawDispListshaded(lb, ob); } else { - init_gl_materials(ob); + init_gl_materials(ob, 0); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0); drawDispListsolid(lb, ob); } @@ -2416,11 +2418,11 @@ static int drawDispList(Object *ob, int dt) if(dl->nors==NULL) addnormalsDispList(ob, lb); if(dt==OB_SHADED) { - if(ob->disp.first==NULL) shadeDispList(ob); + if(ob->disp.first==NULL) shadeDispList(base); drawDispListshaded(lb, ob); } else { - init_gl_materials(ob); + init_gl_materials(ob, 0); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0); drawDispListsolid(lb, ob); @@ -2441,11 +2443,11 @@ static int drawDispList(Object *ob, int dt) if(dt==OB_SHADED) { dl= lb->first; - if(dl && dl->col1==0) shadeDispList(ob); + if(dl && dl->col1==0) shadeDispList(base); drawDispListshaded(lb, ob); } else { - init_gl_materials(ob); + init_gl_materials(ob, 0); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0); drawDispListsolid(lb, ob); @@ -2789,15 +2791,16 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel) } } -static void drawnurb(Object *ob, Nurb *nurb, int dt) +static void drawnurb(Base *base, Nurb *nurb, int dt) { + Object *ob= base->object; Curve *cu = ob->data; Nurb *nu; BevList *bl; /* DispList */ BIF_ThemeColor(TH_WIRE); - drawDispList(ob, dt); + drawDispList(base, dt); if(G.vd->zbuf) glDisable(GL_DEPTH_TEST); @@ -3066,8 +3069,9 @@ void drawcircball(int mode, float *cent, float rad, float tmat[][4]) } /* return 1 if nothing was drawn */ -static int drawmball(Object *ob, int dt) +static int drawmball(Base *base, int dt) { + Object *ob= base->object; MetaBall *mb; MetaElem *ml; float imat[4][4], tmat[4][4]; @@ -3077,11 +3081,12 @@ static int drawmball(Object *ob, int dt) if(ob==G.obedit) { BIF_ThemeColor(TH_WIRE); - if((G.f & G_PICKSEL)==0 ) drawDispList(ob, dt); + if((G.f & G_PICKSEL)==0 ) drawDispList(base, dt); ml= editelems.first; } else { - drawDispList(ob, dt); + if((base->flag & OB_FROMDUPLI)==0) + drawDispList(base, dt); ml= mb->elems.first; } @@ -3406,7 +3411,8 @@ static void drawSolidSelect(Base *base) drawDispListwire(&cu->disp); } } else if (ob->type==OB_MBALL) { - drawDispListwire(&ob->disp); + if((base->flag & OB_FROMDUPLI)==0) + drawDispListwire(&ob->disp); } else if(ob->type==OB_ARMATURE) { if(!(ob->flag & OB_POSEMODE)) { @@ -3495,7 +3501,7 @@ void draw_object(Base *base, int flag) ob= base->object; /* xray delay? */ - if((flag & DRAW_PICKING)==0 && (ob->flag & OB_FROMDUPLI)==0) { + if((flag & DRAW_PICKING)==0 && (base->flag & OB_FROMDUPLI)==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); @@ -3703,10 +3709,10 @@ void draw_object(Base *base, int flag) if (cu->flag & CU_FAST) { cpack(0xFFFFFF); set_inverted_drawing(1); - drawDispList(ob, OB_WIRE); + drawDispList(base, OB_WIRE); set_inverted_drawing(0); } else { - drawDispList(ob, dt); + drawDispList(base, dt); } if (cu->linewidth != 0.0) { @@ -3781,7 +3787,7 @@ void draw_object(Base *base, int flag) else if(dt==OB_BOUNDBOX) draw_bounding_volume(ob); else if(boundbox_clip(ob->obmat, cu->bb)) - empty_object= drawDispList(ob, dt); + empty_object= drawDispList(base, dt); break; case OB_CURVE: @@ -3791,21 +3797,21 @@ void draw_object(Base *base, int flag) if (cu->disp.first==NULL) makeDispListCurveTypes(ob, 0); if(ob==G.obedit) { - drawnurb(ob, editNurb.first, dt); + drawnurb(base, editNurb.first, dt); } else if(dt==OB_BOUNDBOX) draw_bounding_volume(ob); else if(boundbox_clip(ob->obmat, cu->bb)) - empty_object= drawDispList(ob, dt); + empty_object= drawDispList(base, dt); break; case OB_MBALL: if(ob==G.obedit) - drawmball(ob, dt); + drawmball(base, dt); else if(dt==OB_BOUNDBOX) draw_bounding_volume(ob); else - empty_object= drawmball(ob, dt); + empty_object= drawmball(base, dt); break; case OB_EMPTY: drawaxes(1.0, flag); @@ -4155,7 +4161,7 @@ void draw_object_instance(Object *ob, int dt, int outline) draw_mesh_object_outline(ob, dm?dm:edm); if(dm) - init_gl_materials(ob); + init_gl_materials(ob, 0); else { glEnable(GL_COLOR_MATERIAL); BIF_ThemeColor(TH_BONE_SOLID); |