Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Tönne <lukas.toenne@gmail.com>2015-03-20 12:39:40 +0300
committerLukas Tönne <lukas.toenne@gmail.com>2015-03-20 12:39:40 +0300
commit5950b4832896e4cf59b25de10e7b9e301e9ed65f (patch)
tree98dc47e9e8264bae1c1c6e3850af89ffb7a7a757
parent229befd147a9e06202b24c1fd3e7ec8a0da59cc8 (diff)
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.
-rw-r--r--source/blender/blenkernel/intern/object.c11
-rw-r--r--source/blender/editors/space_view3d/drawobject.c2
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c5
-rw-r--r--source/blender/makesdna/DNA_object_types.h8
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!) */