[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12779] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Tue Dec 4 14:57:28 CET 2007


Revision: 12779
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12779
Author:   blendix
Date:     2007-12-04 14:57:28 +0100 (Tue, 04 Dec 2007)

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

Particles
=========

- Fix crash in particle transform with the particle system not editable.
- Particle child distribution and caching is now multithreaded.
- Child particles now have a separate Render Amount next to the existing
  Amount. The render amount particles are now only distributed and cached
  at render time, which should make editing with child particles faster.

- Two new options for diffuse strand shading:
	- Surface Diffuse: computes the strand normal taking the normal at
	  the surface into account.
	- Blending Distance: the distance in Blender units over which to
	  blend in the normal at the surface.
- Special strand rendering for more memory efficient and faster hair and
  grass. This is a work in progress, and has a number of known issues,
  don't report bugs to me for this feature yet.

More info:
http://www.blender.org/development/current-projects/changes-since-244/particles/

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_particle.h
    trunk/blender/source/blender/blenkernel/intern/anim.c
    trunk/blender/source/blender/blenkernel/intern/material.c
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/blenkernel/intern/particle_system.c
    trunk/blender/source/blender/blenlib/BLI_rand.h
    trunk/blender/source/blender/blenlib/intern/rand.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/include/BIF_editparticle.h
    trunk/blender/source/blender/makesdna/DNA_material_types.h
    trunk/blender/source/blender/makesdna/DNA_particle_types.h
    trunk/blender/source/blender/render/extern/include/RE_pipeline.h
    trunk/blender/source/blender/render/extern/include/RE_shader_ext.h
    trunk/blender/source/blender/render/intern/include/render_types.h
    trunk/blender/source/blender/render/intern/include/renderdatabase.h
    trunk/blender/source/blender/render/intern/include/shading.h
    trunk/blender/source/blender/render/intern/include/zbuf.h
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/envmap.c
    trunk/blender/source/blender/render/intern/source/pipeline.c
    trunk/blender/source/blender/render/intern/source/rendercore.c
    trunk/blender/source/blender/render/intern/source/renderdatabase.c
    trunk/blender/source/blender/render/intern/source/shadbuf.c
    trunk/blender/source/blender/render/intern/source/shadeinput.c
    trunk/blender/source/blender/render/intern/source/shadeoutput.c
    trunk/blender/source/blender/render/intern/source/zbuf.c
    trunk/blender/source/blender/src/buttons_object.c
    trunk/blender/source/blender/src/buttons_scene.c
    trunk/blender/source/blender/src/buttons_shading.c
    trunk/blender/source/blender/src/drawobject.c
    trunk/blender/source/blender/src/editparticle.c
    trunk/blender/source/blender/src/renderwin.c
    trunk/blender/source/blender/src/transform_conversions.c

Added Paths:
-----------
    trunk/blender/source/blender/render/intern/include/strand.h
    trunk/blender/source/blender/render/intern/source/strand.c

Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_particle.h	2007-12-04 12:39:27 UTC (rev 12778)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h	2007-12-04 13:57:28 UTC (rev 12779)
@@ -54,6 +54,7 @@
 struct IpoCurve;
 struct LinkNode;
 struct KDTree;
+struct RNG;
 
 typedef struct ParticleEffectorCache {
 	struct ParticleEffectorCache *next, *prev;
@@ -148,6 +149,42 @@
 	int totkeys;
 } ParticleEdit;
 
+typedef struct ParticleThreadContext {
+	/* shared */
+	struct Object *ob;
+	struct DerivedMesh *dm;
+	struct ParticleSystemModifierData *psmd;
+	struct ParticleSystem *psys;
+	struct Material *ma;
+
+	/* distribution */
+	struct KDTree *tree;
+
+	struct ParticleSeam *seams;
+	int totseam;
+
+	float *jit, *jitoff, *weight;
+	float maxweight;
+	int *index, jitlevel;
+
+	int from, cfrom, distr;
+
+	/* path caching */
+	int editupdate, between, steps;
+	int totchild, totparent;
+
+	float cfra;
+
+	float *vg_length, *vg_clump, *vg_kink;
+	float *vg_rough1, *vg_rough2, *vg_roughe;
+} ParticleThreadContext;
+
+typedef struct ParticleThread {
+	ParticleThreadContext *ctx;
+	struct RNG *rng, *rng_path;
+	int num, tot;
+} ParticleThread;
+
 /* ----------- functions needed outside particlesystem ---------------- */
 /* particle.c */
 int count_particles(struct ParticleSystem *psys);
@@ -170,6 +207,7 @@
 void psys_free_settings(struct ParticleSettings *part);
 void free_child_path_cache(struct ParticleSystem *psys);
 void psys_free_path_cache(struct ParticleSystem *psys);
+void psys_free_render_memory(struct Object *ob, struct ParticleSystem *psys);
 void free_hair(struct ParticleSystem *psys);
 void free_keyed_keys(struct ParticleSystem *psys);
 void psys_free(struct Object * ob, struct ParticleSystem * psys);
@@ -195,11 +233,19 @@
 int do_guide(struct ParticleKey *state, int pa_num, float time, struct ListBase *lb);
 float psys_get_size(struct Object *ob, struct Material *ma, struct ParticleSystemModifierData *psmd, struct IpoCurve *icu_size, struct ParticleSystem *psys, struct ParticleSettings *part, struct ParticleData *pa, float *vg_size);
 float psys_get_timestep(struct ParticleSettings *part);
-float psys_get_child_time(struct ParticleSystem *psys, int child_nbr, float cfra);
-float psys_get_child_size(struct ParticleSystem *psys, int child_nbr, float cfra, float *pa_time);
+float psys_get_child_time(struct ParticleSystem *psys, struct ChildParticle *cpa, float cfra);
+float psys_get_child_size(struct ParticleSystem *psys, struct ChildParticle *cpa, float cfra, float *pa_time);
 void psys_get_particle_on_path(struct Object *ob, struct ParticleSystem *psys, int pa_num, struct ParticleKey *state, int vel);
 int psys_get_particle_state(struct Object *ob, struct ParticleSystem *psys, int p, struct ParticleKey *state, int always);
 
+ParticleThread *psys_threads_create(struct Object *ob, struct ParticleSystem *psys, int totthread);
+int psys_threads_init_distribution(ParticleThread *threads, struct DerivedMesh *dm, int from);
+int psys_threads_init_path(ParticleThread *threads, float cfra, int editupdate);
+void psys_threads_free(ParticleThread *threads);
+
+void psys_thread_distribute_particle(ParticleThread *thread, struct ParticleData *pa, struct ChildParticle *cpa, int p);
+void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa, ParticleCacheKey *keys, int i);
+
 /* particle_system.c */
 int psys_count_keyed_targets(struct Object *ob, struct ParticleSystem *psys);
 void psys_get_reactor_target(struct Object *ob, struct ParticleSystem *psys, struct Object **target_ob, struct ParticleSystem **target_psys);

Modified: trunk/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim.c	2007-12-04 12:39:27 UTC (rev 12778)
+++ trunk/blender/source/blender/blenkernel/intern/anim.c	2007-12-04 13:57:28 UTC (rev 12779)
@@ -640,7 +640,7 @@
 				pa_num = a;
 				pa_time = psys->particles[psys->child[a - totpart].parent].time;
 
-				size=psys_get_child_size(psys, a - totpart, ctime, 0);
+				size=psys_get_child_size(psys, &psys->child[a - totpart], ctime, 0);
 			}
 
 			if(part->draw_as==PART_DRAW_GR) {
@@ -783,7 +783,7 @@
 {
 	ListBase *duplilist= MEM_mallocN(sizeof(ListBase), "duplilist");
 	duplilist->first= duplilist->last= NULL;
-	
+
 	if(ob->transflag & OB_DUPLI) {
 		if(ob->transflag & OB_DUPLIPARTS) {
 			ParticleSystem *psys = ob->particlesystem.first;
@@ -808,7 +808,7 @@
 			DupliObject *dob;
 			
 			group_duplilist(duplilist, ob, 0); /* now recursive */
-			
+
 			/* make copy already, because in group dupli's deform displists can be makde, requiring parent matrices */
 			for(dob= duplilist->first; dob; dob= dob->next)
 				Mat4CpyMat4(dob->ob->obmat, dob->mat);

Modified: trunk/blender/source/blender/blenkernel/intern/material.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/material.c	2007-12-04 12:39:27 UTC (rev 12778)
+++ trunk/blender/source/blender/blenkernel/intern/material.c	2007-12-04 13:57:28 UTC (rev 12779)
@@ -687,6 +687,9 @@
 	/* will become or-ed result of all node modes */
 	ma->mode_l= ma->mode;
 	ma->mode_l &= ~MA_SHLESS;
+
+	if(ma->strand_surfnor > 0.0f)
+		ma->mode_l |= MA_STR_SURFDIFF;
 }
 
 static void init_render_nodetree(bNodeTree *ntree, Material *basemat, int r_mode, float *amb)

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c	2007-12-04 12:39:27 UTC (rev 12778)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c	2007-12-04 13:57:28 UTC (rev 12779)
@@ -56,6 +56,7 @@
 #include "BLI_kdtree.h"
 #include "BLI_linklist.h"
 #include "BLI_rand.h"
+#include "BLI_threads.h"
 
 #include "BKE_anim.h"
 
@@ -299,6 +300,27 @@
 	}
 	free_child_path_cache(psys);
 }
+void psys_free_render_memory(Object *ob, ParticleSystem *psys)
+{
+	ParticleSystemModifierData *psmd;
+
+	/* this is a bad function, but saves a lot of memory rendering.
+	 * particles should really be generated on the fly with render
+	 * settings! */
+	psys_free_path_cache(psys);
+
+	if(psys->child){
+		MEM_freeN(psys->child);
+		psys->child=0;
+		psys->totchild=0;
+	}
+	
+	psmd= psys_get_modifier(ob, psys);
+	psmd->flag &= ~eParticleSystemFlag_psys_updated;
+
+	psys->recalc |= PSYS_ALLOC|PSYS_DISTR;
+	//DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+}
 /* free everything */
 void psys_free(Object *ob, ParticleSystem * psys)
 {
@@ -1195,41 +1217,33 @@
 
 	VECADD(state->co,state->co,rough);
 }
-static int check_path_length(int k, int p, ParticleCacheKey **cache, ParticleCacheKey *state, float length, float *dvec)
+static int check_path_length(int k, ParticleCacheKey *keys, ParticleCacheKey *state, float max_length, float *cur_length, float length, float *dvec)
 {
-	static float max_length = 1.0, cur_length = 0.0;
-
-	if(k) {
-		if(cur_length + length > max_length){
-			//if(p<totparent){
-			//	if(k<=(int)cache[totpart+p]->time){
-			//		/* parents need to be calculated fully first so that they don't mess up their children */
-			//		/* we'll make a note of where we got to though so that they're easy to finish later */
-			//		state->time=(max_length-cur_length)/length;
-			//		cache[totpart+p]->time=(float)k;
-			//	}
-			//}
-			//else{
-			VecMulf(dvec, (max_length - cur_length) / length);
-			VECADD(state->co, (state - 1)->co, dvec);
-			cache[p]->steps = k;
-			/* something over the maximum step value */
-			return k=100000;
-			//}
-		}
-		else {
-			cur_length+=length;
-		}
+	if(*cur_length + length > max_length){
+		//if(p<totparent){
+		//	if(k<=(int)cache[totpart+p]->time){
+		//		/* parents need to be calculated fully first so that they don't mess up their children */
+		//		/* we'll make a note of where we got to though so that they're easy to finish later */
+		//		state->time=(max_length-*cur_length)/length;
+		//		cache[totpart+p]->time=(float)k;
+		//	}
+		//}
+		//else{
+		VecMulf(dvec, (max_length - *cur_length) / length);
+		VECADD(state->co, (state - 1)->co, dvec);
+		keys->steps = k;
+		/* something over the maximum step value */
+		return k=100000;
+		//}
 	}
-	else {/* reset signal */
-		max_length=length;
-		cur_length=0.0;
+	else {
+		*cur_length+=length;
+		return k;
 	}
-	return k;
 }
-static void finalize_path_length(int p, ParticleCacheKey **cache)
+static void finalize_path_length(ParticleCacheKey *keys)
 {
-	ParticleCacheKey *state = cache[p];
+	ParticleCacheKey *state = keys;
 	float dvec[3];
 	state += state->steps;
 
@@ -1301,42 +1315,54 @@
 	if(orcos)
 		MEM_freeN(orcos);
 }
-void psys_cache_child_paths(Object *ob, ParticleSystem *psys, float cfra, int editupdate)
+
+static void get_strand_normal(Material *ma, float *surfnor, float surfdist, float *nor)
 {
+	float cross[3], nstrand[3], vnor[3], blend;
+
+	if(!((ma->mode & MA_STR_SURFDIFF) || (ma->strand_surfnor > 0.0f)))
+		return;
+
+	if(ma->mode & MA_STR_SURFDIFF) {
+		Crossf(cross, surfnor, nor);
+		Crossf(nstrand, nor, cross);
+
+		blend= INPR(nstrand, surfnor);
+		CLAMP(blend, 0.0f, 1.0f);
+
+		VecLerpf(vnor, nstrand, surfnor, blend);
+		Normalize(vnor);
+	}
+	else
+		VECCOPY(vnor, nor)
+	
+	if(ma->strand_surfnor > 0.0f) {
+		if(ma->strand_surfnor > surfdist) {
+			blend= (ma->strand_surfnor - surfdist)/ma->strand_surfnor;
+			VecLerpf(vnor, vnor, surfnor, blend);
+			Normalize(vnor);
+		}
+	}
+
+	VECCOPY(nor, vnor);
+}
+
+int psys_threads_init_path(ParticleThread *threads, float cfra, int editupdate)
+{
+	ParticleThreadContext *ctx= threads[0].ctx;
+	Object *ob= ctx->ob;
+	ParticleSystem *psys= ctx->psys;
 	ParticleSettings *part = psys->part;
 	ParticleEditSettings *pset = &G.scene->toolsettings->particle;
-	ParticleSystemModifierData *psmd = psys_get_modifier(ob,psys);
-	ParticleData *pa;
-	ChildParticle *cpa;
-	ParticleCacheKey **cache = psys->childcache, **pcache = psys->pathcache;
-	ParticleCacheKey *tcache, *state, *par=0, *key[4];
-	ParticleTexture ptex;
-	Material *ma = give_current_material(ob, part->omat);
-
-	float length, pa_length = 1.0, pa_clump = 1.0, pa_kink = 1.0;
-	float pa_rough1 = 1.0, pa_rough2 = 1.0, pa_roughe = 1.0;
-	float t, rough_t;
-	float dvec[3], orco[3], ornor[3], imat[4][4];
-	float *vg_length = 0, *vg_clump = 0, *vg_kink = 0;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list