[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