[Bf-blender-cvs] [cf12e51] master: Fix T46249: Boid goal object that has a force field set to 'Every Point' shape causes crash.

Bastien Montagne noreply at git.blender.org
Fri Sep 25 15:53:34 CEST 2015


Commit: cf12e51eba8cb45e3c19f9f069725ed2d7624b8d
Author: Bastien Montagne
Date:   Fri Sep 25 15:51:33 2015 +0200
Branches: master
https://developer.blender.org/rBcf12e51eba8cb45e3c19f9f069725ed2d7624b8d

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.

===================================================================

M	source/blender/blenkernel/intern/boids.c
M	source/blender/blenkernel/intern/effect.c

===================================================================

diff --git a/source/blender/blenkernel/intern/boids.c b/source/blender/blenkernel/intern/boids.c
index d765dff..64b9bf4 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 bf53acc..e66fa86 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;
 	}
 }




More information about the Bf-blender-cvs mailing list