From 1ce4e3a81b2c9af330cdefaaab85d70df95eb67a Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Tue, 11 Oct 2011 16:14:49 -0400 Subject: [PATCH 1/9] add skeleton Tunnel mode, no content yet --- modes/Tunnel.cc | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ modes/Tunnel.h | 28 ++++++++++++++++++++++++++++ src/dwss.cc | 3 ++- 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 modes/Tunnel.cc create mode 100644 modes/Tunnel.h diff --git a/modes/Tunnel.cc b/modes/Tunnel.cc new file mode 100644 index 0000000..f230bf4 --- /dev/null +++ b/modes/Tunnel.cc @@ -0,0 +1,49 @@ + +#include +#include +#include +#include +#include + +#include +#include + +#include "Tunnel.h" + +Tunnel::Tunnel() +{ + m_last_ticks = 0; + srand(time(NULL) + getpid()); +} + +Tunnel::~Tunnel() +{ +} + +bool Tunnel::expose (GnomeScreensaver & gs) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + return true; +} + +bool Tunnel::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); + + glViewport(0, 0, gs.getWidth(), gs.getHeight()); + + return true; +} + +bool Tunnel::update (GnomeScreensaver & gs) +{ + return true; +} diff --git a/modes/Tunnel.h b/modes/Tunnel.h new file mode 100644 index 0000000..1136e0d --- /dev/null +++ b/modes/Tunnel.h @@ -0,0 +1,28 @@ + +#ifndef TUNNEL_H +#define TUNNEL_H + +#include "LogoBox.h" +#include "Mode.h" +#include "GnomeScreensaver.h" + +class Tunnel : public Mode +{ + public: + Tunnel(); + ~Tunnel(); + bool expose (GnomeScreensaver & gs); + bool configure (GnomeScreensaver & gs); + bool update (GnomeScreensaver & gs); + protected: + LogoBox m_logobox; + int m_num_monitors; + uint64_t m_last_ticks; + void initMonitorInfo(); + void getRandomAxis(float (*axis)[3]); + uint32_t getRandomSwitchTime(); + float getRandomSpeed(); +}; + +#endif /* TUNNEL_H */ + diff --git a/src/dwss.cc b/src/dwss.cc index 96ea7b1..f515de7 100644 --- a/src/dwss.cc +++ b/src/dwss.cc @@ -34,8 +34,9 @@ static Mode *getMode(GnomeScreensaver & gs) { #if 0 return new Starfield(gs); -#endif return new Spin(); +#endif + return new Tunnel(); } int main (int argc, char *argv[]) From 07a2157fe61c63297f449f8ebd6b303cab0932ac Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 12 Oct 2011 12:26:00 -0400 Subject: [PATCH 2/9] begin creating the ring --- modes/Tunnel.cc | 40 +++++++++++++++++++++++++++++++++++++++- modes/Tunnel.h | 15 ++++++++++----- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/modes/Tunnel.cc b/modes/Tunnel.cc index f230bf4..ce56705 100644 --- a/modes/Tunnel.cc +++ b/modes/Tunnel.cc @@ -10,6 +10,13 @@ #include "Tunnel.h" +using namespace std; + +#define N_LOGOS_PER_RING 12 +#define RING_RADIUS 18 +#define BREAKOFF_DIST 20 +#define RING_LAYER_DIST 10 + Tunnel::Tunnel() { m_last_ticks = 0; @@ -24,6 +31,21 @@ bool Tunnel::expose (GnomeScreensaver & gs) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + for (list::const_iterator it = m_logos.begin(); + it != m_logos.end(); + it++) + { + glPushMatrix(); + glTranslatef(0, m_offset + it->offset + 50, 0); + glRotatef(it->trot, 0, 1, 0); + glTranslatef(RING_RADIUS, 0, 0); + glRotatef(-90.0, 0, 0, 1); + glRotatef(90.0, 1, 0, 0); + glRotatef(it->zrot, 0, 0, 1); + m_logobox.draw(); + glPopMatrix(); + } + return true; } @@ -36,10 +58,26 @@ bool Tunnel::configure (GnomeScreensaver & gs) glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0); + gluLookAt(0, 0, 0, 0, 1, 0, 0, 0, 1); glViewport(0, 0, gs.getWidth(), gs.getHeight()); + for (int i = 0; i < 5; i++) + { + for (int j = 0; j < N_LOGOS_PER_RING; j++) + { + float zrot = ((j + i) & 0x3) * 90.0; + float trot = j * 360.0 / N_LOGOS_PER_RING; + LBStruct lbs = { + -i * RING_LAYER_DIST, + zrot, + trot, + {0, 0, 1} + }; + m_logos.push_back(lbs); + } + } + return true; } diff --git a/modes/Tunnel.h b/modes/Tunnel.h index 1136e0d..f1519a9 100644 --- a/modes/Tunnel.h +++ b/modes/Tunnel.h @@ -2,6 +2,8 @@ #ifndef TUNNEL_H #define TUNNEL_H +#include + #include "LogoBox.h" #include "Mode.h" #include "GnomeScreensaver.h" @@ -14,14 +16,17 @@ class Tunnel : public Mode bool expose (GnomeScreensaver & gs); bool configure (GnomeScreensaver & gs); bool update (GnomeScreensaver & gs); + typedef struct { + float offset; + float zrot; + float trot; + float spin_axis[3]; + } LBStruct; protected: LogoBox m_logobox; - int m_num_monitors; uint64_t m_last_ticks; - void initMonitorInfo(); - void getRandomAxis(float (*axis)[3]); - uint32_t getRandomSwitchTime(); - float getRandomSpeed(); + std::list m_logos; + float m_offset; }; #endif /* TUNNEL_H */ From 14b92e35af193b62a6934e6b193f83a4fb79744d Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 12 Oct 2011 12:28:58 -0400 Subject: [PATCH 3/9] rework initial logo offsets --- modes/Tunnel.cc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modes/Tunnel.cc b/modes/Tunnel.cc index ce56705..4a00fc2 100644 --- a/modes/Tunnel.cc +++ b/modes/Tunnel.cc @@ -12,9 +12,10 @@ using namespace std; +#define N_INITIAL_LAYERS 5 #define N_LOGOS_PER_RING 12 #define RING_RADIUS 18 -#define BREAKOFF_DIST 20 +#define BREAKOFF_DIST 80 #define RING_LAYER_DIST 10 Tunnel::Tunnel() @@ -36,7 +37,7 @@ bool Tunnel::expose (GnomeScreensaver & gs) it++) { glPushMatrix(); - glTranslatef(0, m_offset + it->offset + 50, 0); + glTranslatef(0, m_offset + it->offset, 0); glRotatef(it->trot, 0, 1, 0); glTranslatef(RING_RADIUS, 0, 0); glRotatef(-90.0, 0, 0, 1); @@ -62,14 +63,14 @@ bool Tunnel::configure (GnomeScreensaver & gs) glViewport(0, 0, gs.getWidth(), gs.getHeight()); - for (int i = 0; i < 5; i++) + for (int i = 0; i < N_INITIAL_LAYERS; i++) { for (int j = 0; j < N_LOGOS_PER_RING; j++) { float zrot = ((j + i) & 0x3) * 90.0; float trot = j * 360.0 / N_LOGOS_PER_RING; LBStruct lbs = { - -i * RING_LAYER_DIST, + (N_INITIAL_LAYERS - i) * RING_LAYER_DIST, zrot, trot, {0, 0, 1} From 2cab647bcb88fd96c8a1e0b42d4ae858bb785928 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 12 Oct 2011 12:37:30 -0400 Subject: [PATCH 4/9] Tunnel mode: abstract out addRing() --- modes/Tunnel.cc | 44 +++++++++++++++++++++++++++++++------------- modes/Tunnel.h | 7 +++++-- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/modes/Tunnel.cc b/modes/Tunnel.cc index 4a00fc2..1357846 100644 --- a/modes/Tunnel.cc +++ b/modes/Tunnel.cc @@ -17,6 +17,7 @@ using namespace std; #define RING_RADIUS 18 #define BREAKOFF_DIST 80 #define RING_LAYER_DIST 10 +#define XLATE_RATE 0.02 Tunnel::Tunnel() { @@ -30,6 +31,11 @@ Tunnel::~Tunnel() bool Tunnel::expose (GnomeScreensaver & gs) { + if (m_last_ticks == 0) + m_last_ticks = gs.getTicks(); + uint64_t ticks = gs.getTicks(); + int elapsed = ticks - m_last_ticks; + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); for (list::const_iterator it = m_logos.begin(); @@ -47,9 +53,28 @@ bool Tunnel::expose (GnomeScreensaver & gs) glPopMatrix(); } + m_last_ticks = ticks; + return true; } +void Tunnel::addRing() +{ + for (int j = 0; j < N_LOGOS_PER_RING; j++) + { + float zrot = ((j + m_ring_rot_idx) & 0x3) * 90.0; + float trot = j * 360.0 / N_LOGOS_PER_RING; + LBStruct lbs = { + m_offset, + zrot, + trot, + {0, 0, 1} + }; + m_logos.push_back(lbs); + } + m_ring_rot_idx++; +} + bool Tunnel::configure (GnomeScreensaver & gs) { glMatrixMode(GL_PROJECTION); @@ -63,22 +88,15 @@ bool Tunnel::configure (GnomeScreensaver & gs) glViewport(0, 0, gs.getWidth(), gs.getHeight()); - for (int i = 0; i < N_INITIAL_LAYERS; i++) + for (int i = 0; i <= N_INITIAL_LAYERS; i++) { - for (int j = 0; j < N_LOGOS_PER_RING; j++) - { - float zrot = ((j + i) & 0x3) * 90.0; - float trot = j * 360.0 / N_LOGOS_PER_RING; - LBStruct lbs = { - (N_INITIAL_LAYERS - i) * RING_LAYER_DIST, - zrot, - trot, - {0, 0, 1} - }; - m_logos.push_back(lbs); - } + m_offset = (N_INITIAL_LAYERS - i) * RING_LAYER_DIST, + addRing(); } + m_offset = 0.0; + m_last_ring_offset = 0.0; + return true; } diff --git a/modes/Tunnel.h b/modes/Tunnel.h index f1519a9..0ba1021 100644 --- a/modes/Tunnel.h +++ b/modes/Tunnel.h @@ -17,16 +17,19 @@ class Tunnel : public Mode bool configure (GnomeScreensaver & gs); bool update (GnomeScreensaver & gs); typedef struct { - float offset; + double offset; float zrot; float trot; float spin_axis[3]; } LBStruct; protected: + void addRing(); LogoBox m_logobox; uint64_t m_last_ticks; std::list m_logos; - float m_offset; + double m_offset; + double m_last_ring_offset; + unsigned int m_ring_rot_idx; }; #endif /* TUNNEL_H */ From 878b441742390628f731d7d23597395c9a61e9cc Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 12 Oct 2011 12:45:15 -0400 Subject: [PATCH 5/9] rework addRing(); consider LBStruct.offset the offset when created --- modes/Tunnel.cc | 15 ++++++++++----- modes/Tunnel.h | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/modes/Tunnel.cc b/modes/Tunnel.cc index 1357846..80e9643 100644 --- a/modes/Tunnel.cc +++ b/modes/Tunnel.cc @@ -35,6 +35,12 @@ bool Tunnel::expose (GnomeScreensaver & gs) m_last_ticks = gs.getTicks(); uint64_t ticks = gs.getTicks(); int elapsed = ticks - m_last_ticks; + m_offset += XLATE_RATE * elapsed; + while (m_offset - m_last_ring_offset > RING_LAYER_DIST) + { + m_last_ring_offset += RING_LAYER_DIST; + addRing(m_last_ring_offset); + } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -43,7 +49,7 @@ bool Tunnel::expose (GnomeScreensaver & gs) it++) { glPushMatrix(); - glTranslatef(0, m_offset + it->offset, 0); + glTranslatef(0, m_offset - it->offset, 0); glRotatef(it->trot, 0, 1, 0); glTranslatef(RING_RADIUS, 0, 0); glRotatef(-90.0, 0, 0, 1); @@ -58,14 +64,14 @@ bool Tunnel::expose (GnomeScreensaver & gs) return true; } -void Tunnel::addRing() +void Tunnel::addRing(double offset) { for (int j = 0; j < N_LOGOS_PER_RING; j++) { float zrot = ((j + m_ring_rot_idx) & 0x3) * 90.0; float trot = j * 360.0 / N_LOGOS_PER_RING; LBStruct lbs = { - m_offset, + offset, zrot, trot, {0, 0, 1} @@ -90,8 +96,7 @@ bool Tunnel::configure (GnomeScreensaver & gs) for (int i = 0; i <= N_INITIAL_LAYERS; i++) { - m_offset = (N_INITIAL_LAYERS - i) * RING_LAYER_DIST, - addRing(); + addRing((i - N_INITIAL_LAYERS) * RING_LAYER_DIST); } m_offset = 0.0; diff --git a/modes/Tunnel.h b/modes/Tunnel.h index 0ba1021..673b6c6 100644 --- a/modes/Tunnel.h +++ b/modes/Tunnel.h @@ -23,7 +23,7 @@ class Tunnel : public Mode float spin_axis[3]; } LBStruct; protected: - void addRing(); + void addRing(double offset); LogoBox m_logobox; uint64_t m_last_ticks; std::list m_logos; From 2f7858d60c74aa62546f0b233704a800cc349845 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 12 Oct 2011 13:03:52 -0400 Subject: [PATCH 6/9] rotate tunnel over time --- modes/Tunnel.cc | 9 +++++++++ modes/Tunnel.h | 1 + 2 files changed, 10 insertions(+) diff --git a/modes/Tunnel.cc b/modes/Tunnel.cc index 80e9643..77accdc 100644 --- a/modes/Tunnel.cc +++ b/modes/Tunnel.cc @@ -18,6 +18,7 @@ using namespace std; #define BREAKOFF_DIST 80 #define RING_LAYER_DIST 10 #define XLATE_RATE 0.02 +#define REVOLUTION_TIME 15000 Tunnel::Tunnel() { @@ -32,7 +33,10 @@ Tunnel::~Tunnel() bool Tunnel::expose (GnomeScreensaver & gs) { if (m_last_ticks == 0) + { m_last_ticks = gs.getTicks(); + m_start_ticks = m_last_ticks; + } uint64_t ticks = gs.getTicks(); int elapsed = ticks - m_last_ticks; m_offset += XLATE_RATE * elapsed; @@ -44,6 +48,10 @@ bool Tunnel::expose (GnomeScreensaver & gs) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glPushMatrix(); + glRotatef(360.0 * + ((ticks - m_start_ticks) % REVOLUTION_TIME) / REVOLUTION_TIME, + 0, 1, 0); for (list::const_iterator it = m_logos.begin(); it != m_logos.end(); it++) @@ -58,6 +66,7 @@ bool Tunnel::expose (GnomeScreensaver & gs) m_logobox.draw(); glPopMatrix(); } + glPopMatrix(); m_last_ticks = ticks; diff --git a/modes/Tunnel.h b/modes/Tunnel.h index 673b6c6..28f2092 100644 --- a/modes/Tunnel.h +++ b/modes/Tunnel.h @@ -26,6 +26,7 @@ class Tunnel : public Mode void addRing(double offset); LogoBox m_logobox; uint64_t m_last_ticks; + uint64_t m_start_ticks; std::list m_logos; double m_offset; double m_last_ring_offset; From 697af590ea6b90b69fa1d26db382e44330356cd1 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 12 Oct 2011 13:37:26 -0400 Subject: [PATCH 7/9] implement logo breakouts - going too fast though --- modes/Tunnel.cc | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- modes/Tunnel.h | 5 +++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/modes/Tunnel.cc b/modes/Tunnel.cc index 77accdc..15ad96b 100644 --- a/modes/Tunnel.cc +++ b/modes/Tunnel.cc @@ -19,6 +19,7 @@ using namespace std; #define RING_LAYER_DIST 10 #define XLATE_RATE 0.02 #define REVOLUTION_TIME 15000 +#define DESTROY_DIST 250 Tunnel::Tunnel() { @@ -30,6 +31,20 @@ Tunnel::~Tunnel() { } +void Tunnel::getRandomBreakAxis(float (*axis)[3]) +{ + double alpha = rand() / (double)RAND_MAX * 2.0 * M_PI; + double beta = rand() / (double)RAND_MAX * (M_PI / 4.0); + (*axis)[0] = cos(alpha) * sin(beta); + (*axis)[2] = sin(alpha) * sin(beta); + (*axis)[1] = cos(beta); +} + +float Tunnel::getRandomBreakSpinSpeed() +{ + return 0.01 + rand() / (double)RAND_MAX * 0.01; +} + bool Tunnel::expose (GnomeScreensaver & gs) { if (m_last_ticks == 0) @@ -52,17 +67,45 @@ bool Tunnel::expose (GnomeScreensaver & gs) glRotatef(360.0 * ((ticks - m_start_ticks) % REVOLUTION_TIME) / REVOLUTION_TIME, 0, 1, 0); - for (list::const_iterator it = m_logos.begin(); + for (list::iterator it = m_logos.begin(); it != m_logos.end(); it++) { + double diff_offset = m_offset - it->offset; + if (diff_offset > DESTROY_DIST) + { + m_logos.erase(it++); + continue; + } + + if (it->break_ticks == 0 && diff_offset > BREAKOFF_DIST) + { + it->break_ticks = ticks; + getRandomAxis(&it->spin_axis); + getRandomBreakAxis(&it->break_axis); + it->spin_rate = getRandomBreakSpinSpeed(); + } glPushMatrix(); - glTranslatef(0, m_offset - it->offset, 0); + if (it->break_ticks) + { + int break_ticks = ticks - it->break_ticks; + glTranslatef(break_ticks * it->break_axis[0], + break_ticks * it->break_axis[1], + break_ticks * it->break_axis[2]); + } + glTranslatef(0, diff_offset, 0); glRotatef(it->trot, 0, 1, 0); glTranslatef(RING_RADIUS, 0, 0); glRotatef(-90.0, 0, 0, 1); glRotatef(90.0, 1, 0, 0); glRotatef(it->zrot, 0, 0, 1); + if (it->break_ticks) + { + glRotatef(it->spin_rate * (ticks - it->break_ticks), + it->spin_axis[0], + it->spin_axis[1], + it->spin_axis[2]); + } m_logobox.draw(); glPopMatrix(); } @@ -83,7 +126,7 @@ void Tunnel::addRing(double offset) offset, zrot, trot, - {0, 0, 1} + 0 }; m_logos.push_back(lbs); } diff --git a/modes/Tunnel.h b/modes/Tunnel.h index 28f2092..8f5a585 100644 --- a/modes/Tunnel.h +++ b/modes/Tunnel.h @@ -20,10 +20,15 @@ class Tunnel : public Mode double offset; float zrot; float trot; + uint64_t break_ticks; float spin_axis[3]; + float break_axis[3]; + float spin_rate; } LBStruct; protected: void addRing(double offset); + void getRandomBreakAxis(float (*axis)[3]); + float getRandomBreakSpinSpeed(); LogoBox m_logobox; uint64_t m_last_ticks; uint64_t m_start_ticks; From fb5e36b8c4e468af51e58397135de491599d307d Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 12 Oct 2011 13:46:50 -0400 Subject: [PATCH 8/9] remove all logos on configure() --- modes/Tunnel.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/modes/Tunnel.cc b/modes/Tunnel.cc index 15ad96b..90da50f 100644 --- a/modes/Tunnel.cc +++ b/modes/Tunnel.cc @@ -146,6 +146,7 @@ bool Tunnel::configure (GnomeScreensaver & gs) glViewport(0, 0, gs.getWidth(), gs.getHeight()); + m_logos.clear(); for (int i = 0; i <= N_INITIAL_LAYERS; i++) { addRing((i - N_INITIAL_LAYERS) * RING_LAYER_DIST); From 56efb5b7131f6a49bfc9295de268e6a212d8018d Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 12 Oct 2011 13:47:10 -0400 Subject: [PATCH 9/9] add BREAK_RATE to fix fast fly-off --- modes/Tunnel.cc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/modes/Tunnel.cc b/modes/Tunnel.cc index 90da50f..638a852 100644 --- a/modes/Tunnel.cc +++ b/modes/Tunnel.cc @@ -19,7 +19,8 @@ using namespace std; #define RING_LAYER_DIST 10 #define XLATE_RATE 0.02 #define REVOLUTION_TIME 15000 -#define DESTROY_DIST 250 +#define DESTROY_DIST 200 +#define BREAK_RATE 0.03 Tunnel::Tunnel() { @@ -34,10 +35,10 @@ Tunnel::~Tunnel() void Tunnel::getRandomBreakAxis(float (*axis)[3]) { double alpha = rand() / (double)RAND_MAX * 2.0 * M_PI; - double beta = rand() / (double)RAND_MAX * (M_PI / 4.0); + double beta = rand() / (double)RAND_MAX * M_PI_2; (*axis)[0] = cos(alpha) * sin(beta); (*axis)[2] = sin(alpha) * sin(beta); - (*axis)[1] = cos(beta); + (*axis)[1] = 0.5 + cos(beta); } float Tunnel::getRandomBreakSpinSpeed() @@ -89,9 +90,9 @@ bool Tunnel::expose (GnomeScreensaver & gs) if (it->break_ticks) { int break_ticks = ticks - it->break_ticks; - glTranslatef(break_ticks * it->break_axis[0], - break_ticks * it->break_axis[1], - break_ticks * it->break_axis[2]); + glTranslatef(BREAK_RATE * break_ticks * it->break_axis[0], + BREAK_RATE * break_ticks * it->break_axis[1], + BREAK_RATE * break_ticks * it->break_axis[2]); } glTranslatef(0, diff_offset, 0); glRotatef(it->trot, 0, 1, 0);