[Bf-blender-cvs] [2f5ef12] alembic_pointcache: Moved object/modifier/sim resets out of the BKE_ptcache_id_reset function. This is a design cleanup, the point cache methods should only write to the DNA when retrieving state data. There were already a number of cases where such resets occured outside of this function (such as with rigid body worlds or smoke sims).
Lukas Tönne
noreply at git.blender.org
Thu Oct 16 16:54:09 CEST 2014
Commit: 2f5ef128b911e8769b4f2cc0c88c1678129de24f
Author: Lukas Tönne
Date: Sun Dec 8 08:48:40 2013 +0100
Branches: alembic_pointcache
https://developer.blender.org/rB2f5ef128b911e8769b4f2cc0c88c1678129de24f
Moved object/modifier/sim resets out of the BKE_ptcache_id_reset
function. This is a design cleanup, the point cache methods should only
write to the DNA when retrieving state data. There were already a number
of cases where such resets occured outside of this function (such as
with rigid body worlds or smoke sims).
The BKE_ptcache_object_reset function still exists and includes these
reset calls, but there the cache user data types are accessed directly.
===================================================================
M source/blender/blenkernel/intern/cloth.c
M source/blender/blenkernel/intern/dynamicpaint.c
M source/blender/blenkernel/intern/particle_system.c
M source/blender/blenkernel/intern/pointcache.c
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/blenkernel/intern/smoke.c
M source/blender/blenkernel/intern/softbody.c
===================================================================
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index 4455a43..7353988 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -473,6 +473,8 @@ void clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, Derived
(clmd->clothObject && dm->getNumVerts(dm) != clmd->clothObject->numverts))
{
clmd->sim_parms->reset = 0;
+ cloth_free_modifier(clmd);
+
cache->state.flag |= PTC_STATE_OUTDATED;
BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
BKE_ptcache_validate(cache, 0);
@@ -513,10 +515,13 @@ void clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, Derived
return;
if ((framenr == startframe) && (clmd->sim_parms->preroll == 0)) {
+ cloth_free_modifier(clmd);
+
BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
- do_init_cloth(ob, clmd, dm, framenr);
BKE_ptcache_validate(cache, framenr);
cache->state.flag &= ~PTC_STATE_REDO_NEEDED;
+
+ do_init_cloth(ob, clmd, dm, framenr);
clmd->clothObject->last_frame= framenr;
return;
}
diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c
index 3512505..176a926 100644
--- a/source/blender/blenkernel/intern/dynamicpaint.c
+++ b/source/blender/blenkernel/intern/dynamicpaint.c
@@ -1978,6 +1978,8 @@ static void dynamicPaint_frameUpdate(DynamicPaintModifierData *pmd, Scene *scene
/* reset non-baked cache at first frame */
if ((int)scene->r.cfra == surface->start_frame) {
+ dynamicPaint_clearSurface(scene, surface);
+
cache->state.flag |= PTC_STATE_REDO_NEEDED;
BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
cache->state.flag &= ~PTC_STATE_REDO_NEEDED;
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index da7507c..309cc3e 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -4654,6 +4654,7 @@ static void system_step(ParticleSimulationData *sim, float cfra)
/* clear everything on start frame */
if (cfra == startframe) {
/* XXX anything to do here? */
+ psys_reset(psys, PSYS_RESET_DEPSGRAPH);
// BKE_ptcache_id_reset(sim->scene, pid, PTCACHE_RESET_OUTDATED);
PTC_validate(cache, startframe);
cache->state.flag &= ~PTC_STATE_REDO_NEEDED;
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index 8178145..b52a2f1 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -2702,22 +2702,8 @@ int BKE_ptcache_id_reset(Scene *scene, PTCacheID *pid, int mode)
if (reset) {
BKE_ptcache_invalidate(cache);
cache->state.flag &= ~PTC_STATE_REDO_NEEDED;
-
- if (pid->type == PTCACHE_TYPE_CLOTH)
- cloth_free_modifier(pid->calldata);
- else if (pid->type == PTCACHE_TYPE_SOFTBODY)
- sbFreeSimulation(pid->calldata);
- else if (pid->type == PTCACHE_TYPE_PARTICLES)
- psys_reset(pid->calldata, PSYS_RESET_DEPSGRAPH);
-#if 0
- else if (pid->type == PTCACHE_TYPE_SMOKE_DOMAIN)
- smokeModifier_reset(pid->calldata);
- else if (pid->type == PTCACHE_TYPE_SMOKE_HIGHRES)
- smokeModifier_reset_turbulence(pid->calldata);
-#endif
- else if (pid->type == PTCACHE_TYPE_DYNAMICPAINT)
- dynamicPaint_clearSurface(scene, (DynamicPaintSurface*)pid->calldata);
}
+
if (clear)
BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
else if (after)
@@ -2736,6 +2722,9 @@ int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
skip= 0;
if (ob->soft) {
+ if (mode & PTCACHE_RESET_OUTDATED)
+ sbFreeSimulation(ob->soft);
+
BKE_ptcache_id_from_softbody(&pid, ob, ob->soft);
reset |= BKE_ptcache_id_reset(scene, &pid, mode);
}
@@ -2747,14 +2736,21 @@ int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
/* Baked cloth hair has to be checked too, because we don't want to reset */
/* particles or cloth in that case -jahka */
else if (psys->clmd) {
- BKE_ptcache_id_from_cloth(&pid, ob, psys->clmd);
- if (mode == PSYS_RESET_ALL || psys->part->type != PART_HAIR)
+ if (mode == PSYS_RESET_ALL || psys->part->type != PART_HAIR) {
+ if (mode & PTCACHE_RESET_OUTDATED)
+ cloth_free_modifier(psys->clmd);
+
+ BKE_ptcache_id_from_cloth(&pid, ob, psys->clmd);
reset |= BKE_ptcache_id_reset(scene, &pid, mode);
+ }
else
skip = 1;
}
if (skip == 0 && psys->part) {
+ if (mode & PTCACHE_RESET_OUTDATED)
+ psys_reset(psys, PSYS_RESET_DEPSGRAPH);
+
BKE_ptcache_id_from_particles(&pid, ob, psys);
reset |= BKE_ptcache_id_reset(scene, &pid, mode);
}
@@ -2762,7 +2758,11 @@ int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
for (md=ob->modifiers.first; md; md=md->next) {
if (md->type == eModifierType_Cloth) {
- BKE_ptcache_id_from_cloth(&pid, ob, (ClothModifierData*)md);
+ ClothModifierData *clmd = (ClothModifierData*)md;
+ if (mode & PTCACHE_RESET_OUTDATED)
+ cloth_free_modifier(clmd);
+
+ BKE_ptcache_id_from_cloth(&pid, ob, clmd);
reset |= BKE_ptcache_id_reset(scene, &pid, mode);
}
if (md->type == eModifierType_Smoke) {
@@ -2776,8 +2776,10 @@ int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)md;
if (pmd->canvas) {
DynamicPaintSurface *surface = pmd->canvas->surfaces.first;
-
for (; surface; surface=surface->next) {
+ if (mode & PTCACHE_RESET_OUTDATED)
+ dynamicPaint_clearSurface(scene, surface);
+
BKE_ptcache_id_from_dynamicpaint(&pid, ob, surface);
reset |= BKE_ptcache_id_reset(scene, &pid, mode);
}
@@ -2788,6 +2790,7 @@ int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
if (scene->rigidbody_world && (ob->rigidbody_object || ob->rigidbody_constraint)) {
if (ob->rigidbody_object)
ob->rigidbody_object->flag |= RBO_FLAG_NEEDS_RESHAPE;
+
BKE_ptcache_id_from_rigidbody(&pid, ob, scene->rigidbody_world);
/* only flag as outdated, resetting should happen on start frame */
pid.cache->state.flag |= PTC_STATE_OUTDATED;
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 4f12a4d..3ee94af 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1270,8 +1270,9 @@ void BKE_rigidbody_rebuild_world(Scene *scene, float ctime)
if (ctime <= startframe + 1 && rbw->ltime == startframe) {
if (cache->state.flag & PTC_STATE_OUTDATED) {
- BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
rigidbody_update_simulation(scene, rbw, true);
+
+ BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
BKE_ptcache_validate(cache, (int)ctime);
cache->state.last_exact = 0;
cache->state.flag &= ~PTC_STATE_REDO_NEEDED;
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index 5d0664d..e449f47 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -2653,8 +2653,9 @@ static void smokeModifier_process(SmokeModifierData *smd, Scene *scene, Object *
if (!smd->domain->fluid || framenr == startframe)
{
- BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
smokeModifier_reset_ex(smd, false);
+
+ BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
BKE_ptcache_validate(cache, framenr);
cache->state.flag &= ~PTC_STATE_REDO_NEEDED;
}
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index c23cd8b..09bdaa0 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -4105,14 +4105,14 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i
return;
}
if (framenr == startframe) {
- BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
-
- /* first frame, no simulation to do, just set the positions */
- softbody_update_positions(ob, sb, vertexCos, numVerts);
+ sbFreeSimulation(sb);
+ BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
BKE_ptcache_validate(cache, framenr);
cache->state.flag &= ~PTC_STATE_REDO_NEEDED;
+ /* first frame, no simulation to do, just set the positions */
+ softbody_update_positions(ob, sb, vertexCos, numVerts);
sb->last_frame = framenr;
return;
More information about the Bf-blender-cvs
mailing list