#include #include #include #include #include #include "Spin.h" Spin::Spin() { m_num_monitors = 1; m_monitor_info = new monitor_info_t[m_num_monitors]; m_last_ticks = 0; srand(time(NULL)); initMonitorInfo(); } Spin::~Spin() { delete[] m_monitor_info; } bool Spin::expose (GnomeScreensaver & gs) { if (m_last_ticks == 0) m_last_ticks = gs.getTicks(); else for (int i = 0; i < m_num_monitors; i++) { if (gs.getTicks() - m_monitor_info[i].last_switch_ticks > m_monitor_info[i].switch_time) { getRandomAxis(&m_monitor_info[i].axis); m_monitor_info[i].switch_time = getRandomSwitchTime(); m_monitor_info[i].last_switch_ticks = gs.getTicks(); } } int width = gs.getWidth() / m_num_monitors; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); for (int monitor_num = 0; monitor_num < m_num_monitors; monitor_num++) { glViewport(width * monitor_num, 0, width, gs.getHeight()); glLoadMatrixf(&m_monitor_info[monitor_num].rotation[0]); glRotatef((gs.getTicks() - m_last_ticks) / 1000.0 * 360.0 / 4.0, m_monitor_info[monitor_num].axis[0], m_monitor_info[monitor_num].axis[1], m_monitor_info[monitor_num].axis[2]); glGetFloatv(GL_MODELVIEW_MATRIX, &m_monitor_info[monitor_num].rotation[0]); m_logobox.draw(); } m_last_ticks = gs.getTicks(); return true; } bool Spin::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, 10, 0, 0, 0, 0, 1, 0); m_num_monitors = gs.getNumMonitors(); delete[] m_monitor_info; m_monitor_info = new monitor_info_t[m_num_monitors]; initMonitorInfo(); return true; } bool Spin::update (GnomeScreensaver & gs) { return true; } void Spin::initMonitorInfo() { for (int i = 0; i < m_num_monitors; i++) { getRandomAxis(&m_monitor_info[i].axis); glGetFloatv(GL_MODELVIEW_MATRIX, &m_monitor_info[i].rotation[0]); m_monitor_info[i].switch_time = getRandomSwitchTime(); m_monitor_info[i].last_switch_ticks = 0; } } void Spin::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); } uint32_t Spin::getRandomSwitchTime() { return 2000u + (uint32_t) (rand() / (double)RAND_MAX * 3000.0); }