#include #include #include #include #include #include #include #include "Tunnel.h" using namespace std; #define N_LOGOS_PER_RING 12 #define RING_RADIUS 18 #define BREAKOFF_DIST 20 #define RING_LAYER_DIST 10 Tunnel::Tunnel() { m_last_ticks = 0; srand(time(NULL) + getpid()); } Tunnel::~Tunnel() { } bool Tunnel::expose (GnomeScreensaver & gs) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); for (list::const_iterator it = m_logos.begin(); it != m_logos.end(); it++) { glPushMatrix(); glTranslatef(0, m_offset + it->offset + 50, 0); glRotatef(it->trot, 0, 1, 0); glTranslatef(RING_RADIUS, 0, 0); glRotatef(-90.0, 0, 0, 1); glRotatef(90.0, 1, 0, 0); glRotatef(it->zrot, 0, 0, 1); m_logobox.draw(); glPopMatrix(); } return true; } bool Tunnel::configure (GnomeScreensaver & gs) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, gs.getAspectRatio() / gs.getNumMonitors(), 0.01, 1000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, 0, 0, 0, 1, 0, 0, 0, 1); glViewport(0, 0, gs.getWidth(), gs.getHeight()); for (int i = 0; i < 5; i++) { for (int j = 0; j < N_LOGOS_PER_RING; j++) { float zrot = ((j + i) & 0x3) * 90.0; float trot = j * 360.0 / N_LOGOS_PER_RING; LBStruct lbs = { -i * RING_LAYER_DIST, zrot, trot, {0, 0, 1} }; m_logos.push_back(lbs); } } return true; } bool Tunnel::update (GnomeScreensaver & gs) { return true; }