diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2008-02-22 19:31:10 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2008-02-22 19:31:10 +0300 |
commit | 46f27200e1a7e91233d815dbe06a8f00f8c0875d (patch) | |
tree | d641d6b3714aa15edba5e644ce3be0fc855b8ef3 /source/blender/blenkernel | |
parent | ed385dd5ce31215abd2c61ecfff41c69035a16da (diff) |
Bugfix: effectors in dupligroups didn't work, if the particle didn't
specify a group of effectors. Now it goes into groups recursively to
find effectors.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/intern/particle_system.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 5531b600f97..8c20d25a525 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -2403,29 +2403,43 @@ static void add_to_effectors(ListBase *lb, Object *ob, Object *obsrc, ParticleSy } } + +static void psys_init_effectors_recurs(Object *ob, Object *obsrc, ParticleSystem *psys, ListBase *listb, int level) +{ + Group *group; + GroupObject *go; + unsigned int layer= obsrc->lay; + + if(level>MAX_DUPLI_RECUR) return; + + if(ob->lay & layer) { + if(ob->pd || ob->particlesystem.first) + add_to_effectors(listb, ob, obsrc, psys); + + if(ob->dup_group) { + group= ob->dup_group; + for(go= group->gobject.first; go; go= go->next) + psys_init_effectors_recurs(go->ob, obsrc, psys, listb, level+1); + } + } +} + void psys_init_effectors(Object *obsrc, Group *group, ParticleSystem *psys) { - ListBase *listb=&psys->effectors; + ListBase *listb= &psys->effectors; Base *base; - unsigned int layer= obsrc->lay; listb->first=listb->last=0; if(group) { GroupObject *go; - for(go= group->gobject.first; go; go= go->next) { - if( (go->ob->lay & layer) && (go->ob->pd || go->ob->particlesystem.first)) { - add_to_effectors(listb, go->ob, obsrc, psys); - } - } + for(go= group->gobject.first; go; go= go->next) + psys_init_effectors_recurs(go->ob, obsrc, psys, listb, 0); } else { - for(base = G.scene->base.first; base; base= base->next) { - if( (base->lay & layer) && (base->object->pd || base->object->particlesystem.first)) { - add_to_effectors(listb, base->object, obsrc, psys); - } - } + for(base = G.scene->base.first; base; base= base->next) + psys_init_effectors_recurs(base->object, obsrc, psys, listb, 0); } } |