From 34a8729811a69d0ac93f543cd8ee2dbbcaa45b98 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 8 Dec 2010 13:03:38 -0500 Subject: [PATCH] Spin: replaced 6 orthogonal directions with a completely random axis --- modes/Spin.cc | 28 ++++++++++++---------------- modes/Spin.h | 4 ++-- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/modes/Spin.cc b/modes/Spin.cc index 56af375..3b86fb8 100644 --- a/modes/Spin.cc +++ b/modes/Spin.cc @@ -1,16 +1,13 @@ #include #include +#include #include #include #include "Spin.h" -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; @@ -34,7 +31,7 @@ bool Spin::expose (GnomeScreensaver & gs) if (gs.getTicks() - m_monitor_info[i].last_switch_ticks > m_monitor_info[i].switch_time) { - m_monitor_info[i].direction = getRandomDirection(); + getRandomAxis(&m_monitor_info[i].axis); m_monitor_info[i].switch_time = getRandomSwitchTime(); m_monitor_info[i].last_switch_ticks = gs.getTicks(); } @@ -49,11 +46,10 @@ bool Spin::expose (GnomeScreensaver & gs) glLoadMatrixf(&m_monitor_info[monitor_num].rotation[0]); - int direction = m_monitor_info[monitor_num].direction; glRotatef((gs.getTicks() - m_last_ticks) / 1000.0 * 360.0 / 4.0, - directions[direction][0], - directions[direction][1], - directions[direction][2]); + 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]); @@ -92,20 +88,20 @@ void Spin::initMonitorInfo() { for (int i = 0; i < m_num_monitors; i++) { - m_monitor_info[i].direction = getRandomDirection(); + 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; } } -int Spin::getRandomDirection() +void Spin::getRandomAxis(float (*axis)[3]) { - int direction = (int) (rand() / (double)RAND_MAX * - sizeof(directions) / sizeof(directions[0])); - if (direction >= sizeof(directions) / sizeof(directions[0])) - direction = 0; - return direction; + 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() diff --git a/modes/Spin.h b/modes/Spin.h index cc47eb4..82ac1a1 100644 --- a/modes/Spin.h +++ b/modes/Spin.h @@ -16,7 +16,7 @@ class Spin : public Mode bool update (GnomeScreensaver & gs); typedef struct monitor_info_s { - int direction; + float axis[3]; float rotation[16]; int switch_time; uint32_t last_switch_ticks; @@ -27,7 +27,7 @@ class Spin : public Mode monitor_info_t *m_monitor_info; unsigned int m_last_ticks; void initMonitorInfo(); - int getRandomDirection(); + void getRandomAxis(float (*axis)[3]); uint32_t getRandomSwitchTime(); };