diff options
Diffstat (limited to 'debian/fireflies/fireflies-2.08/src/firefly.cc')
-rw-r--r-- | debian/fireflies/fireflies-2.08/src/firefly.cc | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/debian/fireflies/fireflies-2.08/src/firefly.cc b/debian/fireflies/fireflies-2.08/src/firefly.cc new file mode 100644 index 00000000..b4f50d68 --- /dev/null +++ b/debian/fireflies/fireflies-2.08/src/firefly.cc @@ -0,0 +1,84 @@ +#include "firefly.h" +#include "scene.h" +#include "modes.h" + +Firefly::Firefly(Bait *_bait, Vec3f ctr, double spread) + : Arrow(), bait(_bait), age(0.) +{ + pos = ctr; + pos += rand_vec3(-spread, spread); + + velocity = bait->fspeed*unit_vec(bait->pos - pos); + tail = new Tail(this); +} + +Firefly::~Firefly() +{ + tail->owner = 0; + scene.dead_tails.push_back(tail); +} + +void Firefly::draw() +{ + glPushMatrix(); + Arrow::draw(); + glPopMatrix(); + + tail->draw(); +} + +void Firefly::elapse(double t) +{ + age += t; + + calc_accel(); + velocity += accel*t; + clamp_vec(velocity, bait->fspeed); + pos += velocity*t; + + point(velocity); + set_color(); + + // elapse, my children + tail->elapse(t); +} + +void Firefly::calc_accel() +{ + if (age > 2.0 && rand_int(0, 60)==0) { + GLuint i, closest_i = 0; + double dist, closest_dist = 1e10; + for (i = 0; i < scene.baits.size(); i++) { + if ((dist=norm(scene.baits[i]->pos - pos)) < closest_dist) { + closest_dist = dist; + closest_i = i; + } + } + dist = norm(bait->pos - pos); + if (closest_dist < dist-1.0) { + bait = scene.baits[closest_i]; + age = 0.; + } + } + else if (age > 5.0) { + if (norm(bait->pos - pos) >= 200 && !(bait->bspeed == 0 || bait->attractor)) { + bait->mode_next = BMODE_STOP; + } + } + + accel = bait->faccel*unit_vec(bait->pos - pos); +} + +void Firefly::set_color() +{ + hsv = bait->hsv; + hsv[0] += 40*norm2(velocity)/(bait->fspeed*bait->fspeed) - 20; + + // clamp to my range + while (hsv[0] > 360.f) + hsv[0] -= 360.f; + while (hsv[0] < 0.f) + hsv[0] += 360.f; + + color = hsv_to_rgb(hsv); +} |