From c2265822fec3d0fa383dc6e043cad1a12a0e8418 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Sat, 15 Aug 1998 17:48:39 +0000 Subject: [PATCH] Added isosurf wxGLCanvas sample, cured OnPaint bug (missing wxPaintDC object) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@553 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- utils/glcanvas/samples/cube/cube.cpp | 7 +- utils/glcanvas/samples/cube/cube.h | 6 +- utils/glcanvas/samples/isosurf/isosurf.cpp | 417 ++++++++++++++++++ utils/glcanvas/samples/isosurf/isosurf.dat.gz | Bin 0 -> 286 bytes utils/glcanvas/samples/isosurf/isosurf.h | 53 +++ utils/glcanvas/samples/isosurf/isosurf.rc | 3 + utils/glcanvas/samples/isosurf/makefile.nt | 66 +++ utils/glcanvas/samples/isosurf/mondrian.ico | Bin 0 -> 766 bytes 8 files changed, 546 insertions(+), 6 deletions(-) create mode 100644 utils/glcanvas/samples/isosurf/isosurf.cpp create mode 100644 utils/glcanvas/samples/isosurf/isosurf.dat.gz create mode 100644 utils/glcanvas/samples/isosurf/isosurf.h create mode 100644 utils/glcanvas/samples/isosurf/isosurf.rc create mode 100644 utils/glcanvas/samples/isosurf/makefile.nt create mode 100644 utils/glcanvas/samples/isosurf/mondrian.ico diff --git a/utils/glcanvas/samples/cube/cube.cpp b/utils/glcanvas/samples/cube/cube.cpp index 97ec64dbf5..6a756b2893 100644 --- a/utils/glcanvas/samples/cube/cube.cpp +++ b/utils/glcanvas/samples/cube/cube.cpp @@ -29,9 +29,6 @@ #include "cube.h" -// This statement initializes the whole application and calls OnInit -MyApp myApp; - IMPLEMENT_APP(MyApp) // `Main program' equivalent, creating windows and returning main app frame @@ -125,6 +122,10 @@ TestGLCanvas::~TestGLCanvas(void) void TestGLCanvas::OnPaint( wxPaintEvent& event ) { + // This is a dummy, to avoid an endless succession of paint messages. + // OnPaint handlers must always create a wxPaintDC. + wxPaintDC dc(this); + if ( !GetContext() ) return; diff --git a/utils/glcanvas/samples/cube/cube.h b/utils/glcanvas/samples/cube/cube.h index 81dc1afe7a..f3dc44ac49 100644 --- a/utils/glcanvas/samples/cube/cube.h +++ b/utils/glcanvas/samples/cube/cube.h @@ -25,14 +25,14 @@ public: // Define a new frame type class TestGLCanvas; class MyFrame: public wxFrame -{ public: +{ +public: MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size, long style = wxDEFAULT_FRAME_STYLE); void OnExit(wxCommandEvent& event); - bool OnClose(void); - +public: TestGLCanvas* m_canvas; DECLARE_EVENT_TABLE() diff --git a/utils/glcanvas/samples/isosurf/isosurf.cpp b/utils/glcanvas/samples/isosurf/isosurf.cpp new file mode 100644 index 0000000000..31b49e3b51 --- /dev/null +++ b/utils/glcanvas/samples/isosurf/isosurf.cpp @@ -0,0 +1,417 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: isosurf.cpp +// Purpose: wxGLCanvas demo program +// Author: Brian Paul (original gltk version), Wolfram Gloger +// Modified by: Julian Smart +// 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" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#include "wx/wx.h" +#endif + +#include "wx/timer.h" +#include "glcanvas.h" + +#include +#include + +#include "isosurf.h" + +// The following part is taken largely unchanged from the original C Version + +#include + +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( 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) && numvertsSetIcon(wxIcon("mondrian")); + + // Make a menubar + wxMenu *fileMenu = new wxMenu; + + 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; +#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 }; +#endif + + if(!doubleBuffer +#ifdef __X__ // JACS + || !wxGLCanvas::HaveVisual(gl_attrib) +#endif + ) + { + printf("don't have double buffer, disabling\n"); +#ifndef __WXMSW__ + 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" ); + + 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, -1, title, pos, size, style) +{ + m_canvas = NULL; +} + +// Intercept menu commands +void MyFrame::OnExit(wxCommandEvent& event) +{ + Destroy(); +} + +bool MyFrame::OnClose(void) +{ + return TRUE; +} + + +/* + * TestGLCanvas implementation + */ + +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) +{ + 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; + } +} + + +TestGLCanvas::~TestGLCanvas(void) +{ +} + +void TestGLCanvas::OnPaint( wxPaintEvent& event ) +{ + // This is a dummy, to avoid an endless succession of paint messages. + // OnPaint handlers must always create a wxPaintDC. + wxPaintDC dc(this); + + draw1(); + SwapBuffers(); +} + +void TestGLCanvas::OnSize(wxSizeEvent& event) +{ + SetCurrent(); + int width, height; + GetClientSize(& width, & height); + Reshape(width, height); +} + +void TestGLCanvas::OnChar(wxKeyEvent& event) +{ + switch(event.KeyCode()) { + case WXK_ESCAPE: + exit(0); + case WXK_LEFT: + yrot -= 15.0; + break; + case WXK_RIGHT: + yrot += 15.0; + break; + case WXK_UP: + xrot += 15.0; + break; + case WXK_DOWN: + xrot -= 15.0; + break; + case 's': case 'S': + 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; + } + + Refresh(); +} + +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(); + } + last_x = event.GetX(); + last_y = event.GetY(); + } else + dragging = 0; +} + +void TestGLCanvas::OnEraseBackground(wxEraseEvent& event) +{ + // Do nothing, to avoid flashing. +} + diff --git a/utils/glcanvas/samples/isosurf/isosurf.dat.gz b/utils/glcanvas/samples/isosurf/isosurf.dat.gz new file mode 100644 index 0000000000000000000000000000000000000000..b2b9e007d70b4c6a92d1a1dd483c7c097913a8fa GIT binary patch literal 286 zcmV+(0pb21iwFqeslzh>18H+_b9HiNE@WYJ0Mz|icJ4fmG>qQoC_Djui=DdpPwd!| z5D_HcotE@e)%o)#_j+v@6dUviO!@z%<9}c2|D`#V;~!;i+xI_y{j(*N7n(`ro-*)_gAG&S%`KR*Bn|)ui^CQ1&KfnLAuk*+c`?8mjUj{$7pLsq0z`@VH&lVie kk>Bj-W;>8&2c6r`T=(mKV*9b+<6us@<9c-bO16E$eg_+-AOHXW literal 0 HcmV?d00001 diff --git a/utils/glcanvas/samples/isosurf/isosurf.h b/utils/glcanvas/samples/isosurf/isosurf.h new file mode 100644 index 0000000000..0a747deb74 --- /dev/null +++ b/utils/glcanvas/samples/isosurf/isosurf.h @@ -0,0 +1,53 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: isosurf.h +// Purpose: wxGLCanvas demo program +// Author: Brian Paul (original gltk version), Wolfram Gloger +// Modified by: Julian Smart +// Created: 04/01/98 +// RCS-ID: $Id$ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ISOSURF_H_ +#define _WX_ISOSURF_H_ + +// Define a new application type +class MyApp: public wxApp +{ public: + bool OnInit(void); +}; + +class TestGLCanvas: public wxGLCanvas +{ + public: + TestGLCanvas(wxWindow *parent, const wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = "TestGLCanvas", + int* gl_attrib = NULL); + ~TestGLCanvas(void); + + void OnPaint(wxPaintEvent& event); + void OnSize(wxSizeEvent& event); + void OnEraseBackground(wxEraseEvent& event); + void OnChar(wxKeyEvent& event); + void OnMouseEvent(wxMouseEvent& event); + +DECLARE_EVENT_TABLE() +}; + +class MyFrame: public wxFrame +{ +public: + MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size, + long style = wxDEFAULT_FRAME_STYLE); + + void OnExit(wxCommandEvent& event); + bool OnClose(void); +public: + TestGLCanvas* m_canvas; + +DECLARE_EVENT_TABLE() +}; + +#endif + diff --git a/utils/glcanvas/samples/isosurf/isosurf.rc b/utils/glcanvas/samples/isosurf/isosurf.rc new file mode 100644 index 0000000000..7655c62a4c --- /dev/null +++ b/utils/glcanvas/samples/isosurf/isosurf.rc @@ -0,0 +1,3 @@ +mondrian ICON "mondrian.ico" +#include "wx/msw/wx.rc" + diff --git a/utils/glcanvas/samples/isosurf/makefile.nt b/utils/glcanvas/samples/isosurf/makefile.nt new file mode 100644 index 0000000000..2a1f6070b7 --- /dev/null +++ b/utils/glcanvas/samples/isosurf/makefile.nt @@ -0,0 +1,66 @@ +# +# File: makefile.nt +# Author: Julian Smart +# Created: 1997 +# Updated: +# +# "%W% %G%" +# +# Makefile : Builds isosurf example (MS VC++). +# Use FINAL=1 argument to nmake to build final version with no debugging +# info + +# Set WXDIR for your system +WXDIR = $(WXWIN) + +WXUSINGDLL=0 + +EXTRAINC=-I..\..\win +EXTRALIBS=$(WXDIR)\lib\glcanvas.lib glu.lib opengl.lib + +!include $(WXDIR)\src\ntwxwin.mak + +THISDIR = $(WXDIR)\utils\glcanvas\samples\isosurf +PROGRAM=isosurf + +OBJECTS = $(PROGRAM).obj + +$(PROGRAM): $(PROGRAM).exe + +all: wx $(PROGRAM).exe + +wx: + cd $(WXDIR)\src\msw + nmake -f makefile.nt FINAL=$(FINAL) + cd $(THISDIR) + +wxclean: + cd $(WXDIR)\src\msw + nmake -f makefile.nt clean + cd $(THISDIR) + +$(PROGRAM).exe: $(DUMMYOBJ) $(WXLIB) $(OBJECTS) $(PROGRAM).res + $(link) @<< +-out:$(PROGRAM).exe +$(LINKFLAGS) +$(DUMMYOBJ) $(OBJECTS) $(PROGRAM).res +$(LIBS) +<< + + +$(PROGRAM).obj: $(PROGRAM).$(SRCSUFF) $(PROGRAM).h $(DUMMYOBJ) + $(cc) @<< +$(CPPFLAGS2) /c /Tp $*.$(SRCSUFF) +<< + +$(PROGRAM).res : $(PROGRAM).rc $(WXDIR)\include\wx\msw\wx.rc + $(rc) -r /i$(WXDIR)\include -fo$@ $(PROGRAM).rc + + +clean: + -erase *.obj + -erase *.exe + -erase *.res + -erase *.map + -erase *.sbr + -erase *.pdb diff --git a/utils/glcanvas/samples/isosurf/mondrian.ico b/utils/glcanvas/samples/isosurf/mondrian.ico new file mode 100644 index 0000000000000000000000000000000000000000..2310c5d275a87af295d5ea8dc79ea417a5e74c53 GIT binary patch literal 766 zcmZQzU<5)11px*Sc)`TLAO@s0fLH;D9e|jTfdxnc0Z