]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/opengl/cube/cube.cpp
implement wxTreeCtrl::GetFocusedItem() for wxMSW too (see #10859)
[wxWidgets.git] / samples / opengl / cube / cube.cpp
index ac4ea822404d374727ad34aa3b88e7741c853a6f..74cd1bf7ebf194a3877541138eaa2ad75130fc01 100644 (file)
@@ -118,40 +118,6 @@ static wxImage DrawDice(int size, unsigned num)
 // implementation
 // ============================================================================
 
-// ----------------------------------------------------------------------------
-// MyApp: the application object
-// ----------------------------------------------------------------------------
-
-IMPLEMENT_APP(MyApp)
-
-bool MyApp::OnInit()
-{
-    if ( !wxApp::OnInit() )
-        return false;
-
-    // Create the main window
-    new MyFrame();
-
-    return true;
-}
-
-int MyApp::OnExit()
-{
-    delete m_glContext;
-
-    return wxApp::OnExit();
-}
-
-TestGLContext& MyApp::GetContext(wxGLCanvas *canvas)
-{
-    if ( !m_glContext )
-        m_glContext = new TestGLContext(canvas);
-    else
-        m_glContext->SetCurrent(*canvas);
-
-    return *m_glContext;
-}
-
 // ----------------------------------------------------------------------------
 // TestGLContext
 // ----------------------------------------------------------------------------
@@ -167,7 +133,7 @@ TestGLContext::TestGLContext(wxGLCanvas *canvas)
     glEnable(GL_LIGHT0);
     glEnable(GL_TEXTURE_2D);
 
-    // add slightly more light, the default lightning is rather dark
+    // add slightly more light, the default lighting is rather dark
     GLfloat ambient[] = { 0.5, 0.5, 0.5, 0.5 };
     glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
 
@@ -272,19 +238,61 @@ void TestGLContext::DrawRotatedCube(float xangle, float yangle)
     CheckGLError();
 }
 
+
+// ----------------------------------------------------------------------------
+// MyApp: the application object
+// ----------------------------------------------------------------------------
+
+IMPLEMENT_APP(MyApp)
+
+bool MyApp::OnInit()
+{
+    if ( !wxApp::OnInit() )
+        return false;
+
+    new MyFrame();
+
+    return true;
+}
+
+int MyApp::OnExit()
+{
+    delete m_glContext;
+
+    return wxApp::OnExit();
+}
+
+TestGLContext& MyApp::GetContext(wxGLCanvas *canvas)
+{
+    if ( !m_glContext )
+    {
+        // Create the OpenGL context for the first window which needs it:
+        // subsequently created windows will all share the same context.
+        m_glContext = new TestGLContext(canvas);
+    }
+
+    m_glContext->SetCurrent(*canvas);
+
+    return *m_glContext;
+}
+
 // ----------------------------------------------------------------------------
 // TestGLCanvas
 // ----------------------------------------------------------------------------
 
 BEGIN_EVENT_TABLE(TestGLCanvas, wxGLCanvas)
-    EVT_SIZE(TestGLCanvas::OnSize)
     EVT_PAINT(TestGLCanvas::OnPaint)
-
     EVT_KEY_DOWN(TestGLCanvas::OnKeyDown)
 END_EVENT_TABLE()
 
 TestGLCanvas::TestGLCanvas(wxWindow *parent)
-            : wxGLCanvas(parent, wxID_ANY, NULL /* attribs */)
+    // With perspective OpenGL graphics, the wxFULL_REPAINT_ON_RESIZE style
+    // flag should always be set, because even making the canvas smaller should
+    // be followed by a paint event that updates the entire canvas with new
+    // viewport settings.
+    : wxGLCanvas(parent, wxID_ANY, NULL /* attribs */,
+                 wxDefaultPosition, wxDefaultSize,
+                 wxFULL_REPAINT_ON_RESIZE)
 {
     m_xangle =
     m_yangle = 30;
@@ -292,27 +300,22 @@ TestGLCanvas::TestGLCanvas(wxWindow *parent)
 
 void TestGLCanvas::OnPaint(wxPaintEvent& WXUNUSED(event))
 {
+    // This is required even though dc is not used otherwise.
     wxPaintDC dc(this);
 
-    wxGetApp().GetContext(this).DrawRotatedCube(m_xangle, m_yangle);
+    // Set the OpenGL viewport according to the client size of this canvas.
+    // This is done here rather than in a wxSizeEvent handler because our
+    // OpenGL rendering context (and thus viewport setting) is used with
+    // multiple canvases: If we updated the viewport in the wxSizeEvent
+    // handler, changing the size of one canvas causes a viewport setting that
+    // is wrong when next another canvas is repainted.
+    const wxSize ClientSize = GetClientSize();
 
-    SwapBuffers();
-}
+    glViewport(0, 0, ClientSize.x, ClientSize.y);
 
-void TestGLCanvas::OnSize(wxSizeEvent& event)
-{
-    // don't prevent default processing from taking place
-    event.Skip();
-
-    if ( !IsShown() )
-        return;
-
-    // set GL viewport (not called by wxGLCanvas::OnSize on all platforms...)
-    int w, h;
-    GetClientSize(&w, &h);
-
-    wxGetApp().GetContext(this);
-    glViewport(0, 0, w, h);
+    // Render the graphics and swap the buffers.
+    wxGetApp().GetContext(this).DrawRotatedCube(m_xangle, m_yangle);
+    SwapBuffers();
 }
 
 void TestGLCanvas::OnKeyDown( wxKeyEvent& event )
@@ -355,6 +358,7 @@ void TestGLCanvas::OnKeyDown( wxKeyEvent& event )
     Refresh(false);
 }
 
+
 // ----------------------------------------------------------------------------
 // MyFrame: main application window
 // ----------------------------------------------------------------------------
@@ -385,6 +389,11 @@ MyFrame::MyFrame()
 
     SetClientSize(400, 400);
     Show();
+
+    // test IsDisplaySupported() function:
+    static const int attribs[] = { WX_GL_RGBA, WX_GL_DOUBLEBUFFER, 0 };
+    wxLogStatus("Double-buffered display %s supported",
+                wxGLCanvas::IsDisplaySupported(attribs) ? "is" : "not");
 }
 
 void MyFrame::OnClose(wxCommandEvent& WXUNUSED(event))
@@ -395,6 +404,6 @@ void MyFrame::OnClose(wxCommandEvent& WXUNUSED(event))
 
 void MyFrame::OnNewWindow( wxCommandEvent& WXUNUSED(event) )
 {
-    (void) new MyFrame();
+    new MyFrame();
 }