[Bf-blender-cvs] [5950b48] alembic_pointcache: 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
Fri Mar 20 10:43:17 CET 2015


Commit: 5950b4832896e4cf59b25de10e7b9e301e9ed65f
Author: Lukas Tönne
Date:   Fri Mar 20 10:39:40 2015 +0100
Branches: alembic_pointcache
https://developer.blender.org/rB5950b4832896e4cf59b25de10e7b9e301e9ed65f

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 813009c..202e1b9 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -318,9 +318,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;
@@ -329,6 +332,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 ff664c8..a303001 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -7612,7 +7612,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 4dccf5a..0b92b41 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2094,11 +2094,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;
@@ -2178,6 +2178,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 663d117..8fe66e3 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -180,7 +180,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
@@ -191,8 +192,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
@@ -434,6 +433,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,
 };
 
@@ -541,7 +542,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