diff options
Diffstat (limited to 'debian/fireflies/fireflies-2.08/src/bait.cc')
-rw-r--r-- | debian/fireflies/fireflies-2.08/src/bait.cc | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/debian/fireflies/fireflies-2.08/src/bait.cc b/debian/fireflies/fireflies-2.08/src/bait.cc new file mode 100644 index 00000000..417b9b72 --- /dev/null +++ b/debian/fireflies/fireflies-2.08/src/bait.cc @@ -0,0 +1,98 @@ +#include "bait.h" +#include "modes.h" +#include "scene.h" + +Bait::Bait() + : Arrow() +{ + age = rand_real(0., 10.); + fuzz = rand_real(0.7, 1.4); + glow = false; + attractor = 0; + bait_start_mode(this, BMODE_NORMAL); + + hsv[0] = 30.0*rand_int(0, 12); // initial hue + turn_delay = rand_real(1., 4.); + turn_when = age + rand_real(0.5, turn_delay); + pos = Vec3f( + rand_real(-world[0], world[0]), + rand_real(-world[1], world[1]), + rand_real(-world[2], world[2])); + velocity = bspeed*unit_vec(-pos); + + for (int i = 0; i < 3; i++) { + if (rand_int(0, 1)==0) accel[i] = -baccel; + else accel[i] = baccel; + } + + set_color(); + +#ifdef DEBUG + cerr << "bait: " << bspeed << " and " << baccel + << "\tflies: " << fspeed << " and " << faccel << endl; +#endif +} + +void Bait::draw() +{ + if (!scene.draw_bait) + return; + + glPushMatrix(); + Arrow::draw(); + glPopMatrix(); +} + +void Bait::elapse(double t) +{ + hsv[0] += hue_rate*t; + age += t; + + if (age >= mode_when) + bait_start_mode(this, mode_next); + while (stop_timer.is_ready(age)) + bait_stop_mode(this, stop_timer.pop()); + + calc_accel(); + velocity += accel*t; + clamp_vec(velocity, bspeed); + pos += velocity*t; + + point(velocity); + set_color(); +} + +void Bait::calc_accel() +{ + if (attractor) { + accel = baccel*unit_vec((*attractor) - pos); + return; + } + + // time to turn + if (age >= turn_when) { + for (int i = 0; i < 3; i++) { + if (rand_int(0, 1) == 0) + accel[i] = -SIGN(accel[i])*baccel; + } + turn_when = age + rand_real(0.5, turn_delay); + } + + for (int i = 0; i < 3; i++) { + if (pos[i] < -world[i]) accel[i] = baccel; + else if (pos[i] > world[i]) accel[i] = -baccel; + } +} + +void Bait::set_color() +{ + // keep everything as before + + // 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); +} |