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:
Diffstat (limited to 'source/blender/src/drawobject.c')
-rw-r--r--source/blender/src/drawobject.c76
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);