Commit: 1a33fb983bd4ac1db1b5a74d6a00eb80db3d91cb
Author: Antony Riakiotakis
Date:   Tue Feb 10 10:55:26 2015 +0100
Branches: gooseberry
https://developer.blender.org/rB1a33fb983bd4ac1db1b5a74d6a00eb80db3d91cb

Support dupli transparency pass.

Only for gooseberry for now, since it's slightly hacky and adds extra
cost to duplis.

===================================================================

M       source/blender/editors/space_view3d/drawobject.c
M       source/blender/editors/space_view3d/view3d_draw.c

===================================================================

diff --git a/source/blender/editors/space_view3d/drawobject.c 
b/source/blender/editors/space_view3d/drawobject.c
index eae24b3a..b4ea727 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -310,9 +310,6 @@ bool draw_glsl_material(Scene *scene, Object *ob, View3D 
*v3d, const char dt)
 
 static bool check_alpha_pass(Base *base)
 {
-       if (base->flag & OB_FROMDUPLI)
-               return false;
-
        if (G.f & G_PICKSEL)
                return false;
 
@@ -4024,14 +4021,22 @@ static bool draw_mesh_object(Scene *scene, ARegion *ar, 
View3D *v3d, RegionView3
                }
        }
        
-       if ((dflag & DRAW_PICKING) == 0 && (base->flag & OB_FROMDUPLI) == 0 && 
(v3d->flag2 & V3D_RENDER_SHADOW) == 0) {
+       if ((dflag & DRAW_PICKING) == 0 && ((base->flag & OB_FROMDUPLI) == 0 || 
(ob->dtx & OB_DRAWTRANSP)) && (v3d->flag2 & V3D_RENDER_SHADOW) == 0) {
                /* GPU_begin_object_materials checked if this is needed */
                if (do_alpha_after) {
-                       if (ob->dtx & OB_DRAWXRAY) {
+                       /* duplis only for transparency */
+                       if ((ob->dtx & OB_DRAWXRAY) && !(base->flag & 
OB_FROMDUPLI)) {
                                ED_view3d_after_add(&v3d->afterdraw_xraytransp, 
base, dflag);
                        }
                        else {
-                               ED_view3d_after_add(&v3d->afterdraw_transp, 
base, dflag);
+                               if (base->flag & OB_FROMDUPLI) {
+                                       Base *nbase = MEM_mallocN(sizeof(Base), 
"dupli_trans");
+                                       *nbase = *base;
+                                       
ED_view3d_after_add(&v3d->afterdraw_transp, nbase, dflag);
+                               }
+                               else {
+                                       
ED_view3d_after_add(&v3d->afterdraw_transp, base, dflag);
+                               }
                        }
                }
                else if (ob->dtx & OB_DRAWXRAY && ob->dtx & OB_DRAWTRANSP) {
diff --git a/source/blender/editors/space_view3d/view3d_draw.c 
b/source/blender/editors/space_view3d/view3d_draw.c
index c9be94e..553ba56 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -1904,16 +1904,19 @@ typedef struct View3DAfter {
        struct View3DAfter *next, *prev;
        struct Base *base;
        short dflag;
+       float obmat[4][4];
 } View3DAfter;
 
 /* temp storage of Objects that need to be drawn as last */
 void ED_view3d_after_add(ListBase *lb, Base *base, const short dflag)
 {
        View3DAfter *v3da = MEM_callocN(sizeof(View3DAfter), "View 3d after");
-       BLI_assert((base->flag & OB_FROMDUPLI) == 0);
        BLI_addtail(lb, v3da);
        v3da->base = base;
        v3da->dflag = dflag;
+       if (base->flag & OB_FROMDUPLI) {
+               copy_m4_m4(v3da->obmat, base->object->obmat);
+       }
 }
 
 /* disables write in zbuffer and draws it over */
@@ -1925,8 +1928,17 @@ static void view3d_draw_transp(Scene *scene, ARegion 
*ar, View3D *v3d)
        v3d->transp = true;
        
        for (v3da = v3d->afterdraw_transp.first; v3da; v3da = next) {
+               float obmat[4][4];
                next = v3da->next;
+               if (v3da->base->flag & OB_FROMDUPLI) {
+                       copy_m4_m4(obmat, v3da->base->object->obmat);
+                       copy_m4_m4(v3da->base->object->obmat, v3da->obmat);
+               }
                draw_object(scene, ar, v3d, v3da->base, v3da->dflag);
+               if (v3da->base->flag & OB_FROMDUPLI) {
+                       copy_m4_m4(v3da->base->object->obmat, obmat);
+                       MEM_freeN(v3da->base);
+               }
                BLI_remlink(&v3d->afterdraw_transp, v3da);
                MEM_freeN(v3da);
        }
@@ -1959,6 +1971,7 @@ static void view3d_draw_xray(Scene *scene, ARegion *ar, 
View3D *v3d, const bool
 static void view3d_draw_xraytransp(Scene *scene, ARegion *ar, View3D *v3d, 
const bool clear)
 {
        View3DAfter *v3da, *next;
+       float obmat[4][4];
 
        if (clear && v3d->zbuf)
                glClear(GL_DEPTH_BUFFER_BIT);
@@ -1968,7 +1981,15 @@ static void view3d_draw_xraytransp(Scene *scene, ARegion 
*ar, View3D *v3d, const
        
        for (v3da = v3d->afterdraw_xraytransp.first; v3da; v3da = next) {
                next = v3da->next;
+               if (v3da->base->flag & OB_FROMDUPLI) {
+                       copy_m4_m4(obmat, v3da->base->object->obmat);
+                       copy_m4_m4(v3da->base->object->obmat, v3da->obmat);
+               }
                draw_object(scene, ar, v3d, v3da->base, v3da->dflag);
+               if (v3da->base->flag & OB_FROMDUPLI) {
+                       copy_m4_m4(v3da->base->object->obmat, obmat);
+                       MEM_freeN(v3da->base);
+               }
                BLI_remlink(&v3d->afterdraw_xraytransp, v3da);
                MEM_freeN(v3da);
        }
@@ -2068,7 +2089,7 @@ static void draw_dupli_objects_color(
                 * slow it down too much */
                dtx = tbase.object->dtx;
                if (tbase.object->dt != OB_BOUNDBOX)
-                       tbase.object->dtx = base->object->dtx;
+                       tbase.object->dtx = base->object->dtx | (dtx & 
OB_DRAWTRANSP);
 
                /* negative scale flag has to propagate */
                transflag = tbase.object->transflag;
@@ -2113,7 +2134,8 @@ static void draw_dupli_objects_color(
                                     !bb_tmp ||
                                     draw_glsl_material(scene, dob->ob, v3d, 
dt) ||
                                     check_object_draw_texture(scene, v3d, dt) 
||
-                                    (v3d->flag2 & V3D_SOLID_MATCAP) != 0)
+                                    (v3d->flag2 & V3D_SOLID_MATCAP) != 0 ||
+                                    ((dtx & OB_DRAWTRANSP) != 0))
                                {
                                        // printf("draw_dupli_objects_color: 
skipping displist for %s\n", dob->ob->id.name + 2);
                                        use_displist = false;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to