[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13131] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Jan 4 18:48:07 CET 2008


Revision: 13131
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13131
Author:   blendix
Date:     2008-01-04 18:48:07 +0100 (Fri, 04 Jan 2008)

Log Message:
-----------

- Make dupliverts inside a dupligroup render and draw as instances.
- Possible fix for a dupli render memory leak, but i'm not sure.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_anim.h
    trunk/blender/source/blender/blenkernel/intern/anim.c
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/renderdatabase.c
    trunk/blender/source/blender/src/drawview.c

Modified: trunk/blender/source/blender/blenkernel/BKE_anim.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_anim.h	2008-01-04 13:53:52 UTC (rev 13130)
+++ trunk/blender/source/blender/blenkernel/BKE_anim.h	2008-01-04 17:48:07 UTC (rev 13131)
@@ -44,7 +44,7 @@
 	struct DupliObject *next, *prev;
 	struct Object *ob;
 	unsigned int origlay;
-	int index, no_draw;
+	int index, no_draw, type;
 	float mat[4][4], omat[4][4];
 } DupliObject;
 

Modified: trunk/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim.c	2008-01-04 13:53:52 UTC (rev 13130)
+++ trunk/blender/source/blender/blenkernel/intern/anim.c	2008-01-04 17:48:07 UTC (rev 13131)
@@ -284,7 +284,7 @@
 
 /* ****************** DUPLICATOR ************** */
 
-static DupliObject *new_dupli_object(ListBase *lb, Object *ob, float mat[][4], int lay, int index)
+static DupliObject *new_dupli_object(ListBase *lb, Object *ob, float mat[][4], int lay, int index, int type)
 {
 	DupliObject *dob= MEM_callocN(sizeof(DupliObject), "dupliobject");
 	
@@ -294,6 +294,7 @@
 	Mat4CpyMat4(dob->omat, ob->obmat);
 	dob->origlay= ob->lay;
 	dob->index= index;
+	dob->type= type;
 	ob->lay= lay;
 	
 	return dob;
@@ -321,7 +322,7 @@
 		if(go->ob!=ob) {
 			
 			Mat4MulMat4(mat, go->ob->obmat, ob->obmat);
-			dob= new_dupli_object(lb, go->ob, mat, ob->lay, 0);
+			dob= new_dupli_object(lb, go->ob, mat, ob->lay, 0, OB_DUPLIGROUP);
 			dob->no_draw= (dob->origlay & group->layer)==0;
 			
 			if(go->ob->transflag & OB_DUPLI) {
@@ -360,7 +361,7 @@
 		if(ok) {
 			do_ob_ipo(ob);
 			where_is_object_time(ob, (float)G.scene->r.cfra);
-			new_dupli_object(lb, ob, ob->obmat, ob->lay, G.scene->r.cfra);
+			new_dupli_object(lb, ob, ob->obmat, ob->lay, G.scene->r.cfra, OB_DUPLIFRAMES);
 		}
 	}
 
@@ -405,7 +406,7 @@
 		Mat4CpyMat4(tmat, obmat);
 		Mat4MulMat43(obmat, tmat, mat);
 	}
-	new_dupli_object(vdd->lb, vdd->ob, obmat, vdd->par->lay, index);
+	new_dupli_object(vdd->lb, vdd->ob, obmat, vdd->par->lay, index, OB_DUPLIVERTS);
 	
 	if(vdd->ob->transflag & OB_DUPLI) {
 		float tmpmat[4][4];
@@ -631,7 +632,7 @@
 						Mat4CpyMat4(tmat, obmat);
 						Mat4MulMat43(obmat, tmat, mat);
 						
-						new_dupli_object(lb, ob, obmat, lay, a);
+						new_dupli_object(lb, ob, obmat, lay, a, OB_DUPLIFACES);
 						
 						if(ob->transflag & OB_DUPLI) {
 							float tmpmat[4][4];
@@ -772,7 +773,7 @@
 
 						VECADD(tmat[3], go->ob->obmat[3], state.co);
 
-						new_dupli_object(lb, go->ob, tmat, par->lay, counter);
+						new_dupli_object(lb, go->ob, tmat, par->lay, counter, OB_DUPLIPARTS);
 					}
 				}
 				else {
@@ -789,7 +790,7 @@
 
 					VECCOPY(tmat[3], state.co);
 
-					new_dupli_object(lb, ob, tmat, par->lay, counter);
+					new_dupli_object(lb, ob, tmat, par->lay, counter, OB_DUPLIPARTS);
 				}
 			}
 		}
@@ -867,7 +868,7 @@
 			Mat4CpyMat4(obmat, par->obmat);
 			VECCOPY(obmat[3], vec);
 			
-			new_dupli_object(lb, ob, obmat, par->lay, a);
+			new_dupli_object(lb, ob, obmat, par->lay, a, OB_DUPLIVERTS);
 		}
 		
 	}

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2008-01-04 13:53:52 UTC (rev 13130)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2008-01-04 17:48:07 UTC (rev 13131)
@@ -4067,10 +4067,10 @@
 	return 1;
 }
 
-static int allow_render_dupli_instance(Render *re, Object *ob, Object *obd)
+static int allow_render_dupli_instance(Render *re, DupliObject *dob, Object *obd)
 {
 	return (render_object_type(obd->type) &&
-	        (!(ob->transflag & OB_DUPLIGROUP)) &&
+	        (!(dob->type == OB_DUPLIGROUP)) &&
 	        !(re->r.mode & R_RADIO));
 }
 
@@ -4127,7 +4127,7 @@
 					if(!allow_render_object(obd, nolamps, onlyselected, actob))
 						continue;
 
-					if(allow_render_dupli_instance(re, ob, obd)) {
+					if(allow_render_dupli_instance(re, dob, obd)) {
 						ParticleSystem *psys;
 						int psysindex;
 						float imat[4][4], mat[4][4];

Modified: trunk/blender/source/blender/render/intern/source/renderdatabase.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/renderdatabase.c	2008-01-04 13:53:52 UTC (rev 13130)
+++ trunk/blender/source/blender/render/intern/source/renderdatabase.c	2008-01-04 17:48:07 UTC (rev 13131)
@@ -822,14 +822,11 @@
 		re->totinstance= 0;
 		re->instancetable.first= re->instancetable.last= NULL;
 	}
-	else {
-		BLI_freelistN(&re->instancetable);
 
-		if(re->objecthash) {
-			BLI_ghash_free(re->objecthash, NULL, NULL);
-			re->objecthash= NULL;
-		}
-	}
+	if(re->objecthash) {
+		BLI_ghash_free(re->objecthash, NULL, NULL);
+		re->objecthash= NULL;
+ 	}
 
 	if(re->sortedhalos) {
 		MEM_freeN(re->sortedhalos);
@@ -843,6 +840,7 @@
 
 	BLI_freelistN(&re->customdata_names);
 	BLI_freelistN(&re->objecttable);
+	BLI_freelistN(&re->instancetable);
 }
 
 /* ------------------------------------------------------------------------ */

Modified: trunk/blender/source/blender/src/drawview.c
===================================================================
--- trunk/blender/source/blender/src/drawview.c	2008-01-04 13:53:52 UTC (rev 13130)
+++ trunk/blender/source/blender/src/drawview.c	2008-01-04 17:48:07 UTC (rev 13131)
@@ -2657,10 +2657,6 @@
 	
 	if (base->object->restrictflag & OB_RESTRICT_VIEW) return;
 	
-	/* test if we can do a displist */
-	if(base->object->transflag & OB_DUPLIGROUP)
-		use_displist= 0;
-	
 	tbase.flag= OB_FROMDUPLI|base->flag;
 	lb= object_duplilist(G.scene, base->object);
 
@@ -2689,7 +2685,7 @@
 			if(use_displist == -1) {
 				
 				/* lamp drawing messes with matrices, could be handled smarter... but this works */
-				if(dob->ob->type==OB_LAMP)
+				if(dob->ob->type==OB_LAMP || dob->type==OB_DUPLIGROUP)
 					use_displist= 0;
 				else {
 					/* disable boundbox check for list creation */





More information about the Bf-blender-cvs mailing list