diff -r .../blenderSVN/source/blender/blenkernel/intern/particle_system.c /home/raul/Documentos/BlenderSPH/blender/source/blender/blenkernel/intern/particle_system.c
static void apply_particle_forces(ParticleSimulationData *sim, int p, float dfra, float cfra) { ParticleSettings *part = sim->psys->part; ParticleData *pa = sim->psys->particles + p; EffectedPoint epoint; ParticleKey states[5], tkey; float timestep = psys_get_timestep(sim); -- float force[3],impulse[3],dx[4][3],dv[4][3]; ++ float force[3],impulse[3],dx[4][3],dv[4][3],diff[3]; float dtime=dfra*timestep, time, pa_mass=part->mass, fac, fra=sim->psys->cfra; int i, steps=1;
.............. in other part of the same function ........
switch(part->integrator){ case PART_INT_EULER: steps=1; break; case PART_INT_MIDPOINT: steps=2; break; case PART_INT_RK4: steps=4; break; ++ case PART_INT_VERLET: ++ steps=1; ++ break; } .............. in other part of the same function ........ VECADDFAC(pa->state.vel,states->vel,dv[0],1.0f/6.0f); VECADDFAC(pa->state.vel,pa->state.vel,dv[1],1.0f/3.0f); VECADDFAC(pa->state.vel,pa->state.vel,dv[2],1.0f/3.0f); VECADDFAC(pa->state.vel,pa->state.vel,dv[3],1.0f/6.0f); } break;
++ case PART_INT_VERLET: /* Verlet integration */ ++ VECADDFAC(pa->state.vel,pa->state.vel,force,dtime); ++ VecMulf(pa->state.vel,dtime); ++ VecAddf(pa->state.co,pa->state.co,pa->state.vel); ++ VecSubf(diff,pa->state.co,pa->prev_state.co); ++ VecMulf(diff,1.f/dtime); ++ VECCOPY(pa->state.vel,diff); ++ break; } }
diff -r .../blenderSVN/source/blender/makesdna/DNA_particle_types.h /home/raul/Documentos/BlenderSPH/blender/source/blender/makesdna/DNA_particle_types.h /* part->integrator */ #define PART_INT_EULER 0 #define PART_INT_MIDPOINT 1 #define PART_INT_RK4 2 ++ #define PART_INT_VERLET 3
diff -r .../blenderSVN/source/blender/makesrna/intern/rna_particle.c /home/raul/Documentos/BlenderSPH/blender/source/blender/makesrna/intern/rna_particle.c static EnumPropertyItem integrator_type_items[] = { {PART_INT_EULER, "EULER", 0, "Euler", ""}, {PART_INT_MIDPOINT, "MIDPOINT", 0, "Midpoint", ""}, {PART_INT_RK4, "RK4", 0, "RK4", ""}, ++ {PART_INT_VERLET, "VERLET", 0, "Verlet", ""}, {0, NULL, 0, NULL, NULL} };
diff -r .../blenderSVN/source/blender/blenkernel/intern/particle_system.c /home/raul/Documentos/BlenderSPH/blender/source/blender/blenkernel/intern/particle_system.c static void apply_particle_forces(ParticleSimulationData *sim, int p, float dfra, float cfra) { ParticleSettings *part = sim->psys->part; ParticleData *pa = sim->psys->particles + p; EffectedPoint epoint; ParticleKey states[5], tkey; float timestep = psys_get_timestep(sim); -- float force[3],impulse[3],dx[4][3],dv[4][3]; ++ float force[3],impulse[3],dx[4][3],dv[4][3],diff[3]; float dtime=dfra*timestep, time, pa_mass=part->mass, fac, fra=sim->psys->cfra; int i, steps=1; .............. in other part of the same function ........ switch(part->integrator){ case PART_INT_EULER: steps=1; break; case PART_INT_MIDPOINT: steps=2; break; case PART_INT_RK4: steps=4; break; ++ case PART_INT_VERLET: ++ steps=1; ++ break; } .............. in other part of the same function ........ VECADDFAC(pa->state.vel,states->vel,dv[0],1.0f/6.0f); VECADDFAC(pa->state.vel,pa->state.vel,dv[1],1.0f/3.0f); VECADDFAC(pa->state.vel,pa->state.vel,dv[2],1.0f/3.0f); VECADDFAC(pa->state.vel,pa->state.vel,dv[3],1.0f/6.0f); } break; ++ case PART_INT_VERLET: /* Verlet integration */ ++ VECADDFAC(pa->state.vel,pa->state.vel,force,dtime); ++ VecMulf(pa->state.vel,dtime); ++ VecAddf(pa->state.co,pa->state.co,pa->state.vel); ++ VecSubf(diff,pa->state.co,pa->prev_state.co); ++ VecMulf(diff,1.f/dtime); ++ VECCOPY(pa->state.vel,diff); ++ break; } } diff -r .../blenderSVN/source/blender/makesdna/DNA_particle_types.h /home/raul/Documentos/BlenderSPH/blender/source/blender/makesdna/DNA_particle_types.h /* part->integrator */ #define PART_INT_EULER 0 #define PART_INT_MIDPOINT 1 #define PART_INT_RK4 2 ++ #define PART_INT_VERLET 3 diff -r .../blenderSVN/source/blender/makesrna/intern/rna_particle.c /home/raul/Documentos/BlenderSPH/blender/source/blender/makesrna/intern/rna_particle.c static EnumPropertyItem integrator_type_items[] = { {PART_INT_EULER, "EULER", 0, "Euler", ""}, {PART_INT_MIDPOINT, "MIDPOINT", 0, "Midpoint", ""}, {PART_INT_RK4, "RK4", 0, "RK4", ""}, ++ {PART_INT_VERLET, "VERLET", 0, "Verlet", ""}, {0, NULL, 0, NULL, NULL} };
|