[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