summaryrefslogtreecommitdiffstats
path: root/debian/fireflies/fireflies-2.08/src/bait.cc
diff options
context:
space:
mode:
Diffstat (limited to 'debian/fireflies/fireflies-2.08/src/bait.cc')
-rw-r--r--debian/fireflies/fireflies-2.08/src/bait.cc98
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);
+}