Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2009-01-04 17:14:06 +0300
committerTon Roosendaal <ton@blender.org>2009-01-04 17:14:06 +0300
commitf7cb86df3a9ceccc4d649e42735732a608169157 (patch)
tree558a9ba43708a2213b1afa8f46d79f5daa140bc6 /source/blender/blenkernel/intern/particle_system.c
parent74f9e98c828c17910405092785633373d4ae88e8 (diff)
2.5
Think global, act local! The old favorite G.scene gone! Man... that took almost 2 days. Also removed G.curscreen and G.edbo. Not everything could get solved; here's some notes. - modifiers now store current scene in ModifierData. This is not meant for permanent, but it can probably stick there until we cleaned the anim system and depsgraph to cope better with timing issues. - Game engine G.scene should become an argument for staring it. Didn't solve this yet. - Texture nodes should get scene cfra, but the current implementation is too tightly wrapped to do it easily.
Diffstat (limited to 'source/blender/blenkernel/intern/particle_system.c')
-rw-r--r--source/blender/blenkernel/intern/particle_system.c178
1 files changed, 89 insertions, 89 deletions
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 3ad17790f45..336b7037600 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -216,7 +216,7 @@ static void realloc_particles(Object *ob, ParticleSystem *psys, int new_totpart)
psys->totpart=totpart;
}
-static int get_psys_child_number(ParticleSystem *psys)
+static int get_psys_child_number(struct Scene *scene, ParticleSystem *psys)
{
int nbr;
@@ -225,15 +225,15 @@ static int get_psys_child_number(ParticleSystem *psys)
if(psys->renderdata) {
nbr= psys->part->ren_child_nbr;
- return get_render_child_particle_number(&G.scene->r, nbr);
+ return get_render_child_particle_number(&scene->r, nbr);
}
else
return psys->part->child_nbr;
}
-static int get_psys_tot_child(ParticleSystem *psys)
+static int get_psys_tot_child(struct Scene *scene, ParticleSystem *psys)
{
- return psys->totpart*get_psys_child_number(psys);
+ return psys->totpart*get_psys_child_number(scene, psys);
}
static void alloc_child_particles(ParticleSystem *psys, int tot)
@@ -929,7 +929,7 @@ static int compare_orig_index(const void *p1, const void *p2)
/* 6. and we're done! */
/* This is to denote functionality that does not yet work with mesh - only derived mesh */
-int psys_threads_init_distribution(ParticleThread *threads, DerivedMesh *finaldm, int from)
+int psys_threads_init_distribution(ParticleThread *threads, Scene *scene, DerivedMesh *finaldm, int from)
{
ParticleThreadContext *ctx= threads[0].ctx;
Object *ob= ctx->ob;
@@ -982,7 +982,7 @@ int psys_threads_init_distribution(ParticleThread *threads, DerivedMesh *finaldm
BLI_kdtree_balance(tree);
- totpart=get_psys_tot_child(psys);
+ totpart=get_psys_tot_child(scene, psys);
cfrom=from=PART_FROM_FACE;
if(part->flag&PART_CHILD_SEAMS){
@@ -1031,9 +1031,9 @@ int psys_threads_init_distribution(ParticleThread *threads, DerivedMesh *finaldm
}
else{
/* no need to figure out distribution */
- int child_nbr= get_psys_child_number(psys);
+ int child_nbr= get_psys_child_number(scene, psys);
- totpart= get_psys_tot_child(psys);
+ totpart= get_psys_tot_child(scene, psys);
alloc_child_particles(psys, totpart);
cpa=psys->child;
for(i=0; i<child_nbr; i++){
@@ -1365,16 +1365,16 @@ int psys_threads_init_distribution(ParticleThread *threads, DerivedMesh *finaldm
return 1;
}
-static void distribute_particles_on_dm(DerivedMesh *finaldm, Object *ob, ParticleSystem *psys, int from)
+static void distribute_particles_on_dm(DerivedMesh *finaldm, Scene *scene, Object *ob, ParticleSystem *psys, int from)
{
ListBase threads;
ParticleThread *pthreads;
ParticleThreadContext *ctx;
int i, totthread;
- pthreads= psys_threads_create(ob, psys);
+ pthreads= psys_threads_create(scene, ob, psys);
- if(!psys_threads_init_distribution(pthreads, finaldm, from)) {
+ if(!psys_threads_init_distribution(pthreads, scene, finaldm, from)) {
psys_threads_free(pthreads);
return;
}
@@ -1414,7 +1414,7 @@ static void distribute_particles_on_shape(Object *ob, ParticleSystem *psys, int
pa->num= -1;
}
}
-static void distribute_particles(Object *ob, ParticleSystem *psys, int from)
+static void distribute_particles(Scene *scene, Object *ob, ParticleSystem *psys, int from)
{
ParticleSystemModifierData *psmd=0;
int distr_error=0;
@@ -1422,7 +1422,7 @@ static void distribute_particles(Object *ob, ParticleSystem *psys, int from)
if(psmd){
if(psmd->dm)
- distribute_particles_on_dm(psmd->dm,ob,psys,from);
+ distribute_particles_on_dm(psmd->dm, scene, ob, psys, from);
else
distr_error=1;
}
@@ -1444,14 +1444,14 @@ static void distribute_particles(Object *ob, ParticleSystem *psys, int from)
}
/* threaded child particle distribution and path caching */
-ParticleThread *psys_threads_create(struct Object *ob, struct ParticleSystem *psys)
+ParticleThread *psys_threads_create(struct Scene *scene, struct Object *ob, struct ParticleSystem *psys)
{
ParticleThread *threads;
ParticleThreadContext *ctx;
int i, totthread;
- if(G.scene->r.mode & R_FIXED_THREADS)
- totthread= G.scene->r.threads;
+ if(scene->r.mode & R_FIXED_THREADS)
+ totthread= scene->r.threads;
else
totthread= BLI_system_thread_count();
@@ -1714,7 +1714,7 @@ void reset_particle(ParticleData *pa, ParticleSystem *psys, ParticleSystemModifi
if(pa->num == -1)
memset(&state, 0, sizeof(state));
else
- psys_get_particle_state(tob,tpsys,pa->num,&state,1);
+ psys_get_particle_state(scene, tob,tpsys,pa->num,&state,1);
psys_get_from_key(&state,loc,nor,rot,0);
QuatMulVecf(rot,vtan);
@@ -1733,7 +1733,7 @@ void reset_particle(ParticleData *pa, ParticleSystem *psys, ParticleSystemModifi
else{
/* get precise emitter matrix if particle is born */
if(part->type!=PART_HAIR && pa->time < cfra && pa->time >= psys->cfra)
- where_is_object_time(ob,pa->time);
+ where_is_object_time(scene, ob,pa->time);
/* get birth location from object */
psys_particle_on_emitter(psmd,part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,utan,vtan,0,0);
@@ -2027,7 +2027,7 @@ static void set_keyed_keys(Object *ob, ParticleSystem *psys)
for(k=0; k<totkeys; k++) {
for(i=0,pa=psys->particles; i<totpart; i++, pa++) {
if(kpsys->totpart > 0)
- psys_get_particle_state(kob, kpsys, i%kpsys->totpart, pa->keys + k, 1);
+ psys_get_particle_state(scene, kob, kpsys, i%kpsys->totpart, pa->keys + k, 1);
if(k==0)
pa->keys->time = pa->time;
@@ -2303,7 +2303,7 @@ static void add_to_effectors(ListBase *lb, Object *ob, Object *obsrc, ParticleSy
Curve *cu= ob->data;
if(cu->flag & CU_PATH) {
if(cu->path==NULL || cu->path->data==NULL)
- makeDispListCurveTypes(ob, 0);
+ makeDispListCurveTypes(scene, ob, 0);
if(cu->path && cu->path->data) {
type |= PSYS_EC_EFFECTOR;
}
@@ -2394,7 +2394,7 @@ static void psys_init_effectors_recurs(Object *ob, Object *obsrc, ParticleSystem
}
}
-void psys_init_effectors(Object *obsrc, Group *group, ParticleSystem *psys)
+void psys_init_effectors(Scene *scene, Object *obsrc, Group *group, ParticleSystem *psys)
{
ListBase *listb= &psys->effectors;
Base *base;
@@ -2408,7 +2408,7 @@ void psys_init_effectors(Object *obsrc, Group *group, ParticleSystem *psys)
psys_init_effectors_recurs(go->ob, obsrc, psys, listb, 0);
}
else {
- for(base = G.scene->base.first; base; base= base->next)
+ for(base = scene->base.first; base; base= base->next)
psys_init_effectors_recurs(base->object, obsrc, psys, listb, 0);
}
}
@@ -2505,7 +2505,7 @@ static void precalc_effectors(Object *ob, ParticleSystem *psys, ParticleSystemMo
ec->tree=tree;
for(p=0, epa=epsys->particles; p<totepart; p++,epa++)
- if(epa->alive==PARS_ALIVE && psys_get_particle_state(eob,epsys,p,&state,0))
+ if(epa->alive==PARS_ALIVE && psys_get_particle_state(scene, eob,epsys,p,&state,0))
BLI_kdtree_insert(tree, p, state.co, NULL);
BLI_kdtree_balance(tree);
@@ -2556,7 +2556,7 @@ void do_effectors(int pa_no, ParticleData *pa, ParticleKey *state, Object *ob, P
if(ec->type & PSYS_EC_EFFECTOR){
pd=eob->pd;
if(psys->part->type!=PART_HAIR && psys->part->integrator)
- where_is_object_time(eob,cfra);
+ where_is_object_time(scene, eob,cfra);
/* use center of object for distance calculus */
VecSubf(vec_to_part, state->co, eob->obmat[3]);
@@ -2571,7 +2571,7 @@ void do_effectors(int pa_no, ParticleData *pa, ParticleKey *state, Object *ob, P
pd->flag & PFIELD_TEX_OBJECT, (pd->flag & PFIELD_TEX_ROOTCO) ? rootco : state->co, eob->obmat,
pd->f_strength, falloff, force_field);
} else {
- do_physical_effector(eob, state->co, pd->forcefield,pd->f_strength,distance,
+ do_physical_effector(scene, eob, state->co, pd->forcefield,pd->f_strength,distance,
falloff,0.0,pd->f_damp,eob->obmat[2],vec_to_part,
state->vel,force_field,pd->flag&PFIELD_PLANAR,ec->rng,pd->f_noise,charge,pa->size);
}
@@ -2595,7 +2595,7 @@ void do_effectors(int pa_no, ParticleData *pa, ParticleKey *state, Object *ob, P
p=0;
}
- epsys->lattice=psys_get_lattice(ob,psys);
+ epsys->lattice= psys_get_lattice(scene, ob, psys);
for(; p<totepart; p++){
/* particle skips itself as effector */
@@ -2603,7 +2603,7 @@ void do_effectors(int pa_no, ParticleData *pa, ParticleKey *state, Object *ob, P
epa = epsys->particles + p;
estate.time=cfra;
- if(psys_get_particle_state(eob,epsys,p,&estate,0)){
+ if(psys_get_particle_state(scene, eob,epsys,p,&estate,0)){
VECSUB(vec_to_part, state->co, estate.co);
distance = VecLength(vec_to_part);
@@ -2615,14 +2615,14 @@ void do_effectors(int pa_no, ParticleData *pa, ParticleKey *state, Object *ob, P
if(falloff<=0.0f)
; /* don't do anything */
else
- do_physical_effector(eob, state->co, pd->forcefield,pd->f_strength,distance,
+ do_physical_effector(scene, eob, state->co, pd->forcefield,pd->f_strength,distance,
falloff,epart->size,pd->f_damp,estate.vel,vec_to_part,
state->vel,force_field,0, ec->rng, pd->f_noise,charge,pa->size);
}
}
else if(pd && pd->forcefield==PFIELD_HARMONIC && cfra-framestep <= epa->dietime && cfra>epa->dietime){
/* first step after key release */
- psys_get_particle_state(eob,epsys,p,&estate,1);
+ psys_get_particle_state(scene, eob,epsys,p,&estate,1);
VECADD(vel,vel,estate.vel);
/* TODO: add rotation handling here too */
}
@@ -2842,7 +2842,7 @@ static void intersect_dm_quad_weights(float *v1, float *v2, float *v3, float *v4
}
/* check intersection with a derivedmesh */
-int psys_intersect_dm(Object *ob, DerivedMesh *dm, float *vert_cos, float *co1, float* co2, float *min_d, int *min_face, float *min_w,
+int psys_intersect_dm(Scene *scene, Object *ob, DerivedMesh *dm, float *vert_cos, float *co1, float* co2, float *min_d, int *min_face, float *min_w,
float *face_minmax, float *pa_minmax, float radius, float *ipoint)
{
MFace *mface=0;
@@ -2854,9 +2854,9 @@ int psys_intersect_dm(Object *ob, DerivedMesh *dm, float *vert_cos, float *co1,
if(dm==0){
psys_disable_all(ob);
- dm=mesh_get_derived_final(ob,0);
+ dm=mesh_get_derived_final(scene, ob, 0);
if(dm==0)
- dm=mesh_get_derived_deform(ob,0);
+ dm=mesh_get_derived_deform(scene, ob, 0);
psys_enable_all(ob);
@@ -3087,7 +3087,7 @@ static void deflect_particle(Object *pob, ParticleSystemModifierData *psmd, Part
ob= ec->ob;
if(part->type!=PART_HAIR)
- where_is_object_time(ob,cfra);
+ where_is_object_time(scene, ob,cfra);
/* particles should not collide with emitter at birth */
if(ob==pob && pa->time < cfra && pa->time >= psys->cfra)
@@ -3280,7 +3280,7 @@ static int boid_see_mesh(ListBase *lb, Object *pob, ParticleSystem *psys, float
ob= ec->ob;
if(psys->part->type!=PART_HAIR)
- where_is_object_time(ob,cfra);
+ where_is_object_time(scene, ob,cfra);
if(ob==pob)
dm=psmd->dm;
@@ -3298,7 +3298,7 @@ static int boid_see_mesh(ListBase *lb, Object *pob, ParticleSystem *psys, float
Mat4MulVecfl(imat,co2);
}
- if(psys_intersect_dm(ob,dm,ec->vert_cos,co1,co2,&min_d,&min_face,min_w,ec->face_minmax,0,0,0))
+ if(psys_intersect_dm(scene,ob,dm,ec->vert_cos,co1,co2,&min_d,&min_face,min_w,ec->face_minmax,0,0,0))
min_ob=ob;
}
}
@@ -3311,9 +3311,9 @@ static int boid_see_mesh(ListBase *lb, Object *pob, ParticleSystem *psys, float
else{
psys_disable_all(ob);
- dm=mesh_get_derived_final(ob,0);
+ dm=mesh_get_derived_final(scene, ob, 0);
if(dm==0)
- dm=mesh_get_derived_deform(ob,0);
+ dm=mesh_get_derived_deform(scene, ob, 0);
psys_enable_all(ob);
}
@@ -3416,7 +3416,7 @@ static int add_boid_acc(BoidVecFunc *bvf, float lat_max, float tan_max, float *l
}
}
/* determines the acceleration that the boid tries to acchieve */
-static void boid_brain(BoidVecFunc *bvf, ParticleData *pa, Object *ob, ParticleSystem *psys, ParticleSettings *part, KDTree *tree, float timestep, float cfra, float *acc)
+static void boid_brain(BoidVecFunc *bvf, ParticleData *pa, Scene *scene, Object *ob, ParticleSystem *psys, ParticleSettings *part, KDTree *tree, float timestep, float cfra, float *acc)
{
ParticleData *pars=psys->particles;
KDTreeNearest ptn[MAX_BOIDNEIGHBOURS+1];
@@ -3516,7 +3516,7 @@ static void boid_brain(BoidVecFunc *bvf, ParticleData *pa, Object *ob, ParticleS
count=BLI_kdtree_find_n_nearest(ec->tree,epart->boidneighbours,pa->prev_state.co,NULL,ptn2);
for(p=0; p<count; p++){
state.time=-1.0;
- if(psys_get_particle_state(eob,epsys,ptn2[p].index,&state,0)){
+ if(psys_get_particle_state(scene, eob,epsys,ptn2[p].index,&state,0)){
VECSUB(dvec, state.co, pa->prev_state.co);
distance = Normalize(dvec);
@@ -3663,7 +3663,7 @@ static void boid_brain(BoidVecFunc *bvf, ParticleData *pa, Object *ob, ParticleS
count=BLI_kdtree_find_n_nearest(ec->tree,epart->boidneighbours,pa->prev_state.co,NULL,ptn2);
for(p=0; p<count; p++){
state.time=-1.0;
- if(psys_get_particle_state(eob,epsys,ptn2[p].index,&state,0)){
+ if(psys_get_particle_state(scene, eob,epsys,ptn2[p].index,&state,0)){
VECSUB(dvec, state.co, pa->prev_state.co);
distance = Normalize(dvec);
@@ -3823,14 +3823,14 @@ static void boid_body(BoidVecFunc *bvf, ParticleData *pa, ParticleSystem *psys,
Mat4MulVecfl(imat,co1);
Mat4MulVecfl(imat,co2);
- if(psys_intersect_dm(zob,0,0,co1,co2,&min_d,&min_face,min_w,0,0,0,0)){
+ if(psys_intersect_dm(scene,zob,0,0,co1,co2,&min_d,&min_face,min_w,0,0,0,0)){
DerivedMesh *dm;
MFace *mface;
MVert *mvert;
float loc[3],nor[3],q1[4];
psys_disable_all(zob);
- dm=mesh_get_derived_final(zob,0);
+ dm=mesh_get_derived_final(scene, zob, 0);
psys_enable_all(zob);
mface=dm->getFaceDataArray(dm,CD_MFACE);
@@ -3872,7 +3872,7 @@ static void boid_body(BoidVecFunc *bvf, ParticleData *pa, ParticleSystem *psys,
/************************************************/
/* Hair */
/************************************************/
-static void save_hair(Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, float cfra){
+static void save_hair(Scene *scene, Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, float cfra){
ParticleData *pa;
HairKey *key;
int totpart;
@@ -3880,7 +3880,7 @@ static void save_hair(Object *ob, ParticleSystem *psys, ParticleSystemModifierDa
Mat4Invert(ob->imat,ob->obmat);
- psys->lattice=psys_get_lattice(ob,psys);
+ psys->lattice= psys_get_lattice(scene, ob, psys);
if(psys->totpart==0) return;
@@ -3998,7 +3998,7 @@ static void dynamics_step(Object *ob, ParticleSystem *psys, ParticleSystemModifi
if(psys->effectors.first)
psys_end_effectors(psys);
- psys_init_effectors(ob,part->eff_group,psys);
+ psys_init_effectors(scene, ob, part->eff_group, psys);
if(psys->effectors.first)
precalc_effectors(ob,psys,psmd,cfra);
@@ -4080,7 +4080,7 @@ static void dynamics_step(Object *ob, ParticleSystem *psys, ParticleSystemModifi
case PART_PHYS_BOIDS:
{
float acc[3];
- boid_brain(&bvf,pa,ob,psys,part,tree,timestep,cfra,acc);
+ boid_brain(&bvf, pa, scene, ob, psys, part, tree, timestep,cfra,acc);
if(pa->alive != PARS_DYING)
boid_body(&bvf,pa,psys,part,timestep,acc);
break;
@@ -4118,13 +4118,13 @@ static void dynamics_step(Object *ob, ParticleSystem *psys, ParticleSystemModifi
}
/* check if path cache or children need updating and do it if needed */
-static void psys_update_path_cache(Object *ob, ParticleSystemModifierData *psmd, ParticleSystem *psys, float cfra)
+static void psys_update_path_cache(Scene *scene, Object *ob, ParticleSystemModifierData *psmd, ParticleSystem *psys, float cfra)
{
ParticleSettings *part=psys->part;
- ParticleEditSettings *pset=&G.scene->toolsettings->particle;
+ ParticleEditSettings *pset=&scene->toolsettings->particle;
int distr=0,alloc=0;
- if((psys->part->childtype && psys->totchild != get_psys_tot_child(psys)) || psys->recalc&PSYS_ALLOC)
+ if((psys->part->childtype && psys->totchild != get_psys_tot_child(scene, psys)) || psys->recalc&PSYS_ALLOC)
alloc=1;
if(alloc || psys->recalc&PSYS_DISTR || (psys->vgroup[PSYS_VG_DENSITY] && (G.f & G_WEIGHTPAINT)))
@@ -4134,10 +4134,10 @@ static void psys_update_path_cache(Object *ob, ParticleSystemModifierData *psmd,
if(alloc)
realloc_particles(ob,psys,psys->totpart);
- if(get_psys_tot_child(psys)) {
+ if(get_psys_tot_child(scene, psys)) {
/* don't generate children while computing the hair keys */
if(!(psys->part->type == PART_HAIR) || (psys->flag & PSYS_HAIR_DONE)) {
- distribute_particles(ob,psys,PART_FROM_CHILD);
+ distribute_particles(scene, ob, psys, PART_FROM_CHILD);
if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES && part->parents!=0.0)
psys_find_parents(ob,psmd,psys);
@@ -4145,22 +4145,22 @@ static void psys_update_path_cache(Object *ob, ParticleSystemModifierData *psmd,
}
}
- if((part->type==PART_HAIR || psys->flag&PSYS_KEYED) && (psys_in_edit_mode(psys)
+ if((part->type==PART_HAIR || psys->flag&PSYS_KEYED) && (psys_in_edit_mode(scene, psys)
|| (part->type==PART_HAIR || part->draw_as==PART_DRAW_PATH))){
- psys_cache_paths(ob, psys, cfra, 0);
+ psys_cache_paths(scene, ob, psys, cfra, 0);
/* for render, child particle paths are computed on the fly */
if(part->childtype) {
- if(((psys->totchild!=0)) || (psys_in_edit_mode(psys) && (pset->flag&PE_SHOW_CHILD)))
+ if(((psys->totchild!=0)) || (psys_in_edit_mode(scene, psys) && (pset->flag&PE_SHOW_CHILD)))
if(!(psys->part->type == PART_HAIR) || (psys->flag & PSYS_HAIR_DONE))
- psys_cache_child_paths(ob, psys, cfra, 0);
+ psys_cache_child_paths(scene, ob, psys, cfra, 0);
}
}
else if(psys->pathcache)
psys_free_path_cache(psys);
}
-static void hair_step(Object *ob, ParticleSystemModifierData *psmd, ParticleSystem *psys, float cfra)
+static void hair_step(Scene *scene, Object *ob, ParticleSystemModifierData *psmd, ParticleSystem *psys, float cfra)
{
ParticleSettings *part = psys->part;
ParticleData *pa;
@@ -4181,18 +4181,18 @@ static void hair_step(Object *ob, ParticleSystemModifierData *psmd, ParticleSyst
if(psys->effectors.first)
psys_end_effectors(psys);
- psys_init_effectors(ob,part->eff_group,psys);
+ psys_init_effectors(scene, ob, part->eff_group, psys);
if(psys->effectors.first)
precalc_effectors(ob,psys,psmd,cfra);
- if(psys_in_edit_mode(psys))
+ if(psys_in_edit_mode(scene, psys))
; //XXX PE_recalc_world_cos(ob, psys);
- psys_update_path_cache(ob,psmd,psys,cfra);
+ psys_update_path_cache(scene, ob,psmd,psys,cfra);
}
/* updates cached particles' alive & other flags etc..*/
-static void cached_step(Object *ob, ParticleSystemModifierData *psmd, ParticleSystem *psys, float cfra)
+static void cached_step(Scene *scene, Object *ob, ParticleSystemModifierData *psmd, ParticleSystem *psys, float cfra)
{
ParticleSettings *part=psys->part;
ParticleData *pa;
@@ -4209,7 +4209,7 @@ static void cached_step(Object *ob, ParticleSystemModifierData *psmd, ParticleSy
psys_end_effectors(psys);
//if(part->flag & (PART_BAKED_GUIDES+PART_BAKED_DEATHS)){
- psys_init_effectors(ob,part->eff_group,psys);
+ psys_init_effectors(scene, ob, part->eff_group, psys);
if(psys->effectors.first)
precalc_effectors(ob,psys,psmd,cfra);
//}
@@ -4224,7 +4224,7 @@ static void cached_step(Object *ob, ParticleSystemModifierData *psmd, ParticleSy
}
pa->size= psys_get_size(ob,ma,psmd,icu_esize,psys,part,pa,vg_size);
- psys->lattice=psys_get_lattice(ob,psys);
+ psys->lattice= psys_get_lattice(scene, ob, psys);
if(part->flag & PART_LOOP && part->type!=PART_HAIR)
pa->loop = (short)((cfra - pa->time) / pa->lifetime);
@@ -4240,7 +4240,7 @@ static void cached_step(Object *ob, ParticleSystemModifierData *psmd, ParticleSy
else if(dietime <= cfra){
if(dietime > psys->cfra){
state.time = pa->dietime;
- psys_get_particle_state(ob,psys,p,&state,1);
+ psys_get_particle_state(scene, ob,psys,p,&state,1);
push_reaction(ob,psys,p,PART_EVENT_DEATH,&state);
}
pa->alive = PARS_DEAD;
@@ -4248,7 +4248,7 @@ static void cached_step(Object *ob, ParticleSystemModifierData *psmd, ParticleSy
else{
pa->alive = PARS_ALIVE;
state.time = cfra;
- psys_get_particle_state(ob,psys,p,&state,1);
+ psys_get_particle_state(scene, ob,psys,p,&state,1);
state.time = cfra;
push_reaction(ob,psys,p,PART_EVENT_NEAR,&state);
}
@@ -4265,9 +4265,9 @@ static void cached_step(Object *ob, ParticleSystemModifierData *psmd, ParticleSy
}
/* make sure that children are up to date */
- if(psys->part->childtype && psys->totchild != get_psys_tot_child(psys)) {
+ if(psys->part->childtype && psys->totchild != get_psys_tot_child(scene, psys)) {
realloc_particles(ob, psys, psys->totpart);
- distribute_particles(ob, psys, PART_FROM_CHILD);
+ distribute_particles(scene, ob, psys, PART_FROM_CHILD);
}
if(vg_size)
@@ -4308,7 +4308,7 @@ void psys_changed_type(ParticleSystem *psys)
psys_reset(psys, PSYS_RESET_ALL);
}
-static void particles_fluid_step(Object *ob, ParticleSystem *psys, int cfra)
+static void particles_fluid_step(Scene *scene, Object *ob, ParticleSystem *psys, int cfra)
{
if(psys->particles){
MEM_freeN(psys->particles);
@@ -4329,7 +4329,7 @@ static void particles_fluid_step(Object *ob, ParticleSystem *psys, int cfra)
char *suffix2 = ".gz";
char filename[256];
char debugStrBuffer[256];
- int curFrame = G.scene->r.cfra -1; // warning - sync with derived mesh fsmesh loading
+ int curFrame = scene->r.cfra -1; // warning - sync with derived mesh fsmesh loading
int p, j, numFileParts, totpart;
int readMask, activeParts = 0, fileParts = 0;
gzFile gzf;
@@ -4357,7 +4357,7 @@ static void particles_fluid_step(Object *ob, ParticleSystem *psys, int cfra)
part->totpart= totpart;
part->sta=part->end = 1.0f;
- part->lifetime = G.scene->r.efra + 1;
+ part->lifetime = scene->r.efra + 1;
/* initialize particles */
realloc_particles(ob, psys, part->totpart);
@@ -4415,7 +4415,7 @@ static void particles_fluid_step(Object *ob, ParticleSystem *psys, int cfra)
/* Calculates the next state for all particles of the system */
/* In particles code most fra-ending are frames, time-ending are fra*timestep (seconds)*/
-static void system_step(Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, float cfra)
+static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, float cfra)
{
ParticleSettings *part;
ParticleData *pa;
@@ -4429,11 +4429,11 @@ static void system_step(Object *ob, ParticleSystem *psys, ParticleSystemModifier
part= psys->part;
cache= psys->pointcache;
- framenr= (int)G.scene->r.cfra;
+ framenr= (int)scene->r.cfra;
framedelta= framenr - cache->simframe;
BKE_ptcache_id_from_particles(&pid, ob, psys);
- BKE_ptcache_id_time(&pid, 0.0f, &startframe, &endframe, NULL);
+ BKE_ptcache_id_time(&pid, scene, 0.0f, &startframe, &endframe, NULL);
/* update ipo's */
if((part->flag & PART_ABS_TIME) && part->ipo) {
@@ -4443,14 +4443,14 @@ static void system_step(Object *ob, ParticleSystem *psys, ParticleSystemModifier
/* hair if it's already done is handled separate */
if(part->type == PART_HAIR && (psys->flag & PSYS_HAIR_DONE)) {
- hair_step(ob, psmd, psys, cfra);
+ hair_step(scene, ob, psmd, psys, cfra);
psys->cfra = cfra;
psys->recalc = 0;
return;
}
/* fluid is also handled separate */
else if(part->type == PART_FLUID) {
- particles_fluid_step(ob, psys, framenr);
+ particles_fluid_step(scene, ob, psys, framenr);
psys->cfra = cfra;
psys->recalc = 0;
return;
@@ -4485,7 +4485,7 @@ static void system_step(Object *ob, ParticleSystem *psys, ParticleSystemModifier
totpart = part->grid_res*part->grid_res*part->grid_res;
else
totpart = psys->part->totpart;
- totchild = get_psys_tot_child(psys);
+ totchild = get_psys_tot_child(scene, psys);
if(oldtotpart != totpart || (psys->part->childtype && oldtotchild != totchild)) {
only_children_changed = (oldtotpart == totpart);
@@ -4505,13 +4505,13 @@ static void system_step(Object *ob, ParticleSystem *psys, ParticleSystemModifier
if(alloc)
realloc_particles(ob, psys, totpart);
- distribute_particles(ob, psys, part->from);
+ distribute_particles(scene, ob, psys, part->from);
if((psys->part->type == PART_HAIR) && !(psys->flag & PSYS_HAIR_DONE))
/* don't generate children while growing hair - waste of time */
psys_free_children(psys);
- else if(get_psys_tot_child(psys))
- distribute_particles(ob, psys, PART_FROM_CHILD);
+ else if(get_psys_tot_child(scene, psys))
+ distribute_particles(scene, ob, psys, PART_FROM_CHILD);
}
if(only_children_changed==0) {
@@ -4533,12 +4533,12 @@ static void system_step(Object *ob, ParticleSystem *psys, ParticleSystemModifier
set_keyed_keys(ob, psys);
}
- cached_step(ob,psmd,psys,cfra);
+ cached_step(scene, ob, psmd, psys, cfra);
psys->cfra=cfra;
psys->recalc = 0;
if(part->phystype==PART_PHYS_KEYED && psys->flag&PSYS_FIRST_KEYED) {
- psys_update_path_cache(ob,psmd,psys,framenr);
+ psys_update_path_cache(scene, ob, psmd, psys, framenr);
}
cache->simframe= framenr;
@@ -4618,7 +4618,7 @@ static void system_step(Object *ob, ParticleSystem *psys, ParticleSystemModifier
/* for keyed particles the path is allways known so it can be drawn */
if(part->phystype==PART_PHYS_KEYED && psys->flag&PSYS_FIRST_KEYED){
set_keyed_keys(ob, psys);
- psys_update_path_cache(ob,psmd,psys,(int)cfra);
+ psys_update_path_cache(scene, ob, psmd, psys,(int)cfra);
}
else if(psys->pathcache)
psys_free_path_cache(psys);
@@ -4635,7 +4635,7 @@ static void system_step(Object *ob, ParticleSystem *psys, ParticleSystemModifier
}
}
-static void psys_to_softbody(Object *ob, ParticleSystem *psys)
+static void psys_to_softbody(Scene *scene, Object *ob, ParticleSystem *psys)
{
SoftBody *sb;
short softflag;
@@ -4655,7 +4655,7 @@ static void psys_to_softbody(Object *ob, ParticleSystem *psys)
ob->softflag= psys->softflag;
/* do softbody */
- sbObjectStep(ob, (float)G.scene->r.cfra, NULL, psys_count_keys(psys));
+ sbObjectStep(scene, ob, (float)scene->r.cfra, NULL, psys_count_keys(psys));
/* return things back to normal */
psys->soft= ob->soft;
@@ -4677,7 +4677,7 @@ static int hair_needs_recalc(ParticleSystem *psys)
}
/* main particle update call, checks that things are ok on the large scale before actual particle calculations */
-void particle_system_update(Object *ob, ParticleSystem *psys)
+void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
{
ParticleSystemModifierData *psmd;
float cfra;
@@ -4685,7 +4685,7 @@ void particle_system_update(Object *ob, ParticleSystem *psys)
if(!psys_check_enabled(ob, psys))
return;
- cfra= bsystem_time(ob, (float)G.scene->r.cfra, 0.0f);
+ cfra= bsystem_time(scene, ob, (float)scene->r.cfra, 0.0f);
psmd= psys_get_modifier(ob, psys);
/* system was already updated from modifier stack */
@@ -4711,8 +4711,8 @@ void particle_system_update(Object *ob, ParticleSystem *psys)
for(i=0; i<=psys->part->hair_step; i++){
hcfra=100.0f*(float)i/(float)psys->part->hair_step;
- system_step(ob, psys, psmd, hcfra);
- save_hair(ob, psys, psmd, hcfra);
+ system_step(scene, ob, psys, psmd, hcfra);
+ save_hair(scene, ob, psys, psmd, hcfra);
}
psys->flag |= PSYS_HAIR_DONE;
@@ -4720,10 +4720,10 @@ void particle_system_update(Object *ob, ParticleSystem *psys)
/* handle softbody hair */
if(psys->part->type==PART_HAIR && psys->soft)
- psys_to_softbody(ob, psys);
+ psys_to_softbody(scene, ob, psys);
/* the main particle system step */
- system_step(ob, psys, psmd, cfra);
+ system_step(scene, ob, psys, psmd, cfra);
/* save matrix for duplicators */
Mat4Invert(psys->imat, ob->obmat);