Allow to use space to toggle spinning of the cube in OpenGL sample.

Small enhancement to the cube OpenGL sample.

Closes #11545.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65904 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2010-10-24 22:40:58 +00:00
parent 22993989b4
commit e4545e0183
3 changed files with 49 additions and 24 deletions

View File

@ -682,9 +682,10 @@ commands through menu.
@sampleabout{wxGLCanvas}
@li @b cube Draws only a cube to demonstrate how to write a basic wxWidgets OpenGL program.
@li @b isosurf Draws a surface by reading coordinates from a dat file.
@li @b penguin Draws a rotatable penguin by reading data from a dxf file.
@li @b cube Draws a cube to demonstrate how to write a basic wxWidgets OpenGL program.
Arrow keys rotate the cube. Space bar toggles spinning.
@li @b isosurf Draws a surface by reading coordinates from a DAT file.
@li @b penguin Draws a rotatable penguin by reading data from a DXF file.
@sampledir{opengl}

View File

@ -38,6 +38,16 @@
#include "../../sample.xpm"
#endif
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
// control ids
enum
{
SpinTimer = wxID_HIGHEST + 1
};
// ----------------------------------------------------------------------------
// helper functions
// ----------------------------------------------------------------------------
@ -283,6 +293,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 +303,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))
@ -318,44 +330,52 @@ void TestGLCanvas::OnPaint(wxPaintEvent& WXUNUSED(event))
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);
}

View File

@ -67,12 +67,16 @@ public:
private:
void OnPaint(wxPaintEvent& event);
void Spin(float xSpin, float ySpin);
void OnKeyDown(wxKeyEvent& event);
void OnSpinTimer(wxTimerEvent& WXUNUSED(event));
// angles of rotation around x- and y- axis
float m_xangle,
m_yangle;
wxTimer m_spinTimer;
DECLARE_EVENT_TABLE()
};