update the samples to use new (non-deprecated) wxGLCanvas API; added more comments; some cleanup (modified patch 1882679)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51630 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -94,8 +94,10 @@ MyFrame::MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos,
|
||||
menuBar->Append(helpMenu, wxT("&Help"));
|
||||
SetMenuBar(menuBar);
|
||||
|
||||
Show(true);
|
||||
|
||||
m_canvas = new TestGLCanvas(this, wxID_ANY, wxDefaultPosition,
|
||||
wxSize(300, 300), wxSUNKEN_BORDER);
|
||||
GetClientSize(), wxSUNKEN_BORDER);
|
||||
}
|
||||
|
||||
// File|Open... command
|
||||
@@ -139,10 +141,21 @@ BEGIN_EVENT_TABLE(TestGLCanvas, wxGLCanvas)
|
||||
EVT_MOUSE_EVENTS(TestGLCanvas::OnMouse)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
TestGLCanvas::TestGLCanvas(wxWindow *parent, wxWindowID id,
|
||||
const wxPoint& pos, const wxSize& size, long style, const wxString& name)
|
||||
: wxGLCanvas(parent, id, pos, size, style|wxFULL_REPAINT_ON_RESIZE, name)
|
||||
TestGLCanvas::TestGLCanvas(wxWindow *parent,
|
||||
wxWindowID id,
|
||||
const wxPoint& pos,
|
||||
const wxSize& size,
|
||||
long style,
|
||||
const wxString& name)
|
||||
: wxGLCanvas(parent, id, NULL, pos, size,
|
||||
style | wxFULL_REPAINT_ON_RESIZE, name)
|
||||
{
|
||||
// Explicitly create a new rendering context instance for this canvas.
|
||||
m_glRC = new wxGLContext(this);
|
||||
|
||||
// Make the new context current (activate it for use) with this canvas.
|
||||
SetCurrent(*m_glRC);
|
||||
|
||||
m_gldata.initialized = false;
|
||||
|
||||
// initialize view matrix
|
||||
@@ -154,6 +167,7 @@ TestGLCanvas::TestGLCanvas(wxWindow *parent, wxWindowID id,
|
||||
|
||||
TestGLCanvas::~TestGLCanvas()
|
||||
{
|
||||
delete m_glRC;
|
||||
}
|
||||
|
||||
void TestGLCanvas::OnPaint( wxPaintEvent& WXUNUSED(event) )
|
||||
@@ -161,11 +175,7 @@ void TestGLCanvas::OnPaint( wxPaintEvent& WXUNUSED(event) )
|
||||
// must always be here
|
||||
wxPaintDC dc(this);
|
||||
|
||||
#ifndef __WXMOTIF__
|
||||
if (!GetContext()) return;
|
||||
#endif
|
||||
|
||||
SetCurrent();
|
||||
SetCurrent(*m_glRC);
|
||||
|
||||
// Initialize OpenGL
|
||||
if (!m_gldata.initialized)
|
||||
@@ -195,11 +205,11 @@ void TestGLCanvas::OnPaint( wxPaintEvent& WXUNUSED(event) )
|
||||
SwapBuffers();
|
||||
}
|
||||
|
||||
void TestGLCanvas::OnSize(wxSizeEvent& event)
|
||||
void TestGLCanvas::OnSize(wxSizeEvent& WXUNUSED(event))
|
||||
{
|
||||
// this is also necessary to update the context on some platforms
|
||||
wxGLCanvas::OnSize(event);
|
||||
// Reset the OpenGL view aspect
|
||||
// Reset the OpenGL view aspect.
|
||||
// This is OK only because there is only one canvas that uses the context.
|
||||
// See the cube sample for that case that multiple canvases are made current with one context.
|
||||
ResetProjectionMode();
|
||||
}
|
||||
|
||||
@@ -293,18 +303,21 @@ void TestGLCanvas::InitGL()
|
||||
|
||||
void TestGLCanvas::ResetProjectionMode()
|
||||
{
|
||||
// This is normally only necessary if there is more than one wxGLCanvas
|
||||
// or more than one wxGLContext in the application.
|
||||
SetCurrent(*m_glRC);
|
||||
|
||||
int w, h;
|
||||
GetClientSize(&w, &h);
|
||||
#ifndef __WXMOTIF__
|
||||
if ( GetContext() )
|
||||
#endif
|
||||
{
|
||||
SetCurrent();
|
||||
glViewport(0, 0, (GLint) w, (GLint) h);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
gluPerspective(45.0f, (GLfloat)w/h, 1.0, 100.0);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
}
|
||||
|
||||
// It's up to the application code to update the OpenGL viewport settings.
|
||||
// In order to avoid extensive context switching, consider doing this in
|
||||
// OnPaint() rather than here, though.
|
||||
glViewport(0, 0, (GLint) w, (GLint) h);
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
gluPerspective(45.0f, (GLfloat)w/h, 1.0, 100.0);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
}
|
||||
|
Reference in New Issue
Block a user