[Bf-blender-cvs] [129ab67] gooseberry: Use the temporary 'is_dupli' flag to prevent objects from freeing overriden data that is owned by the cache.

Lukas Tönne noreply at git.blender.org
Mon Mar 23 13:04:34 CET 2015


Commit: 129ab67f2ea07e0b8c10eeef4798ddbdc258bca7
Author: Lukas Tönne
Date:   Fri Mar 20 10:39:40 2015 +0100
Branches: gooseberry
https://developer.blender.org/rB129ab67f2ea07e0b8c10eeef4798ddbdc258bca7

Use the temporary 'is_dupli' flag to prevent objects from freeing
overriden data that is owned by the cache.

This is not at all nice ... Hopefully it doesn't get too complicated to
work around all these drawing code and depsgraph issues, so the code
can be understood and replaced at some point in the future.

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

M	source/blender/blenkernel/intern/object.c
M	source/blender/editors/space_view3d/drawobject.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/makesdna/DNA_object_types.h

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

diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index c45b246..b869406 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -320,9 +320,12 @@ void BKE_object_free_derived_caches(Object *ob)
 	}
 
 	if (ob->derivedFinal) {
-		ob->derivedFinal->needsFree = 1;
-		ob->derivedFinal->release(ob->derivedFinal);
-		ob->derivedFinal = NULL;
+		/* dupli cache owns the derivedFinal, is freed by duplicator object */
+		if (!(ob->transflag & OB_IS_DUPLI_CACHE)) {
+			ob->derivedFinal->needsFree = 1;
+			ob->derivedFinal->release(ob->derivedFinal);
+			ob->derivedFinal = NULL;
+		}
 	}
 	if (ob->derivedDeform) {
 		ob->derivedDeform->needsFree = 1;
@@ -331,6 +334,8 @@ void BKE_object_free_derived_caches(Object *ob)
 	}
 	
 	BKE_object_free_curve_cache(ob);
+	
+	BKE_object_dupli_cache_clear(ob);
 }
 
 void BKE_object_free_caches(Object *object)
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 26bd448..000cf7f 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -8091,7 +8091,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short
 	/* code for new particle system */
 	if ((ob->particlesystem.first) &&
 	    (ob != scene->obedit) &&
-	    !(base->flag & OB_FROMCACHE))
+	    !(ob->transflag & OB_IS_DUPLI_CACHE))
 	{
 		ParticleSystem *psys;
 
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 6c25fb8..cf1a2bd 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2155,11 +2155,11 @@ static void draw_dupli_objects_color(
 		
 		/* override final DM */
 		bb_tmp = NULL;
-		tbase.flag &= ~OB_FROMCACHE;
+		tbase.object->transflag &= ~OB_IS_DUPLI_CACHE;
 		if (base->object->dup_cache) {
 			DupliObjectData *dob_data = BKE_dupli_cache_find_data(base->object->dup_cache, tbase.object);
 			if (dob_data->cache_dm) {
-				tbase.flag |= OB_FROMCACHE;
+				tbase.object->transflag |= OB_IS_DUPLI_CACHE;
 				
 				tbase.object->derivedFinal = dob_data->cache_dm;
 				bb_tmp = &dob_data->bb;
@@ -2240,6 +2240,7 @@ static void draw_dupli_objects_color(
 		tbase.object->currentlod = savedlod;
 		
 		/* restore final DM */
+		tbase.object->transflag &= ~OB_IS_DUPLI_CACHE;
 		tbase.object->derivedFinal = store_final_dm;
 	}
 
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index 16c4aae..058b5ea 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -189,7 +189,8 @@ typedef struct Object {
 	short flag;			/* copy of Base */
 	short colbits DNA_DEPRECATED;		/* deprecated, use 'matbits' */
 	
-	short transflag, protectflag;	/* transformation settings and transform locks  */
+	int transflag;				/* transformation settings */
+	short protectflag, pad;		/* transform locks */
 	short trackflag, upflag;
 	short nlaflag;				/* used for DopeSheet filtering settings (expanded/collapsed) */
 	short ipoflag;				// xxx deprecated... old animation system
@@ -200,8 +201,6 @@ typedef struct Object {
 	/* dupli-frame settings */
 	int dupon, dupoff, dupsta, dupend;
 
-	int pad;
-
 	/* during realtime */
 
 	/* note that inertia is only called inertia for historical reasons
@@ -445,6 +444,8 @@ enum {
 	OB_NO_PSYS_UPDATE   = 1 << 14,  /* hack to work around particle issue */
 	OB_DUPLI_READ_CACHE = 1 << 15,  /* use cache instead of object data */
 
+	OB_IS_DUPLI_CACHE   = 1 << 31,  /* temporary flag: object data overridden from cache */
+
 	OB_DUPLI            = OB_DUPLIFRAMES | OB_DUPLIVERTS | OB_DUPLIGROUP | OB_DUPLIFACES | OB_DUPLIPARTS,
 };
 
@@ -553,7 +554,6 @@ enum {
 #define OB_DONE             (1 << 10)  /* unknown state, clear before use */
 /* #define OB_RADIO            (1 << 11) */  /* deprecated */
 #define OB_FROMGROUP        (1 << 12)
-#define OB_FROMCACHE        (1 << 13)
 
 /* WARNING - when adding flags check on PSYS_RECALC */
 /* ob->recalc (flag bits!) */




More information about the Bf-blender-cvs mailing list