X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9a83f860948059b0273b5cc6d9e43fadad3ebfca..71a77e77d1738cd48d7505efda59ab8110d88766:/samples/opengl/cube/cube.cpp diff --git a/samples/opengl/cube/cube.cpp b/samples/opengl/cube/cube.cpp index 7396d9bb5e..cda5cca761 100644 --- a/samples/opengl/cube/cube.cpp +++ b/samples/opengl/cube/cube.cpp @@ -34,10 +34,20 @@ #include "cube.h" -#if !defined(__WXMSW__) && !defined(__WXPM__) +#ifndef wxHAS_IMAGES_IN_RESOURCES #include "../../sample.xpm" #endif +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// control ids +enum +{ + SpinTimer = wxID_HIGHEST + 1 +}; + // ---------------------------------------------------------------------------- // helper functions // ---------------------------------------------------------------------------- @@ -128,6 +138,7 @@ TestGLContext::TestGLContext(wxGLCanvas *canvas) SetCurrent(*canvas); // set up the parameters we want to use + glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); @@ -161,7 +172,7 @@ TestGLContext::TestGLContext(wxGLCanvas *canvas) const wxImage img(DrawDice(256, i + 1)); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.GetWidth(), img.GetHeight(), + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.GetWidth(), img.GetHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, img.GetData()); } @@ -283,6 +294,7 @@ TestGLContext& MyApp::GetContext(wxGLCanvas *canvas) BEGIN_EVENT_TABLE(TestGLCanvas, wxGLCanvas) EVT_PAINT(TestGLCanvas::OnPaint) EVT_KEY_DOWN(TestGLCanvas::OnKeyDown) + EVT_TIMER(SpinTimer, TestGLCanvas::OnSpinTimer) END_EVENT_TABLE() TestGLCanvas::TestGLCanvas(wxWindow *parent) @@ -292,10 +304,11 @@ TestGLCanvas::TestGLCanvas(wxWindow *parent) // viewport settings. : wxGLCanvas(parent, wxID_ANY, NULL /* attribs */, wxDefaultPosition, wxDefaultSize, - wxFULL_REPAINT_ON_RESIZE) + wxFULL_REPAINT_ON_RESIZE), + m_xangle(30.0), + m_yangle(30.0), + m_spinTimer(this,SpinTimer) { - m_xangle = - m_yangle = 30; } void TestGLCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) @@ -311,51 +324,60 @@ void TestGLCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) // is wrong when next another canvas is repainted. const wxSize ClientSize = GetClientSize(); + TestGLContext& canvas = wxGetApp().GetContext(this); glViewport(0, 0, ClientSize.x, ClientSize.y); // Render the graphics and swap the buffers. - wxGetApp().GetContext(this).DrawRotatedCube(m_xangle, m_yangle); + canvas.DrawRotatedCube(m_xangle, m_yangle); SwapBuffers(); } -void TestGLCanvas::OnKeyDown( wxKeyEvent& event ) +void TestGLCanvas::Spin(float xSpin, float ySpin) { - float *p = NULL; + m_xangle += xSpin; + m_yangle += ySpin; - bool inverse = false; + Refresh(false); +} + +void TestGLCanvas::OnKeyDown(wxKeyEvent& event) +{ + float angle = 5.0; switch ( event.GetKeyCode() ) { case WXK_RIGHT: - inverse = true; - // fall through + Spin( 0.0, -angle ); + break; case WXK_LEFT: - // rotate around Y axis - p = &m_yangle; + Spin( 0.0, angle ); break; case WXK_DOWN: - inverse = true; - // fall through + Spin( -angle, 0.0 ); + break; case WXK_UP: - // rotate around X axis - p = &m_xangle; + Spin( angle, 0.0 ); + break; + + case WXK_SPACE: + if ( m_spinTimer.IsRunning() ) + m_spinTimer.Stop(); + else + m_spinTimer.Start( 25 ); break; default: event.Skip(); return; } +} - float angle = 5; - if ( inverse ) - angle = -angle; - - *p += angle; - - Refresh(false); +void TestGLCanvas::OnSpinTimer(wxTimerEvent& WXUNUSED(event)) +{ + Spin(0.0, 4.0); }