[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28150] trunk/blender: Subframe calculations for particles, original patch by Raul Fernandez Hernandez

Janne Karhu jhkarh at gmail.com
Mon Apr 12 19:34:06 CEST 2010


Revision: 28150
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28150
Author:   jhk
Date:     2010-04-12 19:34:06 +0200 (Mon, 12 Apr 2010)

Log Message:
-----------
Subframe calculations for particles, original patch by Raul Fernandez Hernandez
* Increasing subframe count increases stability for SPH fluid and Newtonian particles
* Also small tweaks into physics ui panel to better fit new subframes value
* This commit also fixes the moving fluid emitter problem as described by Raul in the mailinglist

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/properties_particle.py
    trunk/blender/source/blender/blenkernel/intern/particle_system.c
    trunk/blender/source/blender/makesdna/DNA_particle_types.h
    trunk/blender/source/blender/makesrna/intern/rna_particle.c

Modified: trunk/blender/release/scripts/ui/properties_particle.py
===================================================================
--- trunk/blender/release/scripts/ui/properties_particle.py	2010-04-12 16:15:38 UTC (rev 28149)
+++ trunk/blender/release/scripts/ui/properties_particle.py	2010-04-12 17:34:06 UTC (rev 28150)
@@ -390,10 +390,13 @@
             sub.prop(part, "drag_factor", slider=True)
             sub.prop(part, "damp_factor", slider=True)
             sub = split.column()
+            sub.label(text="Integration:")
+            sub.prop(part, "integrator", text="")
+            sub.prop(part, "time_tweak")
+            sub.prop(part, "subframes")
+            sub = layout.row()
             sub.prop(part, "size_deflect")
             sub.prop(part, "die_on_collision")
-            sub.prop(part, "integrator")
-            sub.prop(part, "time_tweak")
 
         elif part.physics_type == 'FLUID':
             fluid = part.fluid
@@ -405,10 +408,13 @@
             sub.prop(part, "drag_factor", slider=True)
             sub.prop(part, "damp_factor", slider=True)
             sub = split.column()
+            sub.label(text="Integration:")
+            sub.prop(part, "integrator", text="")
+            sub.prop(part, "time_tweak")
+            sub.prop(part, "subframes")
+            sub = layout.row()
             sub.prop(part, "size_deflect")
             sub.prop(part, "die_on_collision")
-            sub.prop(part, "integrator")
-            sub.prop(part, "time_tweak")
 
             split = layout.split()
             sub = split.column()

Modified: trunk/blender/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle_system.c	2010-04-12 16:15:38 UTC (rev 28149)
+++ trunk/blender/source/blender/blenkernel/intern/particle_system.c	2010-04-12 17:34:06 UTC (rev 28150)
@@ -2308,8 +2308,7 @@
 	VECCOPY(start, pa->prev_state.co);
 	VECCOPY(end, pa->state.co);
 
-	sub_v3_v3v3(v, end, start);
-	mul_v3_fl(v, 1.f/dtime);
+	VECCOPY(v, pa->state.vel);
 
 	neighbours = BLI_kdtree_range_search(tree, radius, start, NULL, &ptn);
 
@@ -3790,18 +3789,23 @@
 	}
 
 	if(psys->totpart) {
-		int dframe, totframesback = 0;
-
+		int dframe, subframe = 0, totframesback = 0, totsubframe = part->subframes+1;
+		float fraction;
+		
 		/* handle negative frame start at the first frame by doing
 		 * all the steps before the first frame */
 		if(framenr == startframe && part->sta < startframe)
 			totframesback = (startframe - (int)part->sta);
-
+		
 		for(dframe=-totframesback; dframe<=0; dframe++) {
 			/* ok now we're all set so let's go */
-			dynamics_step(sim, cfra+dframe);
-			psys->cfra = cfra+dframe;
+			for (subframe = 1; subframe <= totsubframe; subframe++) {
+				fraction = (float)subframe/(float)totsubframe;
+				dynamics_step(sim, cfra+dframe+fraction - 1.f);
+				psys->cfra = cfra+dframe+fraction - 1.f;
+			}
 		}
+		
 	}
 	
 /* 4. only write cache starting from second frame */

Modified: trunk/blender/source/blender/makesdna/DNA_particle_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_particle_types.h	2010-04-12 16:15:38 UTC (rev 28149)
+++ trunk/blender/source/blender/makesdna/DNA_particle_types.h	2010-04-12 17:34:06 UTC (rev 28150)
@@ -136,7 +136,7 @@
 	/* physics modes */
 	short phystype, rotmode, avemode, reactevent;
 	short draw, draw_as, draw_size, childtype;
-	short ren_as, rt2;
+	short ren_as, subframes;
 	/* number of path segments, power of 2 except */
 	short draw_step, ren_step;
 	short hair_step, keys_step;

Modified: trunk/blender/source/blender/makesrna/intern/rna_particle.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_particle.c	2010-04-12 16:15:38 UTC (rev 28149)
+++ trunk/blender/source/blender/makesrna/intern/rna_particle.c	2010-04-12 17:34:06 UTC (rev 28150)
@@ -1476,6 +1476,11 @@
 	RNA_def_property_ui_range(prop, 0, 10, 1, 3);
 	RNA_def_property_ui_text(prop, "Tweak", "A multiplier for physics timestep (1.0 means one frame = 1/25 seconds)");
 	RNA_def_property_update(prop, 0, "rna_Particle_reset");
+	
+	prop= RNA_def_property(srna, "subframes", PROP_INT, PROP_NONE);
+	RNA_def_property_range(prop, 0, 1000);	
+	RNA_def_property_ui_text(prop, "Subframes", "Subframes to simulate for improved stability and finer granularity simulations");
+	RNA_def_property_update(prop, 0, "rna_Particle_reset");
 
 	prop= RNA_def_property(srna, "jitter_factor", PROP_FLOAT, PROP_NONE);
 	RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);





More information about the Bf-blender-cvs mailing list