Fix #36630, Particlesystem - boids - goal - collision.
authorLukas Toenne <lukas.toenne@googlemail.com>
Fri, 27 Sep 2013 13:45:47 +0000 (13:45 +0000)
committerLukas Toenne <lukas.toenne@googlemail.com>
Fri, 27 Sep 2013 13:45:47 +0000 (13:45 +0000)
Problem was introduced with r54648, which determined the initial interval for the Newton-Raphson method using the "total_time" of the collision - but this info is only defined for regular collisions, not
for the raycasting used in boids to find the "ground object". To ensure correct behavior, now clear the collision info before using it (good practice in any case), then check the inv_total_time variable
and use the standard 0.001 step if not defined.

source/blender/blenkernel/intern/boids.c
source/blender/blenkernel/intern/particle_system.c

index 8ce84609c150d1297170e1ede6eec3ad045f749d..a8d64ea9fb637b5737ea2a4bd7ec4cf8c5a15338 100644 (file)
@@ -206,6 +206,8 @@ static int rule_avoid_collision(BoidRule *rule, BoidBrainData *bbd, BoidValues *
                BVHTreeRayHit hit;
                float radius = val->personal_space * pa->size, ray_dir[3];
 
+               memset(&col, 0, sizeof(ParticleCollision));
+
                copy_v3_v3(col.co1, pa->prev_state.co);
                add_v3_v3v3(col.co2, pa->prev_state.co, pa->prev_state.vel);
                sub_v3_v3v3(ray_dir, col.co2, col.co1);
@@ -777,6 +779,8 @@ static Object *boid_find_ground(BoidBrainData *bbd, ParticleData *pa, float grou
                if (!bbd->sim->colliders)
                        return NULL;
 
+               memset(&col, 0, sizeof(ParticleCollision));
+
                /* first try to find below boid */
                copy_v3_v3(col.co1, pa->state.co);
                sub_v3_v3v3(col.co2, pa->state.co, zvec);
index db22e0308213f7befb1579905c1456984fbf8b83..526d54a97fa197c60bc2876b34a00e61cce68ea8 100644 (file)
@@ -3313,9 +3313,14 @@ static float collision_newton_rhapson(ParticleCollision *col, float radius, Part
 
        pce->inv_nor = -1;
 
-       /* Initial step size should be small, but not too small or floating point
-        * precision errors will appear. - z0r */
-       dt_init = COLLISION_INIT_STEP * col->inv_total_time;
+       if (col->inv_total_time > 0.0f) {
+               /* Initial step size should be small, but not too small or floating point
+                * precision errors will appear. - z0r */
+               dt_init = COLLISION_INIT_STEP * col->inv_total_time;
+       }
+       else {
+               dt_init = 0.001f;
+       }
 
        /* start from the beginning */
        t0 = 0.f;