[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13903] trunk/blender/source/blender/ blenkernel/intern/particle_system.c:

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Feb 28 14:31:25 CET 2008


Revision: 13903
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13903
Author:   blendix
Date:     2008-02-28 14:31:25 +0100 (Thu, 28 Feb 2008)

Log Message:
-----------

Bugfix: jitterd particle distribution was really slow for a large
number of particles/face. Now for > 25 particles/face it switches
to using a QMC hammersley distribution, much faster, for less
jitter still looks a bit better.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/particle_system.c

Modified: trunk/blender/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle_system.c	2008-02-28 11:39:13 UTC (rev 13902)
+++ trunk/blender/source/blender/blenkernel/intern/particle_system.c	2008-02-28 13:31:25 UTC (rev 13903)
@@ -408,6 +408,29 @@
 	}
 }
 
+/* modified copy from rayshade.c */
+static void hammersley_create(float *out, int n, int seed, float amount)
+{
+	RNG *rng;
+    double p, t, offs[2];
+    int k, kk;
+
+	rng = rng_new(31415926 + n + seed);
+	offs[0]= rng_getDouble(rng) + amount;
+	offs[1]= rng_getDouble(rng) + amount;
+	rng_free(rng);
+
+    for (k = 0; k < n; k++) {
+        t = 0;
+        for (p = 0.5, kk = k; kk; p *= 0.5, kk >>= 1)
+            if (kk & 1) /* kk mod 2 = 1 */
+				t += p;
+    
+		out[2*k + 0]= fmod((double)k/(double)n + offs[0], 1.0);
+		out[2*k + 1]= fmod(t + offs[1], 1.0);
+	}
+}
+
 /* modified copy from effect.c */
 static void init_mv_jit(float *jit, int num, int seed2, float amount)
 {
@@ -1213,9 +1236,15 @@
 			//if(jitlevel>100) jitlevel= 100;
 		}
 		
-		jit= MEM_callocN(2+ jitlevel*2*sizeof(float), "jit");
+		jit= MEM_callocN((2+ jitlevel*2)*sizeof(float), "jit");
 
-		init_mv_jit(jit, jitlevel, psys->seed, part->jitfac);
+		/* for small amounts of particles we use regular jitter since it looks
+		 * a bit better, for larger amounts we switch to hammersley sequence 
+		 * because it is much faster */
+		if(jitlevel < 25)
+			init_mv_jit(jit, jitlevel, psys->seed, part->jitfac);
+		else
+			hammersley_create(jit, jitlevel+1, psys->seed, part->jitfac);
 		BLI_array_randomize(jit, 2*sizeof(float), jitlevel, psys->seed); /* for custom jit or even distribution */
 	}
 





More information about the Bf-blender-cvs mailing list