/* Author: Josh Holtrop * DornerWorks screensaver */ #include #include #include "LightBounce.h" #include #include using namespace std; #define SIZE 5 #define STRIDE_MULTIPLIER 1.0; #define ZOOM 12.0 LightBounceBox::LightBounceBox(LogoBox * lb, float x, float y, float z, float xr, float yr, float zr) { this->logoBox = lb; this->x = x; this->y = y; this->z = z; this->xr = xr; this->yr = yr; this->zr = zr; this->dist = 0.0; } LightBounceBox::~LightBounceBox() { delete this->logoBox; } /* construct screensaver mode and do some basic OpenGL setup */ LightBounce::LightBounce(SSMain * _SSMain) : SSMode(_SSMain) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, (double)m_SSMain->getWidth() / (double)m_SSMain->getHeight() / (double)m_SSMain->getNumMonitors(), 0.01, 1000.01); glMatrixMode(GL_MODELVIEW); LogoBox tmp; float box_stride = tmp.getWidth() * STRIDE_MULTIPLIER; float half_size = SIZE * box_stride / 2.0; float y = -half_size + box_stride / 2.0; int rot = false; for (int i = 0; i < SIZE; i++) { float x = -half_size + box_stride / 2.0; for (int j = 0; j < SIZE; j++) { // front LightBounceBox * box = new LightBounceBox( new LogoBox(), x, y, -half_size, 0, 180.0, rot ? 90.0 : 0 ); m_boxes.push_back(box); // right box = new LightBounceBox( new LogoBox(), half_size, y, x, 0, 90.0, rot ? 0 : 90.0 ); m_boxes.push_back(box); // back box = new LightBounceBox( new LogoBox(), x, y, half_size, 0, 0, rot ? 90.0 : 0 ); m_boxes.push_back(box); // left box = new LightBounceBox( new LogoBox(), -half_size, y, x, 0, 270.0, rot ? 0 : 90.0 ); m_boxes.push_back(box); // top box = new LightBounceBox( new LogoBox(), x, half_size, y, 270, 0, rot ? 0 : 90.0 ); m_boxes.push_back(box); // bottom box = new LightBounceBox( new LogoBox(), x, -half_size, y, 90, 0, rot ? 0 : 90.0 ); m_boxes.push_back(box); rot = !rot; x += box_stride; } y += box_stride; } } /* called every time this screensaver mode should redraw the screen */ void LightBounce::update() { SSMode::update(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); int numMonitors = m_SSMain->getNumMonitors(); int width = m_SSMain->getWidth(); int height = m_SSMain->getHeight(); for (int i = 0; i < numMonitors; i++) { glViewport(i*width/numMonitors, 0, width/numMonitors, height); glLoadIdentity(); gluLookAt(0, SIZE * ZOOM * 2.0 / 3.0, SIZE * ZOOM, 0, 0, 0, 0, 1, 0); glRotatef(m_elapsed/66.0f, 0, 1, 0); int sz = m_boxes.size(); for (int i = 0; i < sz; i++) { glPushMatrix(); glTranslatef(m_boxes[i]->x, m_boxes[i]->y, m_boxes[i]->z); glRotatef(m_boxes[i]->xr, 1, 0, 0); glRotatef(m_boxes[i]->yr, 0, 1, 0); glRotatef(m_boxes[i]->zr, 0, 0, 1); m_boxes[i]->logoBox->draw(); glPopMatrix(); } } SDL_GL_SwapBuffers(); }