}
break;
case SDL_MOUSEMOTION:
+ m_last_mouse_x = evt.motion.x;
+ m_last_mouse_y = evt.motion.y;
if (m_mouse_handler)
{
m_mouse_handler(evt.motion.x, evt.motion.y,evt.motion.state, 0);
break;
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
+ m_last_mouse_x = evt.button.x;
+ m_last_mouse_y = evt.button.y;
if (m_mouse_handler)
{
m_mouse_handler(evt.button.x, evt.button.y, evt.button.state, 0);
}
break;
+ case SDL_MOUSEWHEEL:
+ if (m_mouse_handler)
+ {
+ m_mouse_handler(m_last_mouse_x, m_last_mouse_y, 0, evt.wheel.y);
+ }
+ break;
+ case SDL_KEYDOWN:
+ {
+ Debug("Key %c down", (char)evt.key.keysym.sym);
+ if (isalnum((char)evt.key.keysym.sym))
+ {
+ char filename[] = "0.bmp";
+ filename[0] = (char)evt.key.keysym.sym;
+ ScreenShot(filename);
+ }
+ }
default:
break;
}
SDL_GL_SwapWindow(m_window);
}
+void Screen::ScreenShot(const char * filename) const
+{
+ Debug("Attempting to save BMP to file %s", filename);
+
+ int w = ViewportWidth();
+ int h = ViewportHeight();
+ unsigned char * pixels = new unsigned char[w*h*4];
+ if (pixels == NULL)
+ Fatal("Failed to allocate %d x %d x 4 = %d pixel array", w, h, w*h*4);
+
+ glReadPixels(0,0,w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+
+ SDL_Surface * surf = SDL_CreateRGBSurfaceFrom(pixels, w, h, 8*4, w*4, 0,0,0,0);
+ if (surf == NULL)
+ Fatal("Failed to create SDL_Surface from pixel data - %s", SDL_GetError());
+
+ if (SDL_SaveBMP(surf, filename) != 0)
+ Fatal("SDL_SaveBMP failed - %s", SDL_GetError());
+
+ SDL_FreeSurface(surf);
+ delete [] pixels;
+ Debug("Succeeded!");
+}