#include #include #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) + getpid()); 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(); m_monitor_info[i].speed = getRandomSpeed(); } } 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 * m_monitor_info[monitor_num].speed, 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; m_monitor_info[i].speed = getRandomSpeed(); } } uint32_t Spin::getRandomSwitchTime() { return 2000u + (uint32_t) (rand() / (double)RAND_MAX * 3000.0); } float Spin::getRandomSpeed() { return 40.0 + rand() / (double)RAND_MAX * 150.0; }