Fix T46249: Boid goal object that has a force field set to 'Every Point' shape causes...
authorBastien Montagne <montagne29@wanadoo.fr>
Fri, 25 Sep 2015 13:51:33 +0000 (15:51 +0200)
committerBastien Montagne <montagne29@wanadoo.fr>
Fri, 25 Sep 2015 13:53:14 +0000 (15:53 +0200)
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
source/blender/blenkernel/intern/effect.c

index d765dff132fdb2ce4f1efdf18f3bbf93f1d73a00..64b9bf48c981502e4fcb4ea388eb5edd9bed494f 100644 (file)
@@ -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 */
index bf53acc1d957815acf17af9b9b961edbd89a7d57..e66fa86c4b10df00b32dd17c6582070351e6338e 100644 (file)
@@ -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;
        }
 }