diff --git a/source/blender/blenkernel/BKE_anim.h b/source/blender/blenkernel/BKE_anim.h index d77677fa748..c7808331d7e 100644 --- a/source/blender/blenkernel/BKE_anim.h +++ b/source/blender/blenkernel/BKE_anim.h @@ -44,7 +44,7 @@ typedef struct DupliObject { struct DupliObject *next, *prev; struct Object *ob; unsigned int origlay; - int index; + int index, no_draw; float mat[4][4], omat[4][4]; } DupliObject; diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index 0bb0b65bb83..4d58e2b46b6 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -279,7 +279,7 @@ int where_on_path(Object *ob, float ctime, float *vec, float *dir) /* returns OK static DupliObject *new_dupli_object(ListBase *lb, Object *ob, float mat[][4], int lay, int index) { - DupliObject *dob= MEM_mallocN(sizeof(DupliObject), "dupliobject"); + DupliObject *dob= MEM_callocN(sizeof(DupliObject), "dupliobject"); BLI_addtail(lb, dob); dob->ob= ob; @@ -318,9 +318,11 @@ static void group_duplilist(ListBase *lb, Object *ob, int level) group_handle_recalc_and_update(ob, group); for(go= group->gobject.first; go; go= go->next) { - if(go->ob!=ob && (go->ob->lay & group->layer)) { + /* note, if you check on layer here, render goes wrong... it still deforms verts and uses parent imat */ + if(go->ob!=ob) { Mat4MulMat4(mat, go->ob->obmat, ob->obmat); dob= new_dupli_object(lb, go->ob, mat, ob->lay, 0); + dob->no_draw= (dob->origlay & group->layer)==0; if(go->ob->dup_group) { Mat4CpyMat4(dob->ob->obmat, dob->mat); group_duplilist(lb, go->ob, level+1); diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c index 3e104a2e623..1fdbfab4642 100644 --- a/source/blender/src/buttons_object.c +++ b/source/blender/src/buttons_object.c @@ -1788,16 +1788,16 @@ static void object_panel_object(Object *ob) /* layers */ uiBlockBeginAlign(block); for(a=0; a<5; a++) - uiDefButBitI(block, TOG, 1<layer), 0, 0, 0, 0, ""); + uiDefButBitI(block, TOG, 1<layer), 0, 0, 0, 0, ""); for(a=0; a<5; a++) - uiDefButBitI(block, TOG, 1<<(a+10), B_REDR+a+10, "", (short)(xco+a*(dx/2)), 105-yco, (short)(dx/2), (short)(dy/2), &(group->layer), 0, 0, 0, 0, ""); + uiDefButBitI(block, TOG, 1<<(a+10), REDRAWVIEW3D, "", (short)(xco+a*(dx/2)), 105-yco, (short)(dx/2), (short)(dy/2), &(group->layer), 0, 0, 0, 0, ""); xco+= 7; uiBlockBeginAlign(block); for(a=5; a<10; a++) - uiDefButBitI(block, TOG, 1<layer), 0, 0, 0, 0, ""); + uiDefButBitI(block, TOG, 1<layer), 0, 0, 0, 0, ""); for(a=5; a<10; a++) - uiDefButBitI(block, TOG, 1<<(a+10), B_REDR+a+10, "", (short)(xco+a*(dx/2)), 105-yco, (short)(dx/2), (short)(dy/2), &(group->layer), 0, 0, 0, 0, ""); + uiDefButBitI(block, TOG, 1<<(a+10), REDRAWVIEW3D, "", (short)(xco+a*(dx/2)), 105-yco, (short)(dx/2), (short)(dy/2), &(group->layer), 0, 0, 0, 0, ""); uiBlockEndAlign(block); diff --git a/source/blender/src/drawview.c b/source/blender/src/drawview.c index 6d760bf29be..ee7b462f1da 100644 --- a/source/blender/src/drawview.c +++ b/source/blender/src/drawview.c @@ -2645,25 +2645,28 @@ static void draw_dupli_objects(View3D *v3d, Base *base) lb= object_duplilist(G.scene, base->object); for(dob= lb->first; dob; dob= dob->next) { - tbase.object= dob->ob; - - Mat4CpyMat4(dob->ob->obmat, dob->mat); - - /* extra service: draw the duplicator in drawtype of parent */ - dt= tbase.object->dt; tbase.object->dt= base->object->dt; - dtx= tbase.object->dtx; tbase.object->dtx= base->object->dtx; - - /* negative scale flag has to propagate */ - transflag= tbase.object->transflag; - if(base->object->transflag & OB_NEG_SCALE) - tbase.object->transflag ^= OB_NEG_SCALE; - - BIF_ThemeColorBlend(color, TH_BACK, 0.5); - draw_object(&tbase, DRAW_CONSTCOLOR); - - tbase.object->dt= dt; - tbase.object->dtx= dtx; - tbase.object->transflag= transflag; + if(dob->no_draw); + else { + tbase.object= dob->ob; + + Mat4CpyMat4(dob->ob->obmat, dob->mat); + + /* extra service: draw the duplicator in drawtype of parent */ + dt= tbase.object->dt; tbase.object->dt= base->object->dt; + dtx= tbase.object->dtx; tbase.object->dtx= base->object->dtx; + + /* negative scale flag has to propagate */ + transflag= tbase.object->transflag; + if(base->object->transflag & OB_NEG_SCALE) + tbase.object->transflag ^= OB_NEG_SCALE; + + BIF_ThemeColorBlend(color, TH_BACK, 0.5); + draw_object(&tbase, DRAW_CONSTCOLOR); + + tbase.object->dt= dt; + tbase.object->dtx= dtx; + tbase.object->transflag= transflag; + } } /* Transp afterdraw disabled, afterdraw only stores base pointers, and duplis can be same obj */