diff options
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 11 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw.c | 5 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_object_types.h | 8 |
4 files changed, 16 insertions, 10 deletions
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 813009c19ef..202e1b9cce8 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 ff664c880be..a303001e802 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 4dccf5a1aa5..0b92b41dbee 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 663d117c6f4..8fe66e3268a 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!) */ |