[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13768] trunk/blender/source/blender: Added an option for texture forcefields to use the root location of a particle for its texture coords .

Campbell Barton ideasman42 at gmail.com
Tue Feb 19 19:36:50 CET 2008


Revision: 13768
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13768
Author:   campbellbarton
Date:     2008-02-19 19:36:50 +0100 (Tue, 19 Feb 2008)

Log Message:
-----------
Added an option for texture forcefields to use  the root location of a particle for its texture coords.
Without this, animating grass would either look like seaweed (with low freq texture)
Or the grass would wrinkle up and get kinks (high freq texture)
This lets you use a high frequency texture while having straight grass.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_particle.h
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/blenkernel/intern/particle_system.c
    trunk/blender/source/blender/makesdna/DNA_object_force.h
    trunk/blender/source/blender/src/buttons_object.c

Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_particle.h	2008-02-19 17:51:58 UTC (rev 13767)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h	2008-02-19 18:36:50 UTC (rev 13768)
@@ -293,7 +293,7 @@
 void initialize_particle(struct ParticleData *pa, int p, struct Object *ob, struct ParticleSystem *psys, struct ParticleSystemModifierData *psmd);
 void reset_particle(struct ParticleData *pa, struct ParticleSystem *psys, struct ParticleSystemModifierData *psmd, struct Object *ob, float dtime, float cfra, float *vg_vel, float *vg_tan, float *vg_rot);
 
-void do_effectors(int pa_no, struct ParticleData *pa, struct ParticleKey *state, struct Object *ob, struct ParticleSystem *psys, float *force_field, float *vel,float framestep, float cfra);
+void do_effectors(int pa_no, struct ParticleData *pa, struct ParticleKey *state, struct Object *ob, struct ParticleSystem *psys, float *texco, float *force_field, float *vel,float framestep, float cfra);
 
 void psys_calc_dmcache(struct Object *ob, struct DerivedMesh *dm, struct ParticleSystem *psys);
 int psys_particle_dm_face_lookup(struct Object *ob, struct DerivedMesh *dm, int index, float *fw, struct LinkNode *node);

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c	2008-02-19 17:51:58 UTC (rev 13767)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c	2008-02-19 18:36:50 UTC (rev 13768)
@@ -1682,7 +1682,7 @@
 
 	VECADD(state->co,state->co,rough);
 }
-static void do_path_effectors(Object *ob, ParticleSystem *psys, int i, ParticleCacheKey *ca, int k, int steps, float effector, float dfra, float cfra, float *length, float *vec)
+static void do_path_effectors(Object *ob, ParticleSystem *psys, int i, ParticleCacheKey *ca, int k, int steps, float *rootco, float effector, float dfra, float cfra, float *length, float *vec)
 {
 	float force[3] = {0.0f,0.0f,0.0f}, vel[3] = {0.0f,0.0f,0.0f};
 	ParticleKey eff_key;
@@ -1693,7 +1693,7 @@
 	QUATCOPY(eff_key.rot,(ca-1)->rot);
 
 	pa= psys->particles+i;
-	do_effectors(i, pa, &eff_key, ob, psys, force, vel, dfra, cfra);
+	do_effectors(i, pa, &eff_key, ob, psys, rootco, force, vel, dfra, cfra);
 
 	VecMulf(force, effector*pow((float)k / (float)steps, 100.0f * psys->part->eff_hair) / (float)steps);
 
@@ -2102,7 +2102,7 @@
 	if(part->flag & PART_CHILD_EFFECT) {
 		for(k=0,state=keys; k<=ctx->steps; k++,state++) {
 			if(k) {
-				do_path_effectors(ob, psys, cpa->pa[0], state, k, ctx->steps, pa_effector, 0.0f, ctx->cfra, &eff_length, eff_vec);
+				do_path_effectors(ob, psys, cpa->pa[0], state, k, ctx->steps, keys->co, pa_effector, 0.0f, ctx->cfra, &eff_length, eff_vec);
 			}
 			else {
 				VecSubf(eff_vec,(state+1)->co,state->co);
@@ -2527,7 +2527,7 @@
 		for(k=0, ca=cache[i]; k<=steps; k++, ca++) {
 			/* apply effectors */
 			if(!(psys->part->flag & PART_CHILD_EFFECT) && edit==0 && k)
-				do_path_effectors(ob, psys, i, ca, k, steps, effector, dfra, cfra, &length, vec);
+				do_path_effectors(ob, psys, i, ca, k, steps, cache[i]->co, effector, dfra, cfra, &length, vec);
 
 			/* apply guide curves to path data */
 			if(edit==0 && psys->effectors.first && (psys->part->flag & PART_CHILD_GUIDE)==0)

Modified: trunk/blender/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle_system.c	2008-02-19 17:51:58 UTC (rev 13767)
+++ trunk/blender/source/blender/blenkernel/intern/particle_system.c	2008-02-19 18:36:50 UTC (rev 13768)
@@ -2603,7 +2603,7 @@
 
 
 /* calculate forces that all effectors apply to a particle*/
-void do_effectors(int pa_no, ParticleData *pa, ParticleKey *state, Object *ob, ParticleSystem *psys, float *force_field, float *vel,float framestep, float cfra)
+void do_effectors(int pa_no, ParticleData *pa, ParticleKey *state, Object *ob, ParticleSystem *psys, float *rootco, float *force_field, float *vel,float framestep, float cfra)
 {
 	Object *eob;
 	ParticleSystem *epsys;
@@ -2650,14 +2650,20 @@
 
 				if(falloff<=0.0f)
 					;	/* don't do anything */
-				else if(pd->forcefield==PFIELD_TEXTURE)
-					do_texture_effector(pd->tex, pd->tex_mode, pd->flag&PFIELD_TEX_2D, pd->tex_nabla,
+				else if(pd->forcefield==PFIELD_TEXTURE) {
+					if 
+						do_texture_effector(pd->tex, pd->tex_mode, pd->flag&PFIELD_TEX_2D, pd->tex_nabla,
+										pd->flag & PFIELD_TEX_OBJECT, (pd->flag & PFIELD_TEX_ROOTCO) ? rootco, eob->obmat,
+										pd->f_strength, falloff, force_field);
+					else
+						do_texture_effector(pd->tex, pd->tex_mode, pd->flag&PFIELD_TEX_2D, pd->tex_nabla,
 										pd->flag & PFIELD_TEX_OBJECT, state->co, eob->obmat,
 										pd->f_strength, falloff, force_field);
-				else
+				} else {
 					do_physical_effector(pd->forcefield,pd->f_strength,distance,
 										falloff,pd->f_dist,pd->f_damp,eob->obmat[2],vec_to_part,
 										pa->state.vel,force_field,pd->flag&PFIELD_PLANAR);
+				}
 			}
 			if(ec->type & PSYS_EC_PARTICLE){
 				int totepart;
@@ -2757,7 +2763,7 @@
 		tvel[0]=tvel[1]=tvel[2]=0.0;
 		/* add effectors */
 		if(part->type != PART_HAIR)
-			do_effectors(pa_no,pa,states+i,ob,psys,force,tvel,dfra,fra);
+			do_effectors(pa_no,pa,states+i,ob,psys,states->co,force,tvel,dfra,fra);
 
 		/* calculate air-particle interaction */
 		if(part->dragfac!=0.0f){

Modified: trunk/blender/source/blender/makesdna/DNA_object_force.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_object_force.h	2008-02-19 17:51:58 UTC (rev 13767)
+++ trunk/blender/source/blender/makesdna/DNA_object_force.h	2008-02-19 18:36:50 UTC (rev 13768)
@@ -163,6 +163,7 @@
 #define PFIELD_USEMIN			256
 #define PFIELD_USEMAXR			512
 #define PFIELD_USEMINR			1024
+#define PFIELD_TEX_ROOTCO		2048
 
 /* pd->falloff */
 #define PFIELD_FALL_SPHERE		0

Modified: trunk/blender/source/blender/src/buttons_object.c
===================================================================
--- trunk/blender/source/blender/src/buttons_object.c	2008-02-19 17:51:58 UTC (rev 13767)
+++ trunk/blender/source/blender/src/buttons_object.c	2008-02-19 18:36:50 UTC (rev 13768)
@@ -3417,7 +3417,8 @@
 				if(pd->forcefield == PFIELD_TEXTURE){
 					uiDefIDPoinBut(block, field_testTexture, ID_TE, B_FIELD_CHANGE, "Texture: ", 10, 120, 140, 20, &pd->tex, "Texture to use as force");
 					uiDefButBitS(block, TOG, PFIELD_TEX_OBJECT, B_FIELD_CHANGE, "Use Object Co",	10,100,140,20, &pd->flag, 0.0, 0, 0, 0, "Use object/global coordinates for texture");
-					uiDefButBitS(block, TOG, PFIELD_TEX_2D, B_FIELD_CHANGE, "2D",	10,80,140,20, &pd->flag, 0.0, 0, 0, 0, "Apply force only in 2d");
+					uiDefButBitS(block, TOG, PFIELD_TEX_ROOTCO, B_FIELD_CHANGE, "Root TexCo",	10,80,120,20, &pd->flag, 0.0, 0, 0, 0, "Texture coords from root particle locations");
+					uiDefButBitS(block, TOG, PFIELD_TEX_2D, B_FIELD_CHANGE, "2D",	130,80,20,20, &pd->flag, 0.0, 0, 0, 0, "Apply force only in 2d");
 				}
 				else if(pd->forcefield == PFIELD_HARMONIC) 
 					uiDefButF(block, NUM, B_FIELD_CHANGE, "Damp: ",	10,120,140,20, &pd->f_damp, 0, 10, 10, 0, "Damping of the harmonic force");	





More information about the Bf-blender-cvs mailing list