[Bf-blender-cvs] [1a33fb9] gooseberry: Support dupli transparency pass.

Antony Riakiotakis noreply at git.blender.org
Tue Feb 10 10:58:00 CET 2015


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;




More information about the Bf-blender-cvs mailing list