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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2008-02-22 19:31:10 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2008-02-22 19:31:10 +0300
commit46f27200e1a7e91233d815dbe06a8f00f8c0875d (patch)
treed641d6b3714aa15edba5e644ce3be0fc855b8ef3 /source/blender/blenkernel
parented385dd5ce31215abd2c61ecfff41c69035a16da (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.c38
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);
}
}