Spin: change logo to spin on random axis every 5 seconds

This commit is contained in:
Josh Holtrop 2010-12-07 15:34:18 -05:00
parent 01f530ad8d
commit eb5f709d5e
3 changed files with 75 additions and 9 deletions

View File

@ -44,8 +44,8 @@ int main (int argc, char *argv[])
glEnable(GL_LIGHT0); glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
modes[0]->configure(gs);
current_mode = modes[0]; current_mode = modes[0];
current_mode->configure(gs);
gs.mainloop(); gs.mainloop();

View File

@ -1,27 +1,71 @@
#include <stdlib.h>
#include <time.h>
#include <GL/gl.h> #include <GL/gl.h>
#include <GL/glu.h> #include <GL/glu.h>
#include "Spin.h" #include "Spin.h"
#define SWITCH_TIME 5000
static const float directions[][3] = {
{0, 0, 1}, {0, 0, -1}, {0, 1, 0}, {0, -1, 0}, {1, 0, 0}, {-1, 0, 0}
};
Spin::Spin()
{
m_num_monitors = 1;
m_directions = new int[m_num_monitors];
m_directions[0] = 1;
m_rotations = new matrix_t[m_num_monitors];
glGetFloatv(GL_MODELVIEW_MATRIX, &m_rotations[0][0]);
m_last_switch_ticks = 0;
m_last_ticks = 0;
srand(time(NULL));
}
Spin::~Spin()
{
delete[] m_directions;
delete[] m_rotations;
}
bool Spin::expose (GnomeScreensaver & gs) bool Spin::expose (GnomeScreensaver & gs)
{ {
int n_monitors = gs.getNumMonitors(); if (m_last_ticks == 0)
int width = gs.getWidth() / n_monitors; m_last_switch_ticks = m_last_ticks = gs.getTicks();
else if (gs.getTicks() - m_last_switch_ticks > SWITCH_TIME)
{
for (int i = 0; i < m_num_monitors; i++)
{
m_directions[i] = (int) (rand() / (double)RAND_MAX *
sizeof(directions) / sizeof(directions[0]));
if (m_directions[i] >= sizeof(directions) / sizeof(directions[0]))
m_directions[i] = 0;
}
m_last_switch_ticks = gs.getTicks();
}
int width = gs.getWidth() / m_num_monitors;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
for (int monitor_num = 0; monitor_num < n_monitors; monitor_num++) for (int monitor_num = 0; monitor_num < m_num_monitors; monitor_num++)
{ {
glViewport(width * monitor_num, 0, width, gs.getHeight()); glViewport(width * monitor_num, 0, width, gs.getHeight());
glPushMatrix(); glLoadMatrixf(&m_rotations[monitor_num][0]);
int direction = m_directions[monitor_num];
glRotatef((gs.getTicks() - m_last_ticks) / 1000.0 * 360.0 / 4.0,
directions[direction][0],
directions[direction][1],
directions[direction][2]);
glGetFloatv(GL_MODELVIEW_MATRIX, &m_rotations[monitor_num][0]);
glRotatef(gs.getTicks() / 1000.0 * 360.0 / 4.0
* (monitor_num & 0x1 ? -1.0 : 1.0), 0, 1, 0);
m_logobox.draw(); m_logobox.draw();
glPopMatrix();
} }
m_last_ticks = gs.getTicks();
return true; return true;
} }
@ -37,6 +81,20 @@ bool Spin::configure (GnomeScreensaver & gs)
glLoadIdentity(); glLoadIdentity();
gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0); gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);
m_num_monitors = gs.getNumMonitors();
delete[] m_directions;
delete[] m_rotations;
m_directions = new int[m_num_monitors];
m_rotations = new matrix_t[m_num_monitors];
for (int i = 0; i < m_num_monitors; i++)
{
m_directions[i] = (int) (rand() / (double)RAND_MAX *
sizeof(directions) / sizeof(directions[0]));
if (m_directions[i] >= sizeof(directions) / sizeof(directions[0]))
m_directions[i] = 0;
glGetFloatv(GL_MODELVIEW_MATRIX, &m_rotations[i][0]);
}
return true; return true;
} }

View File

@ -9,11 +9,19 @@
class Spin : public Mode class Spin : public Mode
{ {
public: public:
Spin();
~Spin();
bool expose (GnomeScreensaver & gs); bool expose (GnomeScreensaver & gs);
bool configure (GnomeScreensaver & gs); bool configure (GnomeScreensaver & gs);
bool update (GnomeScreensaver & gs); bool update (GnomeScreensaver & gs);
typedef float matrix_t[16];
protected: protected:
LogoBox m_logobox; LogoBox m_logobox;
int * m_directions;
matrix_t * m_rotations;
int m_num_monitors;
unsigned int m_last_switch_ticks;
unsigned int m_last_ticks;
}; };
#endif /* SPIN_H */ #endif /* SPIN_H */