From cf12e51eba8cb45e3c19f9f069725ed2d7624b8d Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Fri, 25 Sep 2015 15:51:33 +0200 Subject: [PATCH] Fix T46249: Boid goal object that has a force field set to 'Every Point' shape causes crash. This is a mere bandage, that whole area is known broken anyway, but at least it should prevent the crash. Note that that kind of stuff (the efd->index being a pointer) is really bad practice imho... Should be backported to final 2.76. --- source/blender/blenkernel/intern/boids.c | 3 +++ source/blender/blenkernel/intern/effect.c | 10 +++------- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/source/blender/blenkernel/intern/boids.c b/source/blender/blenkernel/intern/boids.c index d765dff132f..64b9bf48c98 100644 --- a/source/blender/blenkernel/intern/boids.c +++ b/source/blender/blenkernel/intern/boids.c @@ -80,6 +80,9 @@ static int rule_goal_avoid(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, float priority = 0.0f, len = 0.0f; int ret = 0; + int p = 0; + efd.index = cur_efd.index = &p; + pd_point_from_particle(bbd->sim, pa, &pa->state, &epoint); /* first find out goal/predator with highest priority */ diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c index bf53acc1d95..e66fa86c4b1 100644 --- a/source/blender/blenkernel/intern/effect.c +++ b/source/blender/blenkernel/intern/effect.c @@ -687,10 +687,10 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin } static void get_effector_tot(EffectorCache *eff, EffectorData *efd, EffectedPoint *point, int *tot, int *p, int *step) { - if (eff->pd->shape == PFIELD_SHAPE_POINTS) { - efd->index = p; + *p = 0; + efd->index = p; - *p = 0; + if (eff->pd->shape == PFIELD_SHAPE_POINTS) { *tot = eff->ob->derivedFinal ? eff->ob->derivedFinal->numVertData : 1; if (*tot && eff->pd->forcefield == PFIELD_HARMONIC && point->index >= 0) { @@ -699,9 +699,6 @@ static void get_effector_tot(EffectorCache *eff, EffectorData *efd, EffectedPoin } } else if (eff->psys) { - efd->index = p; - - *p = 0; *tot = eff->psys->totpart; if (eff->pd->forcefield == PFIELD_CHARGE) { @@ -727,7 +724,6 @@ static void get_effector_tot(EffectorCache *eff, EffectorData *efd, EffectedPoin } } else { - *p = 0; *tot = 1; } }