[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37430] trunk/blender/source/blender: Bug fix: keyed physics didn't work properly if the first key wasn' t the keyed particle system itself

Janne Karhu jhkarh at gmail.com
Sun Jun 12 13:09:39 CEST 2011


Revision: 37430
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37430
Author:   jhk
Date:     2011-06-12 11:09:39 +0000 (Sun, 12 Jun 2011)
Log Message:
-----------
Bug fix: keyed physics didn't work properly if the first key wasn't the keyed particle system itself
* Also some nicer rotation handling for the explode modifier

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_particle.h
    trunk/blender/source/blender/blenkernel/intern/particle_system.c
    trunk/blender/source/blender/modifiers/intern/MOD_explode.c

Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_particle.h	2011-06-12 11:03:21 UTC (rev 37429)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h	2011-06-12 11:09:39 UTC (rev 37430)
@@ -300,6 +300,8 @@
 
 void psys_check_boid_data(struct ParticleSystem *psys);
 
+void psys_get_birth_coordinates(struct ParticleSimulationData *sim, struct ParticleData *pa, struct ParticleKey *state, float dtime, float cfra);
+
 void particle_system_update(struct Scene *scene, struct Object *ob, struct ParticleSystem *psys);
 
 /* ----------- functions needed only inside particlesystem ------------ */

Modified: trunk/blender/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle_system.c	2011-06-12 11:03:21 UTC (rev 37429)
+++ trunk/blender/source/blender/blenkernel/intern/particle_system.c	2011-06-12 11:09:39 UTC (rev 37430)
@@ -1562,8 +1562,7 @@
 		}
 	}
 }
-/* sets particle to the emitter surface with initial velocity & rotation */
-void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime, float cfra)
+void psys_get_birth_coordinates(ParticleSimulationData *sim, ParticleData *pa, ParticleKey *state, float dtime, float cfra)
 {
 	Object *ob = sim->ob;
 	ParticleSystem *psys = sim->psys;
@@ -1575,17 +1574,6 @@
 	float q_phase[4];
 	int p = pa - psys->particles;
 	part=psys->part;
-	
-	/* get precise emitter matrix if particle is born */
-	if(part->type!=PART_HAIR && dtime > 0.f && pa->time < cfra && pa->time >= sim->psys->cfra) {
-		/* we have to force RECALC_ANIM here since where_is_objec_time only does drivers */
-		while(ob) {
-			BKE_animsys_evaluate_animdata(&ob->id, ob->adt, pa->time, ADT_RECALC_ANIM);
-			ob = ob->parent;
-		}
-		ob = sim->ob;
-		where_is_object_time(sim->scene, ob, pa->time);
-	}
 
 	/* get birth location from object		*/
 	if(part->tanfac != 0.f)
@@ -1594,7 +1582,7 @@
 		psys_particle_on_emitter(sim->psmd, part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,0,0,0,0);
 		
 	/* get possible textural influence */
-	psys_get_texture(sim, pa, &ptex, PAMAP_IVEL|PAMAP_LIFE, cfra);
+	psys_get_texture(sim, pa, &ptex, PAMAP_IVEL, cfra);
 
 	/* particles live in global space so	*/
 	/* let's convert:						*/
@@ -1654,37 +1642,27 @@
 		mat4_to_quat(rot,ob->obmat);
 		mul_qt_qtqt(r_rot,r_rot,rot);
 	}
-#if 0
-	}
-#endif
 
 	if(part->phystype==PART_PHYS_BOIDS && pa->boid) {
-		BoidParticle *bpa = pa->boid;
 		float dvec[3], q[4], mat[3][3];
 
-		copy_v3_v3(pa->state.co,loc);
+		copy_v3_v3(state->co,loc);
 
 		/* boids don't get any initial velocity  */
-		zero_v3(pa->state.vel);
+		zero_v3(state->vel);
 
 		/* boids store direction in ave */
 		if(fabsf(nor[2])==1.0f) {
-			sub_v3_v3v3(pa->state.ave, loc, ob->obmat[3]);
-			normalize_v3(pa->state.ave);
+			sub_v3_v3v3(state->ave, loc, ob->obmat[3]);
+			normalize_v3(state->ave);
 		}
 		else {
-			VECCOPY(pa->state.ave, nor);
+			VECCOPY(state->ave, nor);
 		}
-		/* and gravity in r_ve */
-		bpa->gravity[0] = bpa->gravity[1] = 0.0f;
-		bpa->gravity[2] = -1.0f;
-		if((sim->scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY)
-			&& sim->scene->physics_settings.gravity[2]!=0.0f)
-			bpa->gravity[2] = sim->scene->physics_settings.gravity[2];
 
 		/* calculate rotation matrix */
-		project_v3_v3v3(dvec, r_vel, pa->state.ave);
-		sub_v3_v3v3(mat[0], pa->state.ave, dvec);
+		project_v3_v3v3(dvec, r_vel, state->ave);
+		sub_v3_v3v3(mat[0], state->ave, dvec);
 		normalize_v3(mat[0]);
 		negate_v3_v3(mat[2], r_vel);
 		normalize_v3(mat[2]);
@@ -1692,12 +1670,7 @@
 		
 		/* apply rotation */
 		mat3_to_quat_is_ok( q,mat);
-		copy_qt_qt(pa->state.rot, q);
-
-		bpa->data.health = part->boids->health;
-		bpa->data.mode = eBoidMode_InAir;
-		bpa->data.state_id = ((BoidState*)part->boids->states.first)->id;
-		bpa->data.acc[0]=bpa->data.acc[1]=bpa->data.acc[2]=0.0f;
+		copy_qt_qt(state->rot, q);
 	}
 	else {
 		/* conversion done so now we apply new:	*/
@@ -1710,7 +1683,7 @@
 
 		/*		*emitter velocity				*/
 		if(dtime != 0.f && part->obfac != 0.f){
-			sub_v3_v3v3(vel, loc, pa->state.co);
+			sub_v3_v3v3(vel, loc, state->co);
 			mul_v3_fl(vel, part->obfac/dtime);
 		}
 		
@@ -1747,13 +1720,13 @@
 		if(part->partfac != 0.f)
 			madd_v3_v3fl(vel, p_vel, part->partfac);
 		
-		mul_v3_v3fl(pa->state.vel, vel, ptex.ivel);
+		mul_v3_v3fl(state->vel, vel, ptex.ivel);
 
 		/* -location from emitter				*/
-		copy_v3_v3(pa->state.co,loc);
+		copy_v3_v3(state->co,loc);
 
 		/* -rotation							*/
-		unit_qt(pa->state.rot);
+		unit_qt(state->rot);
 
 		if(part->rotmode){
 			/* create vector into which rotation is aligned */
@@ -1793,32 +1766,74 @@
 			axis_angle_to_quat( q_phase,x_vec, phasefac*(float)M_PI);
 
 			/* combine base rotation & phase */
-			mul_qt_qtqt(pa->state.rot, rot, q_phase);
+			mul_qt_qtqt(state->rot, rot, q_phase);
 		}
 
 		/* -angular velocity					*/
 
-		zero_v3(pa->state.ave);
+		zero_v3(state->ave);
 
 		if(part->avemode){
 			switch(part->avemode){
 				case PART_AVE_SPIN:
-					copy_v3_v3(pa->state.ave, vel);
+					copy_v3_v3(state->ave, vel);
 					break;
 				case PART_AVE_RAND:
-					copy_v3_v3(pa->state.ave, r_ave);
+					copy_v3_v3(state->ave, r_ave);
 					break;
 			}
-			normalize_v3(pa->state.ave);
-			mul_v3_fl(pa->state.ave,part->avefac);
+			normalize_v3(state->ave);
+			mul_v3_fl(state->ave, part->avefac);
 		}
 	}
+}
+/* sets particle to the emitter surface with initial velocity & rotation */
+void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime, float cfra)
+{
+	Object *ob = sim->ob;
+	ParticleSystem *psys = sim->psys;
+	ParticleSettings *part;
+	ParticleTexture ptex;
+	int p = pa - psys->particles;
+	part=psys->part;
+	
+	/* get precise emitter matrix if particle is born */
+	if(part->type!=PART_HAIR && dtime > 0.f && pa->time < cfra && pa->time >= sim->psys->cfra) {
+		/* we have to force RECALC_ANIM here since where_is_objec_time only does drivers */
+		while(ob) {
+			BKE_animsys_evaluate_animdata(&ob->id, ob->adt, pa->time, ADT_RECALC_ANIM);
+			ob = ob->parent;
+		}
+		ob = sim->ob;
+		where_is_object_time(sim->scene, ob, pa->time);
+	}
 
+	psys_get_birth_coordinates(sim, pa, &pa->state, dtime, cfra);
 
+	if(part->phystype==PART_PHYS_BOIDS && pa->boid) {
+		BoidParticle *bpa = pa->boid;
+
+		/* and gravity in r_ve */
+		bpa->gravity[0] = bpa->gravity[1] = 0.0f;
+		bpa->gravity[2] = -1.0f;
+		if((sim->scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY)
+			&& sim->scene->physics_settings.gravity[2]!=0.0f)
+			bpa->gravity[2] = sim->scene->physics_settings.gravity[2];
+
+		bpa->data.health = part->boids->health;
+		bpa->data.mode = eBoidMode_InAir;
+		bpa->data.state_id = ((BoidState*)part->boids->states.first)->id;
+		bpa->data.acc[0]=bpa->data.acc[1]=bpa->data.acc[2]=0.0f;
+	}
+
+
 	if(part->type == PART_HAIR){
 		pa->lifetime = 100.0f;
 	}
 	else{
+		/* get possible textural influence */
+		psys_get_texture(sim, pa, &ptex, PAMAP_LIFE, cfra);
+
 		pa->lifetime = part->lifetime * ptex.life;
 
 		if(part->randlife != 0.0f)
@@ -1904,6 +1919,7 @@
 	PARTICLE_P;
 	ParticleKey *key;
 	int totpart = psys->totpart, k, totkeys = psys->totkeyed;
+	int keyed_flag = 0;
 
 	ksim.scene= sim->scene;
 	
@@ -1933,6 +1949,8 @@
 	for(k=0; k<totkeys; k++) {
 		ksim.ob = pt->ob ? pt->ob : sim->ob;
 		ksim.psys = BLI_findlink(&ksim.ob->particlesystem, pt->psys - 1);
+		keyed_flag = (ksim.psys->flag & PSYS_KEYED);
+		ksim.psys->flag &= ~PSYS_KEYED;
 
 		LOOP_PARTICLES {
 			key = pa->keys + k;
@@ -1956,6 +1974,8 @@
 		if(psys->flag & PSYS_KEYED_TIMING && pt->duration!=0.0f)
 			k++;
 
+		ksim.psys->flag |= keyed_flag;
+
 		pt = (pt->next && pt->next->flag & PTARGET_VALID)? pt->next : psys->targets.first;
 	}
 

Modified: trunk/blender/source/blender/modifiers/intern/MOD_explode.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_explode.c	2011-06-12 11:03:21 UTC (rev 37429)
+++ trunk/blender/source/blender/modifiers/intern/MOD_explode.c	2011-06-12 11:09:39 UTC (rev 37430)
@@ -779,11 +779,11 @@
 	ParticleSettings *part=psmd->psys->part;
 	ParticleSimulationData sim= {NULL};
 	ParticleData *pa=NULL, *pars=psmd->psys->particles;
-	ParticleKey state;
+	ParticleKey state, birth;
 	EdgeHash *vertpahash;
 	EdgeHashIterator *ehi;
 	float *vertco= NULL, imat[4][4];
-	float loc0[3], nor[3];
+	float rot[4];
 	float cfra;
 	/* float timestep; */
 	int *facepa=emd->facepa;
@@ -814,7 +814,7 @@
 	for (i=0; i<totface; i++) {
 		/* do mindex + totvert to ensure the vertex index to be the first
 		 * with BLI_edgehashIterator_getKey */
-		if(facepa[i]==totpart || cfra <= (pars+facepa[i])->time)
+		if(facepa[i]==totpart || cfra < (pars+facepa[i])->time)
 			mindex = totvert+totpart;
 		else 
 			mindex = totvert+facepa[i];
@@ -868,26 +868,26 @@
 			/* get particle */
 			pa= pars+i;
 
-			/* get particle state */
-			psys_particle_on_emitter(psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc0,nor,NULL,NULL,NULL,NULL);
-			mul_m4_v3(ob->obmat,loc0);
+			psys_get_birth_coordinates(&sim, pa, &birth, 0, 0);
 
 			state.time=cfra;
 			psys_get_particle_state(&sim, i, &state, 1);
 
 			vertco=CDDM_get_vert(explode,v)->co;
-			
 			mul_m4_v3(ob->obmat,vertco);
 
-			VECSUB(vertco,vertco,loc0);
+			sub_v3_v3(vertco, birth.co);
 
 			/* apply rotation, size & location */
-			mul_qt_v3(state.rot,vertco);
+			sub_qt_qtqt(rot, state.rot, birth.rot);
+			mul_qt_v3(rot, vertco);
+
 			if(emd->flag & eExplodeFlag_PaSize)
 				mul_v3_fl(vertco,pa->size);
-			VECADD(vertco,vertco,state.co);
 
-			mul_m4_v3(imat,vertco);
+			add_v3_v3(vertco, state.co);
+
+			mul_m4_v3(imat, vertco);
 		}
 	}
 	BLI_edgehashIterator_free(ehi);
@@ -911,7 +911,7 @@
 		
 		orig_v4 = source.v4;
 
-		if(facepa[i]!=totpart && cfra <= pa->time)
+		if(facepa[i]!=totpart && cfra < pa->time)
 			mindex = totvert+totpart;
 		else 
 			mindex = totvert+facepa[i];




More information about the Bf-blender-cvs mailing list