X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3dec57adfdb2469b7679930092f0bd9c8569d62c..6ce8b8484654b5ab073951373c93d9bdd8221881:/samples/opengl/penguin/penguin.cpp diff --git a/samples/opengl/penguin/penguin.cpp b/samples/opengl/penguin/penguin.cpp index b3b59e7313..93634a4060 100644 --- a/samples/opengl/penguin/penguin.cpp +++ b/samples/opengl/penguin/penguin.cpp @@ -6,14 +6,9 @@ // 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" @@ -26,42 +21,49 @@ #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__ -#include +# ifdef __DARWIN__ +# include +# else +# include +# endif #else -#include +# include #endif +#include "../../sample.xpm" + #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) @@ -72,16 +74,18 @@ END_EVENT_TABLE() /* 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; + SetIcon(wxIcon(sample_xpm)); } /* 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) @@ -92,19 +96,19 @@ BEGIN_EVENT_TABLE(TestGLCanvas, wxGLCanvas) 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); } -void TestGLCanvas::OnPaint( wxPaintEvent& event ) +void TestGLCanvas::OnPaint( wxPaintEvent& WXUNUSED(event) ) { /* must always be here */ wxPaintDC dc(this); @@ -114,49 +118,59 @@ void TestGLCanvas::OnPaint( wxPaintEvent& event ) #endif SetCurrent(); - - /* initialize OpenGL */ - if (info.do_init == TRUE) + + // Initialize OpenGL + if (info.do_init) { InitGL(); - info.do_init = FALSE; + info.do_init = false; } - - /* view */ + + // View glMatrixMode( GL_PROJECTION ); glLoadIdentity(); - gluPerspective( info.zoom, VIEW_ASPECT, 1, 100 ); + gluPerspective( info.zoom, VIEW_ASPECT, 1.0, 100.0 ); 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 ); - /* transformations */ + // Transformations 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] ); - /* draw object */ + // Draw object lw_object_show( info.lwobject ); - - /* flush */ + + // Flush glFlush(); - /* swap */ + // Swap 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); + + // 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 */ } @@ -164,57 +178,64 @@ void TestGLCanvas::OnEraseBackground(wxEraseEvent& event) 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 */ - 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)); - + /* set up mesh info */ - info.do_init = TRUE; + info.do_init = true; 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 ) { - wxSize sz(GetClientSize()); - if (event.Dragging()) + + if ( event.Dragging() ) { + wxSize sz( GetClientSize() ); + /* 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 ); - + /* orientation has changed, redraw mesh */ - Refresh(FALSE); + Refresh(false); } - + 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); - + /* speedups */ glEnable(GL_DITHER); glShadeModel(GL_SMOOTH); @@ -223,15 +244,14 @@ void TestGLCanvas::InitGL(void) /* 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); - - 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); +}