Fix #36630, Particlesystem - boids - goal - collision.

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.
This commit is contained in:
Lukas Toenne
2013-09-27 13:45:47 +00:00
parent 9aaeaae7e0
commit 640fc26c03
2 changed files with 12 additions and 3 deletions

View 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);

View 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;