#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(i, ticks); } 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()); glPushMatrix(); glTranslatef(0, 0, -30); m_logobox.draw(); glPopMatrix(); 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); }