]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/opengl/penguin/penguin.cpp
offset version by 1 to avoid having compatibility_version of 0.0.0 under Darwin:...
[wxWidgets.git] / samples / opengl / penguin / penguin.cpp
index b3b59e7313b8932237422375baba3e43be2f21ed..93634a40600fc63c9595d17ba7dc2370ade3a32d 100644 (file)
@@ -6,14 +6,9 @@
 // Created:     04/01/98
 // RCS-ID:      $Id$
 // Copyright:   (c) Robert Roebling
 // Created:     04/01/98
 // RCS-ID:      $Id$
 // Copyright:   (c) Robert Roebling
-// Licence:    wxWindows licence
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation
-#pragma interface
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #endif
 
 #if !wxUSE_GLCANVAS
 #endif
 
 #if !wxUSE_GLCANVAS
-#error Please set wxUSE_GLCANVAS to 1 in setup.h.
+    #error "OpenGL required: set wxUSE_GLCANVAS to 1 and rebuild the library"
 #endif
 
 #include "penguin.h"
 #ifdef __WXMAC__
 #endif
 
 #include "penguin.h"
 #ifdef __WXMAC__
-#include <glu.h>
+#  ifdef __DARWIN__
+#    include <OpenGL/glu.h>
+#  else
+#    include <glu.h>
+#  endif
 #else
 #else
-#include <GL/glu.h>
+#  include <GL/glu.h>
 #endif
 
 #endif
 
+#include "../../sample.xpm"
+
 #define VIEW_ASPECT 1.3
 
 #define VIEW_ASPECT 1.3
 
-/* `Main program' equivalent, creating windows and returning main app frame */
-bool MyApp::OnInit(void)
+// `Main program' equivalent, creating windows and returning main app frame
+bool MyApp::OnInit()
 {
 {
+    // Create the main frame window
+    MyFrame *frame = new MyFrame(NULL, wxT("wxWidgets OpenGL Penguin Sample"),
+        wxDefaultPosition, wxDefaultSize);
 
 
-  /* Create the main frame window */
-  MyFrame *frame = new MyFrame(NULL, "wxWindows OpenGL Demo", wxPoint(50, 50), wxSize(400, 300));
+    /* Make a menubar */
+    wxMenu *fileMenu = new wxMenu;
 
 
-  /* Make a menubar */
-  wxMenu *fileMenu = new wxMenu;
+    fileMenu->Append(wxID_EXIT, wxT("E&xit"));
+    wxMenuBar *menuBar = new wxMenuBar;
+    menuBar->Append(fileMenu, wxT("&File"));
+    frame->SetMenuBar(menuBar);
 
 
-  fileMenu->Append(wxID_EXIT, "E&xit");
-  wxMenuBar *menuBar = new wxMenuBar;
-  menuBar->Append(fileMenu, "&File");
-  frame->SetMenuBar(menuBar);
+    frame->SetCanvas( new TestGLCanvas(frame, wxID_ANY, wxDefaultPosition,
+        wxSize(200, 200), wxSUNKEN_BORDER) );
 
 
-  frame->m_canvas = new TestGLCanvas(frame, -1, wxPoint(0, 0), wxSize(200, 200));
+    /* Load file wiht mesh data */
+    frame->GetCanvas()->LoadLWO( wxT("penguin.lwo") );
 
 
-  /* Load file wiht mesh data */
-  frame->m_canvas->LoadLWO( "penguin.lwo" );
+    /* Show the frame */
+    frame->Show(true);
 
 
-  /* Show the frame */
-  frame->Show(TRUE);
-  
-  return TRUE;
+    return true;
 }
 
 IMPLEMENT_APP(MyApp)
 }
 
 IMPLEMENT_APP(MyApp)
@@ -72,16 +74,18 @@ END_EVENT_TABLE()
 
 /* My frame constructor */
 MyFrame::MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos,
 
 /* My frame constructor */
 MyFrame::MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos,
-    const wxSize& size, long style):
-  wxFrame(frame, -1, title, pos, size, style)
+    const wxSize& size, long style)
+    : wxFrame(frame, wxID_ANY, title, pos, size, style)
 {
     m_canvas = NULL;
 {
     m_canvas = NULL;
+    SetIcon(wxIcon(sample_xpm));
 }
 
 /* Intercept menu commands */
 }
 
 /* Intercept menu commands */
-void MyFrame::OnExit(wxCommandEvent& event)
+void MyFrame::OnExit( wxCommandEvent& WXUNUSED(event) )
 {
 {
-    Destroy();
+    // true is to force the frame to close
+    Close(true);
 }
 
 BEGIN_EVENT_TABLE(TestGLCanvas, wxGLCanvas)
 }
 
 BEGIN_EVENT_TABLE(TestGLCanvas, wxGLCanvas)
@@ -92,19 +96,19 @@ BEGIN_EVENT_TABLE(TestGLCanvas, wxGLCanvas)
 END_EVENT_TABLE()
 
 TestGLCanvas::TestGLCanvas(wxWindow *parent, wxWindowID id,
 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, name)
+    const wxPoint& pos, const wxSize& size, long style, const wxString& name)
+    : wxGLCanvas(parent, id, pos, size, style|wxFULL_REPAINT_ON_RESIZE, name)
 {
 {
-   block = FALSE;
+    block = false;
 }
 
 }
 
-TestGLCanvas::~TestGLCanvas(void)
+TestGLCanvas::~TestGLCanvas()
 {
     /* destroy mesh */
     lw_object_free(info.lwobject);
 }
 
 {
     /* destroy mesh */
     lw_object_free(info.lwobject);
 }
 
-void TestGLCanvas::OnPaint( wxPaintEvent& event )
+void TestGLCanvas::OnPaint( wxPaintEvent& WXUNUSED(event) )
 {
     /* must always be here */
     wxPaintDC dc(this);
 {
     /* must always be here */
     wxPaintDC dc(this);
@@ -114,49 +118,59 @@ void TestGLCanvas::OnPaint( wxPaintEvent& event )
 #endif
 
     SetCurrent();
 #endif
 
     SetCurrent();
-    
-    /* initialize OpenGL */
-    if (info.do_init == TRUE) 
+
+    // Initialize OpenGL
+    if (info.do_init)
     {
         InitGL();
     {
         InitGL();
-        info.do_init = FALSE;
+        info.do_init = false;
     }
     }
-  
-    /* view */
+
+    // View
     glMatrixMode( GL_PROJECTION );
     glLoadIdentity();
     glMatrixMode( GL_PROJECTION );
     glLoadIdentity();
-    gluPerspective( info.zoom, VIEW_ASPECT, 1, 100 );
+    gluPerspective( info.zoom, VIEW_ASPECT, 1.0, 100.0 );
     glMatrixMode( GL_MODELVIEW );
 
     glMatrixMode( GL_MODELVIEW );
 
-    /* clear */
-    glClearColor( .3, .4, .6, 1 );
+    // Clear
+    glClearColor( 0.3f, 0.4f, 0.6f, 1.0f );
     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 
     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 
-    /* transformations */
+    // Transformations
     GLfloat m[4][4];
     glLoadIdentity();
     GLfloat m[4][4];
     glLoadIdentity();
-    glTranslatef( 0, 0, -30 );
+    glTranslatef( 0.0f, 0.0f, -30.0f );
     build_rotmatrix( m,info.quat );
     glMultMatrixf( &m[0][0] );
 
     build_rotmatrix( m,info.quat );
     glMultMatrixf( &m[0][0] );
 
-    /* draw object */
+    // Draw object
     lw_object_show( info.lwobject );
     lw_object_show( info.lwobject );
-    
-    /* flush */
+
+    // Flush
     glFlush();
 
     glFlush();
 
-    /* swap */
+    // Swap
     SwapBuffers();
 }
 
 void TestGLCanvas::OnSize(wxSizeEvent& event)
 {
     SwapBuffers();
 }
 
 void TestGLCanvas::OnSize(wxSizeEvent& event)
 {
-    // the viewport must be initialized this way, not glViewport
     // this is also necessary to update the context on some platforms
     wxGLCanvas::OnSize(event);
     // this is also necessary to update the context on some platforms
     wxGLCanvas::OnSize(event);
+
+    // set GL viewport (not called by wxGLCanvas::OnSize on all platforms...)
+    int w, h;
+    GetClientSize(&w, &h);
+#ifndef __WXMOTIF__
+    if ( GetContext() )
+#endif
+    {
+        SetCurrent();
+        glViewport(0, 0, (GLint) w, (GLint) h);
+    }
 }
 
 }
 
-void TestGLCanvas::OnEraseBackground(wxEraseEvent& event)
+void TestGLCanvas::OnEraseBackground(wxEraseEvent& WXUNUSED(event))
 {
     /* Do nothing, to avoid flashing on MSW */
 }
 {
     /* Do nothing, to avoid flashing on MSW */
 }
@@ -164,57 +178,64 @@ void TestGLCanvas::OnEraseBackground(wxEraseEvent& event)
 void TestGLCanvas::LoadLWO(const wxString &filename)
 {
     /* test if lightwave object */
 void TestGLCanvas::LoadLWO(const wxString &filename)
 {
     /* test if lightwave object */
-    if (!lw_is_lwobject(filename)) return;
-  
+    if (!lw_is_lwobject(filename.mb_str())) return;
+
     /* read lightwave object */
     /* read lightwave object */
-    lwObject *lwobject = lw_object_read(filename);
-    
+    lwObject *lwobject = lw_object_read(filename.mb_str());
+
     /* scale */
     lw_object_scale(lwobject, 10.0 / lw_object_radius(lwobject));
     /* scale */
     lw_object_scale(lwobject, 10.0 / lw_object_radius(lwobject));
-    
+
     /* set up mesh info */
     /* set up mesh info */
-    info.do_init = TRUE;
+    info.do_init = true;
     info.lwobject = lwobject;
     info.lwobject = lwobject;
-    info.beginx = 0;
-    info.beginy = 0;
-    info.zoom   = 45;
-    trackball( info.quat, 0.0, 0.0, 0.0, 0.0 );
+    info.beginx = 0.0f;
+    info.beginy = 0.0f;
+    info.zoom   = 45.0f;
+    trackball( info.quat, 0.0f, 0.0f, 0.0f, 0.0f );
 }
 
 void TestGLCanvas::OnMouse( wxMouseEvent& event )
 {
 }
 
 void TestGLCanvas::OnMouse( wxMouseEvent& event )
 {
-    wxSize sz(GetClientSize());
-    if (event.Dragging())
+
+    if ( event.Dragging() )
     {
     {
+        wxSize sz( GetClientSize() );
+
         /* drag in progress, simulate trackball */
         float spin_quat[4];
         trackball(spin_quat,
         /* drag in progress, simulate trackball */
         float spin_quat[4];
         trackball(spin_quat,
-             (2.0*info.beginx -       sz.x) / sz.x,
-             (     sz.y - 2.0*info.beginy) / sz.y,
-             (     2.0*event.GetX() - sz.x) / sz.x,
-             (    sz.y - 2.0*event.GetY()) / sz.y);
-             
+            (2.0*info.beginx -       sz.x) / sz.x,
+            (     sz.y - 2.0*info.beginy) / sz.y,
+            (     2.0*event.GetX() - sz.x) / sz.x,
+            (    sz.y - 2.0*event.GetY()) / sz.y);
+
         add_quats( spin_quat, info.quat, info.quat );
         add_quats( spin_quat, info.quat, info.quat );
-       
+
         /* orientation has changed, redraw mesh */
         /* orientation has changed, redraw mesh */
-       Refresh(FALSE);
+        Refresh(false);
     }
     }
-    
+
     info.beginx = event.GetX();
     info.beginy = event.GetY();
 }
 
     info.beginx = event.GetX();
     info.beginy = event.GetY();
 }
 
-void TestGLCanvas::InitGL(void)
+void TestGLCanvas::InitGL()
 {
 {
-    GLfloat light0_pos[4]   = { -50.0, 50.0, 0.0, 0.0 };
-    GLfloat light0_color[4] = { .6, .6, .6, 1.0 }; /* white light */
-    GLfloat light1_pos[4]   = {  50.0, 50.0, 0.0, 0.0 };
-    GLfloat light1_color[4] = { .4, .4, 1, 1.0 };  /* cold blue light */
+    static const GLfloat light0_pos[4]   = { -50.0f, 50.0f, 0.0f, 0.0f };
+
+    // white light
+    static const GLfloat light0_color[4] = { 0.6f, 0.6f, 0.6f, 1.0f };
+
+    static const GLfloat light1_pos[4]   = {  50.0f, 50.0f, 0.0f, 0.0f };
+
+    // cold blue light
+    static const GLfloat light1_color[4] = { 0.4f, 0.4f, 1.0f, 1.0f };
 
     /* remove back faces */
     glDisable(GL_CULL_FACE);
     glEnable(GL_DEPTH_TEST);
 
     /* remove back faces */
     glDisable(GL_CULL_FACE);
     glEnable(GL_DEPTH_TEST);
-  
+
     /* speedups */
     glEnable(GL_DITHER);
     glShadeModel(GL_SMOOTH);
     /* speedups */
     glEnable(GL_DITHER);
     glShadeModel(GL_SMOOTH);
@@ -223,15 +244,14 @@ void TestGLCanvas::InitGL(void)
 
     /* light */
     glLightfv(GL_LIGHT0, GL_POSITION, light0_pos);
 
     /* light */
     glLightfv(GL_LIGHT0, GL_POSITION, light0_pos);
-    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light0_color);  
+    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light0_color);
     glLightfv(GL_LIGHT1, GL_POSITION, light1_pos);
     glLightfv(GL_LIGHT1, GL_DIFFUSE,  light1_color);
     glEnable(GL_LIGHT0);
     glEnable(GL_LIGHT1);
     glEnable(GL_LIGHTING);
     glLightfv(GL_LIGHT1, GL_POSITION, light1_pos);
     glLightfv(GL_LIGHT1, GL_DIFFUSE,  light1_color);
     glEnable(GL_LIGHT0);
     glEnable(GL_LIGHT1);
     glEnable(GL_LIGHTING);
-    
-    glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
-    glEnable(GL_COLOR_MATERIAL);  
-}
 
 
+    glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
+    glEnable(GL_COLOR_MATERIAL);
+}