X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b713f8919c649822292f04bb7095291585d96550..8076df5d81549d5afe7afe392e3b531964e33d47:/samples/opengl/isosurf/isosurf.cpp diff --git a/samples/opengl/isosurf/isosurf.cpp b/samples/opengl/isosurf/isosurf.cpp index 95485de92d..471942b637 100644 --- a/samples/opengl/isosurf/isosurf.cpp +++ b/samples/opengl/isosurf/isosurf.cpp @@ -2,18 +2,13 @@ // Name: isosurf.cpp // Purpose: wxGLCanvas demo program // Author: Brian Paul (original gltk version), Wolfram Gloger -// Modified by: Julian Smart +// Modified by: Julian Smart, Francesco Montorsi // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation -#pragma interface -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -32,239 +27,87 @@ #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 - -// 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 "wx/log.h" +#include "wx/cmdline.h" +#include "wx/wfstream.h" +#include "wx/zstream.h" +#include "wx/txtstrm.h" #include "isosurf.h" +#include "../../sample.xpm" -// The following part is taken largely unchanged from the original C Version - -GLboolean speed_test = GL_FALSE; -GLboolean use_vertex_arrays = GL_FALSE; - -GLboolean doubleBuffer = GL_TRUE; - -GLboolean smooth = GL_TRUE; -GLboolean lighting = GL_TRUE; - - -#define MAXVERTS 10000 - -static GLfloat verts[MAXVERTS][3]; -static GLfloat norms[MAXVERTS][3]; -static GLint numverts; - -static GLfloat xrot; -static GLfloat yrot; - - -static void read_surface( const wxChar *filename ) -{ - FILE *f = wxFopen(filename,_T("r")); - if (!f) - { - wxString msg = _T("Couldn't read "); - msg += filename; - wxMessageBox(msg); - return; - } - - numverts = 0; - while (!feof(f) && numvertsSetIcon(wxIcon(_T("mondrian"))); // Make a menubar wxMenu *fileMenu = new wxMenu; - fileMenu->Append(wxID_EXIT, _T("E&xit")); + fileMenu->Append(wxID_EXIT, wxT("E&xit")); wxMenuBar *menuBar = new wxMenuBar; - menuBar->Append(fileMenu, _T("&File")); - frame->SetMenuBar(menuBar); + menuBar->Append(fileMenu, wxT("&File")); + SetMenuBar(menuBar); + // Make a TestGLCanvas @@ -272,49 +115,31 @@ bool MyApp::OnInit() #ifdef __WXMSW__ int *gl_attrib = NULL; #else - int gl_attrib[20] = { WX_GL_RGBA, WX_GL_MIN_RED, 1, WX_GL_MIN_GREEN, 1, + 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, -# ifdef __WXMAC__ +# if defined(__WXMAC__) || defined(__WXCOCOA__) GL_NONE }; # else None }; # endif #endif - if(!doubleBuffer) + if (!g_doubleBuffer) { - printf("don't have double buffer, disabling\n"); + wxLogWarning("Disabling double buffering"); + #ifdef __WXGTK__ gl_attrib[9] = None; #endif - doubleBuffer = GL_FALSE; + g_doubleBuffer = GL_FALSE; } - frame->m_canvas = new TestGLCanvas(frame, wxID_ANY, wxDefaultPosition, - wxDefaultSize, 0, _T("TestGLCanvas"), gl_attrib ); - - // Show the frame - frame->Show(true); + // Show the frame + Show(true); - frame->m_canvas->SetCurrent(); - read_surface( _T("isosurf.dat") ); - - Init(); - - return true; -} - -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, wxID_ANY, title, pos, size, style) -{ - m_canvas = NULL; + m_canvas = new TestGLCanvas(this, wxID_ANY, gl_attrib); } MyFrame::~MyFrame() @@ -329,34 +154,89 @@ void MyFrame::OnExit( wxCommandEvent& WXUNUSED(event) ) Close(true); } -/* - * TestGLCanvas implementation - */ + +//--------------------------------------------------------------------------- +// TestGLCanvas +//--------------------------------------------------------------------------- BEGIN_EVENT_TABLE(TestGLCanvas, wxGLCanvas) EVT_SIZE(TestGLCanvas::OnSize) 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, + int* gl_attrib) + : wxGLCanvas(parent, id, gl_attrib) { - parent->Show(true); - SetCurrent(); + m_xrot = 0; + m_yrot = 0; + m_numverts = 0; + + // 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"); +} - /* Make sure server supports the vertex array extension */ - char* extensions = (char *) glGetString( GL_EXTENSIONS ); - if (!extensions || !strstr( extensions, "GL_EXT_vertex_array" )) +TestGLCanvas::~TestGLCanvas() +{ + delete m_glRC; +} + +void TestGLCanvas::LoadSurface(const wxString& filename) +{ + // FIXME + // we need to set english locale to force wxTextInputStream's calls to + // wxStrtod to use the point and not the comma as decimal separator... + // (the isosurf.dat contains points and not commas)... + wxLocale l(wxLANGUAGE_ENGLISH); + + wxZlibInputStream* stream = + new wxZlibInputStream(new wxFFileInputStream(filename)); + if (!stream || !stream->IsOk()) { - use_vertex_arrays = GL_FALSE; + wxLogError("Cannot load '%s' type of files!", filename.c_str()); + delete stream; + return; } -} + { + // we suppose to have in input a text file containing floating numbers + // space/newline-separed... first 3 numbers are the coordinates of a + // vertex and the following 3 are the relative vertex normal and so on... + + wxTextInputStream inFile(*stream); + m_numverts = 0; + + while (!stream->Eof() && m_numverts < MAXVERTS)// && m_numverts> m_verts[m_numverts][0] >> m_verts[m_numverts][1] >> m_verts[m_numverts][2]; + inFile >> m_norms[m_numverts][0] >> m_norms[m_numverts][1] >> m_norms[m_numverts][2]; + + m_numverts++; + } + + // discard last vertex; it is a zero caused by the EOF + m_numverts--; + } + + delete stream; + + wxLogMessage(wxT("Loaded %d vertices, %d triangles from '%s'"), + m_numverts, m_numverts-2, filename.c_str()); + + // NOTE: for some reason under wxGTK the following is required to avoid that + // the surface gets rendered in a small rectangle in the top-left corner of the frame + PostSizeEventToParent(); +} void TestGLCanvas::OnPaint( wxPaintEvent& WXUNUSED(event) ) { @@ -364,31 +244,50 @@ void TestGLCanvas::OnPaint( wxPaintEvent& WXUNUSED(event) ) // 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); + + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + glPushMatrix(); + glRotatef( m_yrot, 0.0f, 1.0f, 0.0f ); + glRotatef( m_xrot, 1.0f, 0.0f, 0.0f ); + + // draw the surface + if (g_use_vertex_arrays) + { + glDrawArrays( GL_TRIANGLE_STRIP, 0, m_numverts ); + } + else + { + glBegin( GL_TRIANGLE_STRIP ); + + for (int i=0;i