X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5fa399c9e241e99132733b09673cbcb76c9f77e1..30738aae14dfbce0c492d8696c861947228028c2:/samples/opengl/isosurf/isosurf.cpp diff --git a/samples/opengl/isosurf/isosurf.cpp b/samples/opengl/isosurf/isosurf.cpp index 3a5cc72b01..f89ba3f71f 100644 --- a/samples/opengl/isosurf/isosurf.cpp +++ b/samples/opengl/isosurf/isosurf.cpp @@ -6,14 +6,9 @@ // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// 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,21 +21,39 @@ #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 "wx/timer.h" #include "wx/glcanvas.h" +#include "wx/math.h" + +#if defined(__WXMAC__) || defined(__WXCOCOA__) +# ifdef __DARWIN__ +# include +# include +# else +# include +# include +# endif +#else +# include +# include +#endif -#include -#include +// disabled because this has apparently changed in OpenGL 1.2, so doesn't link +// correctly if this is on... +#ifdef GL_EXT_vertex_array +#undef GL_EXT_vertex_array +#endif + +#include #include "isosurf.h" +#include "../../sample.xpm" // The following part is taken largely unchanged from the original C Version -#include - GLboolean speed_test = GL_FALSE; GLboolean use_vertex_arrays = GL_FALSE; @@ -60,96 +73,92 @@ static GLfloat xrot; static GLfloat yrot; -static void read_surface( char *filename ) +static void read_surface(const char *filename) { - FILE *f; - - f = fopen(filename,"r"); - if (!f) { - wxString msg("Couldn't read "); - msg += filename; - wxMessageBox(msg); - return; - } - - numverts = 0; - while (!feof(f) && numverts> verts[numverts][0] >> verts[numverts][1] >> verts[numverts][2] + >> norms[numverts][0] >> norms[numverts][1] >> norms[numverts][2]) && numvertsSetIcon(wxIcon("mondrian")); + // Make a menubar + wxMenu *fileMenu = new wxMenu; - // Make a menubar - wxMenu *fileMenu = new wxMenu; + fileMenu->Append(wxID_EXIT, _T("E&xit")); + wxMenuBar *menuBar = new wxMenuBar; + menuBar->Append(fileMenu, _T("&File")); + SetMenuBar(menuBar); - fileMenu->Append(wxID_EXIT, "E&xit"); - wxMenuBar *menuBar = new wxMenuBar; - menuBar->Append(fileMenu, "&File"); - frame->SetMenuBar(menuBar); // Make a TestGLCanvas // JACS #ifdef __WXMSW__ - int *gl_attrib = NULL; + int *gl_attrib = NULL; #else - int gl_attrib[20] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, GLX_DEPTH_SIZE, 1, - GLX_DOUBLEBUFFER, None }; + int gl_attrib[20] = { WX_GL_RGBA, WX_GL_MIN_RED, 1, WX_GL_MIN_GREEN, 1, + WX_GL_MIN_BLUE, 1, WX_GL_DEPTH_SIZE, 1, + WX_GL_DOUBLEBUFFER, +# if defined(__WXMAC__) || defined(__WXCOCOA__) + GL_NONE }; +# else + None }; +# endif #endif - if(!doubleBuffer) - { - printf("don't have double buffer, disabling\n"); + if(!doubleBuffer) + { + printf("don't have double buffer, disabling\n"); #ifdef __WXGTK__ - gl_attrib[9] = None; + gl_attrib[9] = None; #endif - doubleBuffer = GL_FALSE; - } - frame->m_canvas = new TestGLCanvas(frame, -1, wxPoint(0, 0), wxSize(200, 200), 0, "TestGLCanvas", - gl_attrib); - - // Show the frame - frame->Show(TRUE); - - frame->m_canvas->SetCurrent(); - read_surface( "isosurf.dat" ); + doubleBuffer = GL_FALSE; + } - Init(); + // Show the frame + Show(true); - return TRUE; + m_canvas = new TestGLCanvas(this, wxID_ANY, wxDefaultPosition, + GetClientSize(), 0, _T("TestGLCanvas"), gl_attrib ); } -BEGIN_EVENT_TABLE(MyFrame, wxFrame) - EVT_MENU(wxID_EXIT, MyFrame::OnExit) -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) +MyFrame::~MyFrame() { - m_canvas = NULL; + delete m_canvas; } // 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); } /* @@ -307,36 +329,46 @@ BEGIN_EVENT_TABLE(TestGLCanvas, wxGLCanvas) EVT_PAINT(TestGLCanvas::OnPaint) EVT_CHAR(TestGLCanvas::OnChar) EVT_MOUSE_EVENTS(TestGLCanvas::OnMouseEvent) - EVT_ERASE_BACKGROUND(TestGLCanvas::OnEraseBackground) END_EVENT_TABLE() -TestGLCanvas::TestGLCanvas(wxWindow *parent, wxWindowID id, - const wxPoint& pos, const wxSize& size, long style, const wxString& name, int* gl_attrib): - wxGLCanvas(parent, id, pos, size, style, name, gl_attrib) +TestGLCanvas::TestGLCanvas(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name, + int* gl_attrib) + : wxGLCanvas(parent, id, gl_attrib, pos, size, + style | wxFULL_REPAINT_ON_RESIZE, name) { - parent->Show(TRUE); - SetCurrent(); - /* Make sure server supports the vertex array extension */ - char* extensions = (char *) glGetString( GL_EXTENSIONS ); - if (!extensions || !strstr( extensions, "GL_EXT_vertex_array" )) { - use_vertex_arrays = GL_FALSE; - } -} + // 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); -TestGLCanvas::~TestGLCanvas(void) + /* Make sure server supports the vertex array extension */ + char* extensions = (char *) glGetString( GL_EXTENSIONS ); + if (!extensions || !strstr( extensions, "GL_EXT_vertex_array" )) + { + use_vertex_arrays = GL_FALSE; + } +} + +TestGLCanvas::~TestGLCanvas() { + delete m_glRC; } -void TestGLCanvas::OnPaint( wxPaintEvent& event ) +void TestGLCanvas::OnPaint( wxPaintEvent& WXUNUSED(event) ) { // This is a dummy, to avoid an endless succession of paint messages. // OnPaint handlers must always create a wxPaintDC. wxPaintDC dc(this); -#ifndef __WXMOTIF__ - if (!GetContext()) return; -#endif + // This is normally only necessary if there is more than one wxGLCanvas + // or more than one wxGLContext in the application. + SetCurrent(*m_glRC); draw1(); SwapBuffers(); @@ -344,57 +376,71 @@ void TestGLCanvas::OnPaint( wxPaintEvent& event ) void TestGLCanvas::OnSize(wxSizeEvent& event) { -#ifndef __WXMOTIF__ - if (!GetContext()) return; -#endif - - SetCurrent(); - int width, height; - GetClientSize(& width, & height); - Reshape(width, height); + // This is normally only necessary if there is more than one wxGLCanvas + // or more than one wxGLContext in the application. + SetCurrent(*m_glRC); + + // It's up to the application code to update the OpenGL viewport settings. + // This is OK here 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. + glViewport(0, 0, event.GetSize().x, event.GetSize().y); } void TestGLCanvas::OnChar(wxKeyEvent& event) { - switch(event.KeyCode()) { + switch( event.GetKeyCode() ) + { case WXK_ESCAPE: - exit(0); + wxTheApp->ExitMainLoop(); + return; + case WXK_LEFT: - yrot -= 15.0; - break; + yrot -= 15.0; + break; + case WXK_RIGHT: - yrot += 15.0; - break; + yrot += 15.0; + break; + case WXK_UP: - xrot += 15.0; - break; + xrot += 15.0; + break; + case WXK_DOWN: - xrot -= 15.0; - break; + xrot -= 15.0; + break; + case 's': case 'S': - smooth = !smooth; - if (smooth) { - glShadeModel(GL_SMOOTH); - } else { - glShadeModel(GL_FLAT); - } - break; + smooth = !smooth; + if (smooth) + { + glShadeModel(GL_SMOOTH); + } + else + { + glShadeModel(GL_FLAT); + } + break; + case 'l': case 'L': - lighting = !lighting; - if (lighting) { - glEnable(GL_LIGHTING); - } else { - glDisable(GL_LIGHTING); - } - break; - default: - { + lighting = !lighting; + if (lighting) + { + glEnable(GL_LIGHTING); + } + else + { + glDisable(GL_LIGHTING); + } + break; + + default: event.Skip(); - return; - } + return; } - Refresh(FALSE); + Refresh(false); } void TestGLCanvas::OnMouseEvent(wxMouseEvent& event) @@ -402,23 +448,28 @@ void TestGLCanvas::OnMouseEvent(wxMouseEvent& event) static int dragging = 0; static float last_x, last_y; - //printf("%f %f %d\n", event.GetX(), event.GetY(), (int)event.LeftIsDown()); - if(event.LeftIsDown()) { - if(!dragging) { - dragging = 1; - } else { - yrot += (event.GetX() - last_x)*1.0; - xrot += (event.GetY() - last_y)*1.0; - Refresh(FALSE); - } - last_x = event.GetX(); - last_y = event.GetY(); - } else - dragging = 0; -} - -void TestGLCanvas::OnEraseBackground(wxEraseEvent& event) -{ - // Do nothing, to avoid flashing. + // Allow default processing to happen, or else the canvas cannot gain focus + // (for key events). + event.Skip(); + + if(event.LeftIsDown()) + { + if(!dragging) + { + dragging = 1; + } + else + { + yrot += (event.GetX() - last_x)*1.0; + xrot += (event.GetY() - last_y)*1.0; + Refresh(false); + } + last_x = event.GetX(); + last_y = event.GetY(); + } + else + { + dragging = 0; + } }