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];

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to