diff options
Diffstat (limited to 'source/blender/blenkernel/intern/boids.c')
-rw-r--r-- | source/blender/blenkernel/intern/boids.c | 74 |
1 files changed, 37 insertions, 37 deletions
diff --git a/source/blender/blenkernel/intern/boids.c b/source/blender/blenkernel/intern/boids.c index ae4882b0eca..11ea3384c96 100644 --- a/source/blender/blenkernel/intern/boids.c +++ b/source/blender/blenkernel/intern/boids.c @@ -29,6 +29,11 @@ * ***** END GPL LICENSE BLOCK ***** */ +/** \file blender/blenkernel/intern/boids.c + * \ingroup bke + */ + + #include <string.h> #include <math.h> @@ -208,10 +213,8 @@ static int rule_avoid_collision(BoidRule *rule, BoidBrainData *bbd, BoidValues * sub_v3_v3v3(ray_dir, col.co2, col.co1); mul_v3_fl(ray_dir, acbr->look_ahead); col.f = 0.0f; - col.cfra = fmod(bbd->cfra-bbd->dfra, 1.0f); - col.dfra = bbd->dfra; hit.index = -1; - hit.dist = col.ray_len = len_v3(ray_dir); + hit.dist = col.original_ray_length = len_v3(ray_dir); /* find out closest deflector object */ for(coll = bbd->sim->colliders->first; coll; coll=coll->next) { @@ -219,18 +222,18 @@ static int rule_avoid_collision(BoidRule *rule, BoidBrainData *bbd, BoidValues * if(coll->ob == bpa->ground) continue; - col.ob = coll->ob; + col.current = coll->ob; col.md = coll->collmd; if(col.md && col.md->bvhtree) - BLI_bvhtree_ray_cast(col.md->bvhtree, col.co1, ray_dir, radius, &hit, particle_intersect_face, &col); + BLI_bvhtree_ray_cast(col.md->bvhtree, col.co1, ray_dir, radius, &hit, BKE_psys_collision_neartest_cb, &col); } /* then avoid that object */ if(hit.index>=0) { - t = hit.dist/col.ray_len; + t = hit.dist/col.original_ray_length; /* avoid head-on collision */ - if(dot_v3v3(col.nor, pa->prev_state.ave) < -0.99) { + if(dot_v3v3(col.pce.nor, pa->prev_state.ave) < -0.99f) { /* don't know why, but uneven range [0.0,1.0] */ /* works much better than even [-1.0,1.0] */ bbd->wanted_co[0] = BLI_frand(); @@ -238,7 +241,7 @@ static int rule_avoid_collision(BoidRule *rule, BoidBrainData *bbd, BoidValues * bbd->wanted_co[2] = BLI_frand(); } else { - VECCOPY(bbd->wanted_co, col.nor); + copy_v3_v3(bbd->wanted_co, col.pce.nor); } mul_v3_fl(bbd->wanted_co, (1.0f - t) * val->personal_space * pa->size); @@ -436,7 +439,7 @@ static int rule_follow_leader(BoidRule *rule, BoidBrainData *bbd, BoidValues *va mul = dot_v3v3(vec, vec); /* leader is not moving */ - if(mul < 0.01) { + if(mul < 0.01f) { len = len_v3(loc); /* too close to leader */ if(len < 2.0f * val->personal_space * pa->size) { @@ -473,7 +476,7 @@ static int rule_follow_leader(BoidRule *rule, BoidBrainData *bbd, BoidValues *va else { VECCOPY(loc, flbr->oloc); sub_v3_v3v3(vec, flbr->loc, flbr->oloc); - mul_v3_fl(vec, 1.0/bbd->timestep); + mul_v3_fl(vec, 1.0f/bbd->timestep); } /* fac is seconds behind leader */ @@ -496,7 +499,7 @@ static int rule_follow_leader(BoidRule *rule, BoidBrainData *bbd, BoidValues *va mul = dot_v3v3(vec, vec); /* leader is not moving */ - if(mul < 0.01) { + if(mul < 0.01f) { len = len_v3(loc); /* too close to leader */ if(len < 2.0f * val->personal_space * pa->size) { @@ -727,7 +730,7 @@ static void set_boid_values(BoidValues *val, BoidSettings *boids, ParticleData * if(ELEM(bpa->data.mode, eBoidMode_OnLand, eBoidMode_Climbing)) { val->max_speed = boids->land_max_speed * bpa->data.health/boids->health; val->max_acc = boids->land_max_acc * val->max_speed; - val->max_ave = boids->land_max_ave * M_PI * bpa->data.health/boids->health; + val->max_ave = boids->land_max_ave * (float)M_PI * bpa->data.health/boids->health; val->min_speed = 0.0f; /* no minimum speed on land */ val->personal_space = boids->land_personal_space; val->jump_speed = boids->land_jump_speed * bpa->data.health/boids->health; @@ -735,7 +738,7 @@ static void set_boid_values(BoidValues *val, BoidSettings *boids, ParticleData * else { val->max_speed = boids->air_max_speed * bpa->data.health/boids->health; val->max_acc = boids->air_max_acc * val->max_speed; - val->max_ave = boids->air_max_ave * M_PI * bpa->data.health/boids->health; + val->max_ave = boids->air_max_ave * (float)M_PI * bpa->data.health/boids->health; val->min_speed = boids->air_min_speed * boids->air_max_speed; val->personal_space = boids->air_personal_space; val->jump_speed = 0.0f; /* no jumping in air */ @@ -774,27 +777,26 @@ static Object *boid_find_ground(BoidBrainData *bbd, ParticleData *pa, float *gro /* first try to find below boid */ copy_v3_v3(col.co1, pa->state.co); sub_v3_v3v3(col.co2, pa->state.co, zvec); - sub_v3_v3(col.co2, zvec); sub_v3_v3v3(ray_dir, col.co2, col.co1); col.f = 0.0f; - col.cfra = fmod(bbd->cfra-bbd->dfra, 1.0f); - col.dfra = bbd->dfra; hit.index = -1; - hit.dist = col.ray_len = len_v3(ray_dir); + hit.dist = col.original_ray_length = len_v3(ray_dir); + col.pce.inside = 0; for(coll = bbd->sim->colliders->first; coll; coll = coll->next){ - col.ob = coll->ob; + col.current = coll->ob; col.md = coll->collmd; + col.fac1 = col.fac2 = 0.f; if(col.md && col.md->bvhtree) - BLI_bvhtree_ray_cast(col.md->bvhtree, col.co1, ray_dir, radius, &hit, particle_intersect_face, &col); + BLI_bvhtree_ray_cast(col.md->bvhtree, col.co1, ray_dir, radius, &hit, BKE_psys_collision_neartest_cb, &col); } /* then use that object */ if(hit.index>=0) { - t = hit.dist/col.ray_len; + t = hit.dist/col.original_ray_length; interp_v3_v3v3(ground_co, col.co1, col.co2, t); - normalize_v3_v3(ground_nor, col.nor); - return col.hit_ob; + normalize_v3_v3(ground_nor, col.pce.nor); + return col.hit; } /* couldn't find below, so find upmost deflector object */ @@ -803,24 +805,22 @@ static Object *boid_find_ground(BoidBrainData *bbd, ParticleData *pa, float *gro sub_v3_v3(col.co2, zvec); sub_v3_v3v3(ray_dir, col.co2, col.co1); col.f = 0.0f; - col.cfra = fmod(bbd->cfra-bbd->dfra, 1.0f); - col.dfra = bbd->dfra; hit.index = -1; - hit.dist = col.ray_len = len_v3(ray_dir); + hit.dist = col.original_ray_length = len_v3(ray_dir); for(coll = bbd->sim->colliders->first; coll; coll = coll->next){ - col.ob = coll->ob; + col.current = coll->ob; col.md = coll->collmd; if(col.md && col.md->bvhtree) - BLI_bvhtree_ray_cast(col.md->bvhtree, col.co1, ray_dir, radius, &hit, particle_intersect_face, &col); + BLI_bvhtree_ray_cast(col.md->bvhtree, col.co1, ray_dir, radius, &hit, BKE_psys_collision_neartest_cb, &col); } /* then use that object */ if(hit.index>=0) { - t = hit.dist/col.ray_len; + t = hit.dist/col.original_ray_length; interp_v3_v3v3(ground_co, col.co1, col.co2, t); - normalize_v3_v3(ground_nor, col.nor); - return col.hit_ob; + normalize_v3_v3(ground_nor, col.pce.nor); + return col.hit; } /* default to z=0 */ @@ -872,7 +872,7 @@ static void boid_climb(BoidSettings *boids, ParticleData *pa, float *surface_co, VECCOPY(nor, surface_nor); /* gather apparent gravity */ - VECADDFAC(bpa->gravity, bpa->gravity, surface_nor, -1.0); + VECADDFAC(bpa->gravity, bpa->gravity, surface_nor, -1.0f); normalize_v3(bpa->gravity); /* raise boid it's size from surface */ @@ -1010,7 +1010,7 @@ void boid_brain(BoidBrainData *bbd, int p, ParticleData *pa) /* decide on jumping & liftoff */ if(bpa->data.mode == eBoidMode_OnLand) { /* fuzziness makes boids capable of misjudgement */ - float mul = 1.0 + state->rule_fuzziness; + float mul = 1.0f + state->rule_fuzziness; if(boids->options & BOID_ALLOW_FLIGHT && bbd->wanted_co[2] > 0.0f) { float cvel[3], dir[3]; @@ -1021,7 +1021,7 @@ void boid_brain(BoidBrainData *bbd, int p, ParticleData *pa) VECCOPY(cvel, bbd->wanted_co); normalize_v2(cvel); - if(dot_v2v2(cvel, dir) > 0.95 / mul) + if(dot_v2v2(cvel, dir) > 0.95f / mul) bpa->data.mode = eBoidMode_Liftoff; } else if(val.jump_speed > 0.0f) { @@ -1129,7 +1129,7 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa) bpa->ground = boid_find_ground(bbd, pa, ground_co, ground_nor); /* level = how many particle sizes above ground */ - level = (pa->prev_state.co[2] - ground_co[2])/(2.0f * pa->size) - 0.5; + level = (pa->prev_state.co[2] - ground_co[2])/(2.0f * pa->size) - 0.5f; landing_level = - boids->landing_smoothness * pa->prev_state.vel[2] * pa_mass; @@ -1328,7 +1328,7 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa) boid_climb(boids, pa, ground_co, ground_nor); } /* land boid when really near ground */ - else if(pa->state.co[2] <= ground_co[2] + 1.01 * pa->size * boids->height){ + else if(pa->state.co[2] <= ground_co[2] + 1.01f * pa->size * boids->height){ pa->state.co[2] = ground_co[2] + pa->size * boids->height; pa->state.vel[2] = 0.0f; bpa->data.mode = eBoidMode_OnLand; @@ -1370,7 +1370,7 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa) boid_climb(boids, pa, ground_co, ground_nor); } /* ground is too far away so boid falls */ - else if(pa->state.co[2]-ground_co[2] > 1.1 * pa->size * boids->height) + else if(pa->state.co[2]-ground_co[2] > 1.1f * pa->size * boids->height) bpa->data.mode = eBoidMode_Falling; else { /* constrain to surface */ @@ -1402,7 +1402,7 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa) /* save direction to state.ave unless the boid is falling */ /* (boids can't effect their direction when falling) */ - if(bpa->data.mode!=eBoidMode_Falling && len_v3(pa->state.vel) > 0.1*pa->size) { + if(bpa->data.mode!=eBoidMode_Falling && len_v3(pa->state.vel) > 0.1f*pa->size) { copy_v3_v3(pa->state.ave, pa->state.vel); pa->state.ave[2] *= bbd->part->boids->pitch; normalize_v3(pa->state.ave); |