[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43593] trunk/blender: Fluidsim - Restoring simulation speed control (ZanQdo request)

Joshua Leung aligorith at gmail.com
Sun Jan 22 04:42:59 CET 2012


Revision: 43593
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43593
Author:   aligorith
Date:     2012-01-22 03:42:49 +0000 (Sun, 22 Jan 2012)
Log Message:
-----------
Fluidsim - Restoring simulation speed control (ZanQdo request)

This commit restores support for freezing or speeding up physics sims. Animate
the "Speed" parameter under Domain->Time, which controls a multiplier factor for
the rate at which the sim proceeds (i.e. the old "Fac-Tim" setting).

Notes:
* Subversion bumped to 4 to patch up defaults for new value so that old sim
files will still run correctly
* Names/descriptions could do with some tweaking
* Porting this across was not that obvious since quite a bit of stuff had
changed (as in, been cleaned up). However, from tests so far, it seems to work
well.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/properties_physics_fluid.py
    trunk/blender/source/blender/blenkernel/BKE_blender.h
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/physics/physics_fluid.c
    trunk/blender/source/blender/makesdna/DNA_object_fluidsim.h
    trunk/blender/source/blender/makesrna/intern/rna_fluidsim.c
    trunk/blender/source/blender/modifiers/intern/MOD_fluidsim_util.c

Modified: trunk/blender/release/scripts/startup/bl_ui/properties_physics_fluid.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/properties_physics_fluid.py	2012-01-22 03:30:07 UTC (rev 43592)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_physics_fluid.py	2012-01-22 03:42:49 UTC (rev 43593)
@@ -79,6 +79,7 @@
             sub = col.column(align=True)
             sub.prop(fluid, "start_time", text="Start")
             sub.prop(fluid, "end_time", text="End")
+            col.prop(fluid, "simulation_rate", text="Speed")
 
             col = split.column()
             col.label()
@@ -230,6 +231,10 @@
         if fluid.viscosity_preset == 'MANUAL':
             sub.prop(fluid, "viscosity_base", text="Base")
             sub.prop(fluid, "viscosity_exponent", text="Exponent", slider=True)
+        else:
+            # just for padding to prevent jumping around
+            sub.separator()
+            sub.separator()
 
         col.label(text="Optimization:")
         col.prop(fluid, "grid_levels", slider=True)

Modified: trunk/blender/source/blender/blenkernel/BKE_blender.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_blender.h	2012-01-22 03:30:07 UTC (rev 43592)
+++ trunk/blender/source/blender/blenkernel/BKE_blender.h	2012-01-22 03:42:49 UTC (rev 43593)
@@ -42,7 +42,7 @@
  * and keep comment above the defines.
  * Use STRINGIFY() rather than defining with quotes */
 #define BLENDER_VERSION			261
-#define BLENDER_SUBVERSION		3
+#define BLENDER_SUBVERSION		4
 
 #define BLENDER_MINVERSION		250
 #define BLENDER_MINSUBVERSION	0

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2012-01-22 03:30:07 UTC (rev 43592)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2012-01-22 03:42:49 UTC (rev 43593)
@@ -13019,6 +13019,23 @@
 		}
 	}
 	
+	if (main->versionfile < 261 || (main->versionfile == 261 && main->subversionfile < 4))
+	{
+		{
+			/* set fluidsim rate */
+			Object *ob;
+			for (ob = main->object.first; ob; ob = ob->id.next) {
+				ModifierData *md;
+				for (md = ob->modifiers.first; md; md = md->next) {
+					if (md->type == eModifierType_Fluidsim) {
+						FluidsimSettings *fss = (FluidsimSettings *)md;
+						fss->animRate = 1.0f;
+					}
+				}
+			}
+		}
+	}
+	
 	/* put compatibility code here until next subversion bump */
 	{
 	}

Modified: trunk/blender/source/blender/editors/physics/physics_fluid.c
===================================================================
--- trunk/blender/source/blender/editors/physics/physics_fluid.c	2012-01-22 03:30:07 UTC (rev 43592)
+++ trunk/blender/source/blender/editors/physics/physics_fluid.c	2012-01-22 03:42:49 UTC (rev 43593)
@@ -113,6 +113,18 @@
 	}
 }
 
+static float get_fluid_rate(FluidsimSettings *settings)
+{
+	float rate = 1.0f; /* default rate if not animated... */
+	
+	rate = settings->animRate;
+	
+	if (rate < 0.0f)
+		rate = 0.0f;
+	
+	return rate;
+}
+
 static void get_fluid_gravity(float *gravity, Scene *scene, FluidsimSettings *fss)
 {
 	if (scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY) {
@@ -243,7 +255,7 @@
 	
 	channels->timeAtFrame[0] = channels->timeAtFrame[1] = domainSettings->animStart; // start at index 1
 	
-	for(i=2; i<=channels->length; i++) {
+	for (i=2; i <= channels->length; i++) {
 		channels->timeAtFrame[i] = channels->timeAtFrame[i-1] + channels->aniFrameTime;
 	}
 }
@@ -305,6 +317,8 @@
 	channels->DomainGravity = NULL;
 	MEM_freeN(channels->DomainViscosity);
 	channels->DomainViscosity = NULL;
+	MEM_freeN(channels->DomainTime);
+	channels->DomainTime = NULL;
 }
 
 static void free_all_fluidobject_channels(ListBase *fobjects)
@@ -351,14 +365,13 @@
 	int length = channels->length;
 	float eval_time;
 	
-	/* XXX: first init time channel - temporary for now */
-	/* init time values (should be done after evaluating animated time curve) */
+	/* init time values (assuming that time moves at a constant speed; may be overridden later) */
 	init_time(domainSettings, channels);
 	
 	/* allocate domain animation channels */
 	channels->DomainGravity = MEM_callocN( length * (CHANNEL_VEC+1) * sizeof(float), "channel DomainGravity");
 	channels->DomainViscosity = MEM_callocN( length * (CHANNEL_FLOAT+1) * sizeof(float), "channel DomainViscosity");
-	//channels->DomainTime = MEM_callocN( length * (CHANNEL_FLOAT+1) * sizeof(float), "channel DomainTime");
+	channels->DomainTime = MEM_callocN( length * (CHANNEL_FLOAT+1) * sizeof(float), "channel DomainTime");
 	
 	/* allocate fluid objects */
 	for (base=scene->base.first; base; base= base->next) {
@@ -406,10 +419,9 @@
 	for (i=0; i<channels->length; i++) {
 		FluidObject *fobj;
 		float viscosity, gravity[3];
-		float timeAtFrame;
+		float timeAtFrame, time;
 		
 		eval_time = domainSettings->bakeStart + i;
-		timeAtFrame = channels->timeAtFrame[i+1];
 		
 		/* XXX: This can't be used due to an anim sys optimisation that ignores recalc object animation,
 		 * leaving it for the depgraph (this ignores object animation such as modifier properties though... :/ )
@@ -425,12 +437,24 @@
 		
 		/* now scene data should be current according to animation system, so we fill the channels */
 		
-		/* Domain properties - gravity/viscosity/time */
+		/* Domain time */
+		// TODO: have option for not running sim, time mangling, in which case second case comes in handy
+		if (channels->DomainTime) {
+			time = get_fluid_rate(domainSettings) * channels->aniFrameTime;
+			timeAtFrame = channels->timeAtFrame[i] + time;
+			
+			channels->timeAtFrame[i+1] = timeAtFrame;
+			set_channel(channels->DomainTime, i, &time, i, CHANNEL_FLOAT);
+		}
+		else {
+			timeAtFrame = channels->timeAtFrame[i+1];
+		}
+		
+		/* Domain properties - gravity/viscosity */
 		get_fluid_gravity(gravity, scene, domainSettings);
 		set_channel(channels->DomainGravity, timeAtFrame, gravity, i, CHANNEL_VEC);
 		viscosity = get_fluid_viscosity(domainSettings);
 		set_channel(channels->DomainViscosity, timeAtFrame, &viscosity, i, CHANNEL_FLOAT);
-		// XXX : set_channel(channels->DomainTime, timeAtFrame, &time, i, CHANNEL_VEC);
 		
 		/* object movement */
 		for (fobj=fobjects->first; fobj; fobj=fobj->next) {
@@ -957,38 +981,6 @@
 	/* reset to original current frame */
 	scene->r.cfra = origFrame;
 	ED_update_for_newframe(CTX_data_main(C), scene, CTX_wm_screen(C), 1);
-	
-	
-	/* ---- XXX: No Time animation curve for now, leaving this code here for reference 
-	 
-	{ int timeIcu[1] = { FLUIDSIM_TIME };
-		float timeDef[1] = { 1. };
-
-		// time channel is a bit special, init by hand...
-		timeAtIndex = MEM_callocN( (allchannelSize+1)*1*sizeof(float), "fluidsiminit_timeatindex");
-		for(i=0; i<=scene->r.efra; i++) {
-			timeAtIndex[i] = (float)(i-startFrame);
-		}
-		fluidsimInitChannel(scene, &channelDomainTime, allchannelSize, timeAtIndex, timeIcu,timeDef, domainSettings->ipo, CHANNEL_FLOAT ); // NDEB
-		// time channel is a multiplicator for 
-		if(channelDomainTime) {
-			for(i=0; i<allchannelSize; i++) { 
-				channelDomainTime[i*2+0] = aniFrameTime * channelDomainTime[i*2+0]; 
-				if(channelDomainTime[i*2+0]<0.) channelDomainTime[i*2+0] = 0.;
-			}
-		}
-		timeAtFrame = MEM_callocN( (allchannelSize+1)*1*sizeof(float), "fluidsiminit_timeatframe");
-		timeAtFrame[0] = timeAtFrame[1] = domainSettings->animStart; // start at index 1
-		if(channelDomainTime) {
-			for(i=2; i<=allchannelSize; i++) {
-				timeAtFrame[i] = timeAtFrame[i-1]+channelDomainTime[(i-1)*2+0];
-			}
-		fsset->} else {
-			for(i=2; i<=allchannelSize; i++) { timeAtFrame[i] = timeAtFrame[i-1]+aniFrameTime; }
-		}
-
-	} // domain channel init
-	*/
 		
 	/* ******** init domain object's matrix ******** */
 	copy_m4_m4(domainMat, fsDomain->obmat);

Modified: trunk/blender/source/blender/makesdna/DNA_object_fluidsim.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_object_fluidsim.h	2012-01-22 03:30:07 UTC (rev 43592)
+++ trunk/blender/source/blender/makesdna/DNA_object_fluidsim.h	2012-01-22 03:42:49 UTC (rev 43593)
@@ -140,8 +140,8 @@
 
 	int lastgoodframe;
 	
-	int pad;
-
+	/* Simulation/flow rate control (i.e. old "Fac-Time") */
+	float animRate;
 } FluidsimSettings;
 
 /* ob->fluidsimSettings defines */

Modified: trunk/blender/source/blender/makesrna/intern/rna_fluidsim.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_fluidsim.c	2012-01-22 03:30:07 UTC (rev 43592)
+++ trunk/blender/source/blender/makesrna/intern/rna_fluidsim.c	2012-01-22 03:42:49 UTC (rev 43593)
@@ -340,6 +340,11 @@
 	RNA_def_property_range(prop, 0.001, 10);
 	RNA_def_property_ui_text(prop, "Real World Size", "Size of the simulation domain in metres");
 	
+	prop= RNA_def_property(srna, "simulation_rate", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_float_sdna(prop, NULL, "animRate");
+	RNA_def_property_range(prop, 0.0, 100.0);
+	RNA_def_property_ui_text(prop, "Simulation Speed", "Fluid motion rate (0 = stationary, 1 = normal speed)");
+	
 	prop= RNA_def_property(srna, "viscosity_preset", PROP_ENUM, PROP_NONE);
 	RNA_def_property_enum_sdna(prop, NULL, "viscosityMode");
 	RNA_def_property_enum_items(prop, viscosity_items);

Modified: trunk/blender/source/blender/modifiers/intern/MOD_fluidsim_util.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_fluidsim_util.c	2012-01-22 03:30:07 UTC (rev 43592)
+++ trunk/blender/source/blender/modifiers/intern/MOD_fluidsim_util.c	2012-01-22 03:42:49 UTC (rev 43593)
@@ -95,6 +95,7 @@
 
 		fss->animStart = 0.0; 
 		fss->animEnd = 4.0;
+		fss->animRate = 1.0;
 		fss->gstar = 0.005; // used as normgstar
 		fss->maxRefine = -1;
 		// maxRefine is set according to resolutionxyz during bake




More information about the Bf-blender-cvs mailing list