]> git.saurik.com Git - wxWidgets.git/commitdiff
Fixes to OpenGL samples to avoid asserts/crashes.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 27 Aug 2011 12:13:13 +0000 (12:13 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 27 Aug 2011 12:13:13 +0000 (12:13 +0000)
Don't call wxGLCanvas::SetCurrent() when the window is not shown.

Closes #13424.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@68909 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

samples/opengl/cube/cube.cpp
samples/opengl/isosurf/isosurf.cpp
samples/opengl/penguin/penguin.cpp

index c4a60b515a32edfae2802131090abc6ac1ddd373..17318f6f4fe332a1c14ca21e4df3263d4cad5547 100644 (file)
@@ -323,10 +323,11 @@ 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();
 }
 
index 707b48c424ad1b0e98147bda615fcfd2875b6e78..66cc2a31c4c99a722577b7221538e77921ef1b1e 100644 (file)
@@ -136,10 +136,13 @@ MyFrame::MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos,
         g_doubleBuffer = GL_FALSE;
     }
 
+    m_canvas = new TestGLCanvas(this, wxID_ANY, gl_attrib);
+
     // Show the frame
     Show(true);
+    Raise();
 
-    m_canvas = new TestGLCanvas(this, wxID_ANY, gl_attrib);
+    m_canvas->InitGL();
 }
 
 MyFrame::~MyFrame()
@@ -177,13 +180,6 @@ TestGLCanvas::TestGLCanvas(wxWindow *parent,
 
     // 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);
-
-    InitGL();
-    InitMaterials();
-    LoadSurface("isosurf.dat.gz");
 }
 
 TestGLCanvas::~TestGLCanvas()
@@ -279,6 +275,8 @@ void TestGLCanvas::OnPaint( wxPaintEvent& WXUNUSED(event) )
 
 void TestGLCanvas::OnSize(wxSizeEvent& event)
 {
+    if ( !IsShownOnScreen() )
+        return;
     // This is normally only necessary if there is more than one wxGLCanvas
     // or more than one wxGLContext in the application.
     SetCurrent(*m_glRC);
@@ -406,6 +404,9 @@ void TestGLCanvas::InitMaterials()
 
 void TestGLCanvas::InitGL()
 {
+    // Make the new context current (activate it for use) with this canvas.
+    SetCurrent(*m_glRC);
+
     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 
     glShadeModel(GL_SMOOTH);
@@ -428,5 +429,8 @@ void TestGLCanvas::InitGL()
         glEnable( GL_VERTEX_ARRAY );
         glEnable( GL_NORMAL_ARRAY );
     }
+
+    InitMaterials();
+    LoadSurface("isosurf.dat.gz");
 }
 
index a50f6dfd4d10227e6517607f5028100a55b8825c..c0c894069e7650a9d4e02aa436c94ff50c318172 100644 (file)
@@ -153,9 +153,6 @@ TestGLCanvas::TestGLCanvas(wxWindow *parent,
     // 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
@@ -303,6 +300,9 @@ void TestGLCanvas::InitGL()
 
 void TestGLCanvas::ResetProjectionMode()
 {
+    if ( !IsShownOnScreen() )
+        return;
+
     // This is normally only necessary if there is more than one wxGLCanvas
     // or more than one wxGLContext in the application.
     SetCurrent(*m_glRC);