#include #include #include #include #include #include #include #include "Starfield.h" Starfield::Starfield(GnomeScreensaver & gs) { uint64_t ticks = gs.getTicks(); m_last_ticks = ticks; srand(time(NULL) + getpid()); for (int i = 0; i < NUM_STARS; i++) newStar(NUM_STARS - i - 1, ticks - (uint64_t) (i * FLYBY_TICKS / (double)NUM_STARS)); m_star_idx = 0; } Starfield::~Starfield() { } bool Starfield::expose (GnomeScreensaver & gs) { uint64_t ticks = gs.getTicks(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0, 0, gs.getWidth(), gs.getHeight()); for (int i = 0; i < NUM_STARS; i++) { glPushMatrix(); glTranslatef(m_stars[i].x, m_stars[i].y, (ticks - m_stars[i].create_time) / (double) FLYBY_TICKS * MAX_STAR_DIST - MAX_STAR_DIST); glRotatef(m_stars[i].rot, m_stars[i].axis[0], m_stars[i].axis[1], m_stars[i].axis[2]); m_logobox.draw(); glPopMatrix(); } while ((m_stars[m_star_idx].create_time + FLYBY_TICKS) <= ticks) { newStar(m_star_idx, ticks); m_star_idx++; if (m_star_idx >= NUM_STARS) m_star_idx = 0; } m_last_ticks = gs.getTicks(); return true; } bool Starfield::configure (GnomeScreensaver & gs) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, gs.getAspectRatio(), 0.01, MAX_STAR_DIST); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, 0, 0, 0, 0, -1, 0, 1, 0); return true; } bool Starfield::update (GnomeScreensaver & gs) { return true; } void Starfield::getRandomAxis(float (*axis)[3]) { double alpha = rand() / (double)RAND_MAX * 2.0 * M_PI; double beta = rand() / (double)RAND_MAX * M_PI; (*axis)[0] = cos(alpha) * sin(beta); (*axis)[1] = sin(alpha) * sin(beta); (*axis)[2] = cos(beta); } void Starfield::newStar(int idx, uint64_t ticks) { m_stars[idx].create_time = ticks; getRandomAxis(&m_stars[idx].axis); m_stars[idx].x = ((rand() / (double)RAND_MAX) - 0.5) * STAR_MAXX * 2; m_stars[idx].y = ((rand() / (double)RAND_MAX) - 0.5) * STAR_MAXY * 2; m_stars[idx].rot = rand() / (double)RAND_MAX * 360.0; }