diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-06-08 17:08:10 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-06-08 17:10:34 +0300 |
commit | f3a434c3212d84d69938edd2f40667627692db14 (patch) | |
tree | 366b651e339938a9c6a1f1870dc99776dfed43b8 /source/blender/blenkernel | |
parent | 77e18b81226488abd161c80d4a657fa9d75f212f (diff) | |
parent | afe8eb3b59b2989ee387042b98de6ce880d74a6f (diff) |
Merge branch 'cycles_memory_experiments' into gooseberry
Conflicts:
intern/cycles/blender/blender_object.cpp
intern/cycles/blender/blender_sync.h
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_object.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 25 |
2 files changed, 25 insertions, 2 deletions
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 9482ec778d3..8d1fe7640ee 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -67,7 +67,7 @@ void BKE_object_update_base_layer(struct Scene *scene, struct Object *ob); void BKE_object_free(struct Object *ob); void BKE_object_free_ex(struct Object *ob, bool do_id_user); void BKE_object_free_derived_caches(struct Object *ob); -void BKE_object_free_caches(struct Object *object); +void BKE_object_free_caches(struct Object *object, bool free_smoke_sim); void BKE_object_modifier_hook_reset(struct Object *ob, struct HookModifierData *hmd); diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 9a9f176dc46..d8f580a3206 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -111,6 +111,7 @@ #include "BKE_sca.h" #include "BKE_scene.h" #include "BKE_sequencer.h" +#include "BKE_smoke.h" #include "BKE_speaker.h" #include "BKE_softbody.h" #include "BKE_subsurf.h" @@ -347,7 +348,7 @@ void BKE_object_free_derived_caches(Object *ob) BKE_object_dupli_cache_clear(ob); } -void BKE_object_free_caches(Object *object) +void BKE_object_free_caches(Object *object, bool free_smoke_sim) { ModifierData *md; short update_flag = 0; @@ -375,6 +376,28 @@ void BKE_object_free_caches(Object *object) update_flag |= OB_RECALC_DATA; } } + else if (md->type == eModifierType_Smoke) { + if (free_smoke_sim) { + SmokeModifierData *smd = (SmokeModifierData *) md; + SmokeDomainSettings *sds = smd->domain; + if (sds != NULL) { + bool use_sim = sds->point_cache[0] == NULL; + PointCache *cache; + /* We only reset cache if all the point caches are baked to file. */ + for (cache = sds->ptcaches[0].first; + cache != NULL && use_sim == false; + cache = cache->next) + { + use_sim |= ((cache->flag & (PTCACHE_BAKED|PTCACHE_DISK_CACHE)) != (PTCACHE_BAKED|PTCACHE_DISK_CACHE)); + } + if (!use_sim) { + smokeModifier_reset(smd); + smokeModifier_reset_turbulence(smd); + update_flag |= OB_RECALC_DATA; + } + } + } + } } /* Tag object for update, so once memory critical operation is over and |