[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31579] trunk/blender/source/blender: simplify pass drawing, give each pass its own list, avoids some context switching.

Campbell Barton ideasman42 at gmail.com
Wed Aug 25 16:23:02 CEST 2010


Revision: 31579
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31579
Author:   campbellbarton
Date:     2010-08-25 16:23:02 +0200 (Wed, 25 Aug 2010)

Log Message:
-----------
simplify pass drawing, give each pass its own list, avoids some context switching.
- also fixes a problem where xray+transp+alpha1.0 objects wouldnt draw at all.
- the patch worked by adding twice but this leaked memory.
- solve by adding the xraytransp object to the xray list if the alpha is 1.0

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/editors/space_view3d/space_view3d.c
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
    trunk/blender/source/blender/editors/space_view3d/view3d_intern.h
    trunk/blender/source/blender/makesdna/DNA_view3d_types.h

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2010-08-25 12:01:15 UTC (rev 31578)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2010-08-25 14:23:02 UTC (rev 31579)
@@ -5079,7 +5079,9 @@
 					direct_link_gpencil(fd, v3d->gpd);
 				}
 				v3d->localvd= newdataadr(fd, v3d->localvd);
-				v3d->afterdraw.first= v3d->afterdraw.last= NULL;
+				v3d->afterdraw_transp.first= v3d->afterdraw_transp.last= NULL;
+				v3d->afterdraw_xray.first= v3d->afterdraw_xray.last= NULL;
+				v3d->afterdraw_xraytransp.first= v3d->afterdraw_xraytransp.last= NULL;
 				v3d->properties_storage= NULL;
 				
 				view3d_split_250(v3d, &sl->regionbase);

Modified: trunk/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawobject.c	2010-08-25 12:01:15 UTC (rev 31578)
+++ trunk/blender/source/blender/editors/space_view3d/drawobject.c	2010-08-25 14:23:02 UTC (rev 31579)
@@ -901,7 +901,7 @@
 	
 	if(drawcone && !v3d->transp) {
 		/* in this case we need to draw delayed */
-		add_view3d_after(v3d, base, V3D_TRANSP, flag);
+		add_view3d_after(&v3d->afterdraw_transp, base, flag);
 		return;
 	}
 	
@@ -2769,7 +2769,20 @@
 	}
 	
 	/* GPU_begin_object_materials checked if this is needed */
-	if(do_alpha_pass) add_view3d_after(v3d, base, V3D_TRANSP, flag);
+	if(do_alpha_pass) {
+		if(ob->dtx & OB_DRAWXRAY) {
+			add_view3d_after(&v3d->afterdraw_xraytransp, base, flag);
+		}
+		else {
+			add_view3d_after(&v3d->afterdraw_transp, base, flag);
+		}
+	}
+	else if(ob->dtx & OB_DRAWXRAY && ob->dtx & OB_DRAWTRANSP) {
+		/* special case xray+transp when alpha is 1.0, without this the object vanishes */
+		if(v3d->xray == 0 && v3d->transp == 0) {
+			add_view3d_after(&v3d->afterdraw_xray, base, flag);
+		}
+	}
 	
 	return retval;
 }
@@ -5537,13 +5550,8 @@
 		/* don't do xray in particle mode, need the z-buffer */
 		if(!(ob->mode & OB_MODE_PARTICLE_EDIT)) {
 			/* xray and transp are set when it is drawing the 2nd/3rd pass */
-			if(!v3d->xray && !v3d->transp && (ob->dtx & OB_DRAWXRAY)) {
-				if(ob->dtx & OB_DRAWTRANSP) {
-					add_view3d_after(v3d, base, V3D_XRAYTRANSP, flag);
-				}
-				else {
-					add_view3d_after(v3d, base, V3D_XRAY, flag);
-				}
+			if(!v3d->xray && !v3d->transp && (ob->dtx & OB_DRAWXRAY) && !(ob->dtx & OB_DRAWTRANSP)) {
+				add_view3d_after(&v3d->afterdraw_xray, base, flag);
 				return;
 			}
 		}

Modified: trunk/blender/source/blender/editors/space_view3d/space_view3d.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/space_view3d.c	2010-08-25 12:01:15 UTC (rev 31578)
+++ trunk/blender/source/blender/editors/space_view3d/space_view3d.c	2010-08-25 14:23:02 UTC (rev 31579)
@@ -270,7 +270,6 @@
 	if(vd->localvd) MEM_freeN(vd->localvd);
 	
 	if(vd->properties_storage) MEM_freeN(vd->properties_storage);
-	
 }
 
 

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2010-08-25 12:01:15 UTC (rev 31578)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2010-08-25 14:23:02 UTC (rev 31579)
@@ -1419,52 +1419,18 @@
 typedef struct View3DAfter {
 	struct View3DAfter *next, *prev;
 	struct Base *base;
-	int type, flag;
+	int flag;
 } View3DAfter;
 
 /* temp storage of Objects that need to be drawn as last */
-void add_view3d_after(View3D *v3d, Base *base, int type, int flag)
+void add_view3d_after(ListBase *lb, Base *base, int flag)
 {
 	View3DAfter *v3da= MEM_callocN(sizeof(View3DAfter), "View 3d after");
-	
-	BLI_addtail(&v3d->afterdraw, v3da);
+	BLI_addtail(lb, v3da);
 	v3da->base= base;
-	v3da->type= type;
 	v3da->flag= flag;
 }
 
-/* clears zbuffer and draws it over */
-static void view3d_draw_xray(Scene *scene, ARegion *ar, View3D *v3d, int clear)
-{
-	View3DAfter *v3da, *next;
-	int doit= 0;
-	
-	for(v3da= v3d->afterdraw.first; v3da; v3da= v3da->next)
-		if(v3da->type==V3D_XRAY || v3da->type==V3D_XRAYTRANSP) doit= 1;
-	
-	if(doit) {
-		if(clear && v3d->zbuf) glClear(GL_DEPTH_BUFFER_BIT);
-		v3d->xray= TRUE;
-		
-		for(v3da= v3d->afterdraw.first; v3da; v3da= next) {
-			next= v3da->next;
-			if(v3da->type==V3D_XRAY) {
-				draw_object(scene, ar, v3d, v3da->base, v3da->flag);
-				BLI_remlink(&v3d->afterdraw, v3da);
-				MEM_freeN(v3da);
-			}
-			else if(v3da->type==V3D_XRAYTRANSP){ 
-				v3d->transp= TRUE;
-				draw_object(scene, ar, v3d, v3da->base, v3da->flag);
-				BLI_remlink(&v3d->afterdraw, v3da);
-				MEM_freeN(v3da);
-				v3d->transp= FALSE;
-			}
-		}
-		v3d->xray= FALSE;
-	}
-}
-
 /* disables write in zbuffer and draws it over */
 static void view3d_draw_transp(Scene *scene, ARegion *ar, View3D *v3d)
 {
@@ -1473,13 +1439,11 @@
 	glDepthMask(0);
 	v3d->transp= TRUE;
 	
-	for(v3da= v3d->afterdraw.first; v3da; v3da= next) {
+	for(v3da= v3d->afterdraw_transp.first; v3da; v3da= next) {
 		next= v3da->next;
-		if(v3da->type==V3D_TRANSP) {
-			draw_object(scene, ar, v3d, v3da->base, v3da->flag);
-			BLI_remlink(&v3d->afterdraw, v3da);
-			MEM_freeN(v3da);
-		}
+		draw_object(scene, ar, v3d, v3da->base, v3da->flag);
+		BLI_remlink(&v3d->afterdraw_transp, v3da);
+		MEM_freeN(v3da);
 	}
 	v3d->transp= FALSE;
 	
@@ -1487,6 +1451,48 @@
 	
 }
 
+/* clears zbuffer and draws it over */
+static void view3d_draw_xray(Scene *scene, ARegion *ar, View3D *v3d, int clear)
+{
+	View3DAfter *v3da, *next;
+
+	if(clear && v3d->zbuf)
+		glClear(GL_DEPTH_BUFFER_BIT);
+
+	v3d->xray= TRUE;
+	for(v3da= v3d->afterdraw_xray.first; v3da; v3da= next) {
+		next= v3da->next;
+		draw_object(scene, ar, v3d, v3da->base, v3da->flag);
+		BLI_remlink(&v3d->afterdraw_xray, v3da);
+		MEM_freeN(v3da);
+	}
+	v3d->xray= FALSE;
+}
+
+
+/* clears zbuffer and draws it over */
+static void view3d_draw_xraytransp(Scene *scene, ARegion *ar, View3D *v3d, int clear)
+{
+	View3DAfter *v3da, *next;
+
+	if(clear && v3d->zbuf)
+		glClear(GL_DEPTH_BUFFER_BIT);
+
+	v3d->xray= TRUE;
+	v3d->transp= TRUE;
+	
+	for(v3da= v3d->afterdraw_xraytransp.first; v3da; v3da= next) {
+		next= v3da->next;
+		draw_object(scene, ar, v3d, v3da->base, v3da->flag);
+		BLI_remlink(&v3d->afterdraw_xraytransp, v3da);
+		MEM_freeN(v3da);
+	}
+
+	v3d->transp= FALSE;
+	v3d->xray= FALSE;
+
+}
+
 /* *********************** */
 
 /*
@@ -1747,41 +1753,57 @@
 	}
 	
 	/* this isnt that nice, draw xray objects as if they are normal */
-	if (v3d->afterdraw.first) {
+	if (	v3d->afterdraw_transp.first ||
+			v3d->afterdraw_xray.first || 
+			v3d->afterdraw_xraytransp.first
+	) {
 		View3DAfter *v3da, *next;
-		int num = 0;
 		int mask_orig;
+
 		v3d->xray= TRUE;
 		
 		/* transp materials can change the depth mask, see #21388 */
 		glGetIntegerv(GL_DEPTH_WRITEMASK, &mask_orig);
 
-		glDepthFunc(GL_ALWAYS); /* always write into the depth bufer, overwriting front z values */
-		for(v3da= v3d->afterdraw.first; v3da; v3da= next) {
-			next= v3da->next;
-			if(v3da->type==V3D_XRAY) {
+
+		if(v3d->afterdraw_xray.first || v3d->afterdraw_xraytransp.first) {
+			glDepthFunc(GL_ALWAYS); /* always write into the depth bufer, overwriting front z values */
+			for(v3da= v3d->afterdraw_xray.first; v3da; v3da= next) {
+				next= v3da->next;
 				draw_object(scene, ar, v3d, v3da->base, 0);
-				num++;
 			}
-			/* dont remove this time */
+			glDepthFunc(GL_LEQUAL); /* Now write the depth buffer normally */
 		}
+
+		/* draw 3 passes, transp/xray/xraytransp */
 		v3d->xray= FALSE;
-		
-		glDepthFunc(GL_LEQUAL); /* Now write the depth buffer normally */
-		for(v3da= v3d->afterdraw.first; v3da; v3da= next) {
+		v3d->transp= TRUE;
+		for(v3da= v3d->afterdraw_transp.first; v3da; v3da= next) {
 			next= v3da->next;
-			if(v3da->type==V3D_XRAY) {
-				v3d->xray= TRUE; v3d->transp= FALSE;  
-			} else if (v3da->type==V3D_TRANSP) {
-				v3d->xray= FALSE; v3d->transp= TRUE;
-			} else if (v3da->type == V3D_XRAYTRANSP) {
-				v3d->xray= TRUE; v3d->transp= TRUE;
-			}
-			
-			draw_object(scene, ar, v3d, v3da->base, 0); /* Draw Xray or Transp objects normally */
-			BLI_remlink(&v3d->afterdraw, v3da);
+			draw_object(scene, ar, v3d, v3da->base, 0);
+			BLI_remlink(&v3d->afterdraw_transp, v3da);
 			MEM_freeN(v3da);
 		}
+
+		v3d->xray= TRUE;
+		v3d->transp= FALSE;  
+		for(v3da= v3d->afterdraw_xray.first; v3da; v3da= next) {
+			next= v3da->next;
+			draw_object(scene, ar, v3d, v3da->base, 0);
+			BLI_remlink(&v3d->afterdraw_xray, v3da);
+			MEM_freeN(v3da);
+		}
+
+		v3d->xray= TRUE;
+		v3d->transp= TRUE;
+		for(v3da= v3d->afterdraw_xraytransp.first; v3da; v3da= next) {
+			next= v3da->next;
+			draw_object(scene, ar, v3d, v3da->base, 0);
+			BLI_remlink(&v3d->afterdraw_xraytransp, v3da);
+			MEM_freeN(v3da);
+		}
+
+		
 		v3d->xray= FALSE;
 		v3d->transp= FALSE;
 
@@ -2059,8 +2081,9 @@
 	}
 
 	/* transp and X-ray afterdraw stuff */
-	view3d_draw_transp(scene, ar, v3d);
-	view3d_draw_xray(scene, ar, v3d, 1);	// clears zbuffer if it is used!
+	if(v3d->afterdraw_transp.first)		view3d_draw_transp(scene, ar, v3d);
+	if(v3d->afterdraw_xray.first)		view3d_draw_xray(scene, ar, v3d, 1);	// clears zbuffer if it is used!
+	if(v3d->afterdraw_xraytransp.first)	view3d_draw_xraytransp(scene, ar, v3d, 1);
 
 	/* cleanup */
 	if(v3d->zbuf) {
@@ -2378,8 +2401,9 @@
 //	REEB_draw();
 	
 	/* Transp and X-ray afterdraw stuff */
-	view3d_draw_transp(scene, ar, v3d);
-	view3d_draw_xray(scene, ar, v3d, 1);	// clears zbuffer if it is used!
+	if(v3d->afterdraw_transp.first)		view3d_draw_transp(scene, ar, v3d);
+	if(v3d->afterdraw_xray.first)		view3d_draw_xray(scene, ar, v3d, 1);	// clears zbuffer if it is used!
+	if(v3d->afterdraw_xraytransp.first)	view3d_draw_xraytransp(scene, ar, v3d, 1);
 	
 	ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_VIEW);
 	

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_intern.h
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_intern.h	2010-08-25 12:01:15 UTC (rev 31578)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_intern.h	2010-08-25 14:23:02 UTC (rev 31579)
@@ -126,7 +126,7 @@
 void draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d);
 void view3d_clr_clipping(void);
 void view3d_set_clipping(RegionView3D *rv3d);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list