X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/95bfd958bda8955ac81277c78e5627c926154f39..f18eaf2687ab42c97ccf469a2617306cadc0c6ef:/wxPython/demo/GLCanvas.py diff --git a/wxPython/demo/GLCanvas.py b/wxPython/demo/GLCanvas.py index dd5d27eaec..efffd3d9b5 100644 --- a/wxPython/demo/GLCanvas.py +++ b/wxPython/demo/GLCanvas.py @@ -1,15 +1,9 @@ -# 11/18/2003 - Jeff Grimmett (grimmtooth@softhome.net) -# -# o Updated for wx namespace -# o Note: unable to install PyOpenGL on my system as I am running Python 2.3 -# and PyOpenGL does not support anything above Python 2.2. Did what I could, -# but odds are good there are problems. -# -import wx +import wx +import sys try: - import wx.glcanvas as glcanvas + from wx import glcanvas haveGLCanvas = True except ImportError: haveGLCanvas = False @@ -17,267 +11,275 @@ except ImportError: try: # The Python OpenGL package can be found at # http://PyOpenGL.sourceforge.net/ - - import OpenGL.GL as gl - import OpenGL.GLUT as glut + from OpenGL.GL import * + from OpenGL.GLUT import * haveOpenGL = True except ImportError: haveOpenGL = False #---------------------------------------------------------------------- -if not haveGLCanvas: - def runTest(frame, nb, log): - dlg = wx.MessageDialog( - frame, 'The wx.GLCanvas has not been included with this build of wxPython!', - 'Sorry', wx.OK | wx.ICON_INFORMATION - ) - dlg.ShowModal() - dlg.Destroy() +buttonDefs = { + wx.NewId() : ('CubeCanvas', 'Cube'), + wx.NewId() : ('ConeCanvas', 'Cone'), + } + +class ButtonPanel(wx.Panel): + def __init__(self, parent, log): + wx.Panel.__init__(self, parent, -1) + self.log = log + + box = wx.BoxSizer(wx.VERTICAL) + box.Add((20, 30)) + keys = buttonDefs.keys() + keys.sort() + for k in keys: + text = buttonDefs[k][1] + btn = wx.Button(self, k, text) + box.Add(btn, 0, wx.ALIGN_CENTER|wx.ALL, 15) + self.Bind(wx.EVT_BUTTON, self.OnButton, btn) + + #** Enable this to show putting a GLCanvas on the wx.Panel + if 0: + c = CubeCanvas(self) + c.SetSize((200, 200)) + box.Add(c, 0, wx.ALIGN_CENTER|wx.ALL, 15) + + self.SetAutoLayout(True) + self.SetSizer(box) + + + def OnButton(self, evt): + if not haveGLCanvas: + dlg = wx.MessageDialog(self, + 'The GLCanvas class has not been included with this build of wxPython!', + 'Sorry', wx.OK | wx.ICON_WARNING) + dlg.ShowModal() + dlg.Destroy() + + elif not haveOpenGL: + dlg = wx.MessageDialog(self, + 'The OpenGL package was not found. You can get it at\n' + 'http://PyOpenGL.sourceforge.net/', + 'Sorry', wx.OK | wx.ICON_WARNING) + dlg.ShowModal() + dlg.Destroy() + + else: + canvasClassName = buttonDefs[evt.GetId()][0] + canvasClass = eval(canvasClassName) + frame = wx.Frame(None, -1, canvasClassName, size=(400,400)) + canvas = canvasClass(frame) + frame.Show(True) -elif not haveOpenGL: - def runTest(frame, nb, log): - dlg = wx.MessageDialog( - frame, 'The OpenGL package was not found. You can get it at\n' - 'http://PyOpenGL.sourceforge.net/', 'Sorry', wx.OK | wx.ICON_INFORMATION - ) - dlg.ShowModal() - dlg.Destroy() +class MyCanvasBase(glcanvas.GLCanvas): + def __init__(self, parent): + glcanvas.GLCanvas.__init__(self, parent, -1) + self.init = False + # initial mouse position + self.lastx = self.x = 30 + self.lasty = self.y = 30 + self.size = None + self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) + self.Bind(wx.EVT_SIZE, self.OnSize) + self.Bind(wx.EVT_PAINT, self.OnPaint) + self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown) + self.Bind(wx.EVT_LEFT_UP, self.OnMouseUp) + self.Bind(wx.EVT_MOTION, self.OnMouseMotion) -else: - buttonDefs = { - wx.NewId() : ('CubeCanvas', 'Cube'), - wx.NewId() : ('ConeCanvas', 'Cone'), - } + def OnEraseBackground(self, event): + pass # Do nothing, to avoid flashing on MSW. - class ButtonPanel(wx.Panel): - def __init__(self, parent, log): - wx.Panel.__init__(self, parent, -1) - self.log = log - box = wx.BoxSizer(wx.VERTICAL) - box.Add((20, 30)) - keys = buttonDefs.keys() - keys.sort() + def OnSize(self, event): + size = self.size = self.GetClientSize() + if self.GetContext(): + self.SetCurrent() + glViewport(0, 0, size.width, size.height) + event.Skip() - for k in keys: - text = buttonDefs[k][1] - btn = wx.Button(self, k, text) - box.Add(btn, 0, wx.ALIGN_CENTER|wx.ALL, 15) - self.Bind(wx.EVT_BUTTON, self.OnButton, id=k) - #** Enable this to show putting a wx.GLCanvas on the wxPanel - if 0: - c = CubeCanvas(self) - c.SetSize((200, 200)) - box.Add(c, 0, wx.ALIGN_CENTER|wx.ALL, 15) + def OnPaint(self, event): + dc = wx.PaintDC(self) + self.SetCurrent() + if not self.init: + self.InitGL() + self.init = True + self.OnDraw() + - self.SetAutoLayout(True) - self.SetSizer(box) + def OnMouseDown(self, evt): + self.CaptureMouse() + self.x, self.y = self.lastx, self.lasty = evt.GetPosition() - def OnButton(self, evt): - canvasClassName = buttonDefs[evt.GetId()][0] - canvasClass = eval(canvasClassName) - frame = wx.Frame(None, -1, canvasClassName, size=(400,400)) - canvas = canvasClass(frame) - frame.Show(True) + def OnMouseUp(self, evt): + self.ReleaseMouse() + def OnMouseMotion(self, evt): + if evt.Dragging() and evt.LeftIsDown(): + self.lastx, self.lasty = self.x, self.y + self.x, self.y = evt.GetPosition() + self.Refresh(False) + + + + +class CubeCanvas(MyCanvasBase): + def InitGL(self): + # set viewing projection + glMatrixMode(GL_PROJECTION) + glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0) + + # position viewer + glMatrixMode(GL_MODELVIEW) + glTranslatef(0.0, 0.0, -2.0) + + # position object + glRotatef(self.y, 1.0, 0.0, 0.0) + glRotatef(self.x, 0.0, 1.0, 0.0) + + glEnable(GL_DEPTH_TEST) + glEnable(GL_LIGHTING) + glEnable(GL_LIGHT0) + + + def OnDraw(self): + # clear color and depth buffers + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) + + # draw six faces of a cube + glBegin(GL_QUADS) + glNormal3f( 0.0, 0.0, 1.0) + glVertex3f( 0.5, 0.5, 0.5) + glVertex3f(-0.5, 0.5, 0.5) + glVertex3f(-0.5,-0.5, 0.5) + glVertex3f( 0.5,-0.5, 0.5) + + glNormal3f( 0.0, 0.0,-1.0) + glVertex3f(-0.5,-0.5,-0.5) + glVertex3f(-0.5, 0.5,-0.5) + glVertex3f( 0.5, 0.5,-0.5) + glVertex3f( 0.5,-0.5,-0.5) + + glNormal3f( 0.0, 1.0, 0.0) + glVertex3f( 0.5, 0.5, 0.5) + glVertex3f( 0.5, 0.5,-0.5) + glVertex3f(-0.5, 0.5,-0.5) + glVertex3f(-0.5, 0.5, 0.5) + + glNormal3f( 0.0,-1.0, 0.0) + glVertex3f(-0.5,-0.5,-0.5) + glVertex3f( 0.5,-0.5,-0.5) + glVertex3f( 0.5,-0.5, 0.5) + glVertex3f(-0.5,-0.5, 0.5) + + glNormal3f( 1.0, 0.0, 0.0) + glVertex3f( 0.5, 0.5, 0.5) + glVertex3f( 0.5,-0.5, 0.5) + glVertex3f( 0.5,-0.5,-0.5) + glVertex3f( 0.5, 0.5,-0.5) + + glNormal3f(-1.0, 0.0, 0.0) + glVertex3f(-0.5,-0.5,-0.5) + glVertex3f(-0.5,-0.5, 0.5) + glVertex3f(-0.5, 0.5, 0.5) + glVertex3f(-0.5, 0.5,-0.5) + glEnd() + + if self.size is None: + self.size = self.GetClientSize() + w, h = self.size + w = max(w, 1.0) + h = max(h, 1.0) + xScale = 180.0 / w + yScale = 180.0 / h + glRotatef((self.y - self.lasty) * yScale, 1.0, 0.0, 0.0); + glRotatef((self.x - self.lastx) * xScale, 0.0, 1.0, 0.0); + + self.SwapBuffers() + + + + + +class ConeCanvas(MyCanvasBase): + def InitGL( self ): + glMatrixMode(GL_PROJECTION) + # camera frustrum setup + glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0) + glMaterial(GL_FRONT, GL_AMBIENT, [0.2, 0.2, 0.2, 1.0]) + glMaterial(GL_FRONT, GL_DIFFUSE, [0.8, 0.8, 0.8, 1.0]) + glMaterial(GL_FRONT, GL_SPECULAR, [1.0, 0.0, 1.0, 1.0]) + glMaterial(GL_FRONT, GL_SHININESS, 50.0) + glLight(GL_LIGHT0, GL_AMBIENT, [0.0, 1.0, 0.0, 1.0]) + glLight(GL_LIGHT0, GL_DIFFUSE, [1.0, 1.0, 1.0, 1.0]) + glLight(GL_LIGHT0, GL_SPECULAR, [1.0, 1.0, 1.0, 1.0]) + glLight(GL_LIGHT0, GL_POSITION, [1.0, 1.0, 1.0, 0.0]) + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, [0.2, 0.2, 0.2, 1.0]) + glEnable(GL_LIGHTING) + glEnable(GL_LIGHT0) + glDepthFunc(GL_LESS) + glEnable(GL_DEPTH_TEST) + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) + # position viewer + glMatrixMode(GL_MODELVIEW) + # position viewer + glTranslatef(0.0, 0.0, -2.0); + # + glutInit(sys.argv) + + + def OnDraw(self): + # clear color and depth buffers + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) + # use a fresh transformation matrix + glPushMatrix() + # position object + #glTranslate(0.0, 0.0, -2.0) + glRotate(30.0, 1.0, 0.0, 0.0) + glRotate(30.0, 0.0, 1.0, 0.0) + + glTranslate(0, -1, 0) + glRotate(250, 1, 0, 0) + glutSolidCone(0.5, 1, 30, 5) + glPopMatrix() + glRotatef((self.y - self.lasty), 0.0, 0.0, 1.0); + glRotatef((self.x - self.lastx), 1.0, 0.0, 0.0); + # push into visible buffer + self.SwapBuffers() - def runTest(frame, nb, log): - win = ButtonPanel(nb, log) - return win +#---------------------------------------------------------------------- - class MyCanvasBase(glcanvas.GLCanvas): - def __init__(self, parent): - glcanvas.GLCanvas.__init__(self, parent, -1) - self.init = False - # initial mouse position - self.lastx = self.x = 30 - self.lasty = self.y = 30 - self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) - self.Bind(wx.EVT_SIZE, self.OnSize) - self.Bind(wx.EVT_PAINT, self.OnPaint) - self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown) # needs fixing... - self.Bind(wx.EVT_LEFT_UP, self.OnMouseUp) - self.Bind(wx.EVT_MOTION, self.OnMouseMotion) - def OnEraseBackground(self, event): - pass # Do nothing, to avoid flashing on MSW. +def runTest(frame, nb, log): + win = ButtonPanel(nb, log) + return win - def OnSize(self, event): - size = self.GetClientSize() - if self.GetContext(): - self.SetCurrent() - glcanvas.glViewport(0, 0, size.width, size.height) - def OnPaint(self, event): - dc = wx.PaintDC(self) - self.SetCurrent() - if not self.init: - self.InitGL() - self.init = True - - self.OnDraw() - - def OnMouseDown(self, evt): - self.CaptureMouse() - - def OnMouseUp(self, evt): - self.ReleaseMouse() - - def OnMouseMotion(self, evt): - if evt.Dragging() and evt.LeftIsDown(): - self.x, self.y = self.lastx, self.lasty - self.x, self.y = evt.GetPosition() - self.Refresh(False) - - - class CubeCanvas(MyCanvasBase): - def InitGL(self): - # set viewing projection - glcanvas.glMatrixMode(glcanvas.GL_PROJECTION); - glcanvas.glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0); - - # position viewer - glcanvas.glMatrixMode(glcanvas.GL_MODELVIEW); - glcanvas.glTranslatef(0.0, 0.0, -2.0); - - # position object - glcanvas.glRotatef(self.y, 1.0, 0.0, 0.0); - glcanvas.glRotatef(self.x, 0.0, 1.0, 0.0); - - glcanvas.glEnable(glcanvas.GL_DEPTH_TEST); - glcanvas.glEnable(glcanvas.GL_LIGHTING); - glcanvas.glEnable(glcanvas.GL_LIGHT0); - - - def OnDraw(self): - # clear color and depth buffers - glcanvas.glClear(glcanvas.GL_COLOR_BUFFER_BIT | glcanvas.GL_DEPTH_BUFFER_BIT) - - # draw six faces of a cube - glcanvas.glBegin(glcanvas.GL_QUADS) - glcanvas.glNormal3f( 0.0, 0.0, 1.0) - glcanvas.glVertex3f( 0.5, 0.5, 0.5) - glcanvas.glVertex3f(-0.5, 0.5, 0.5) - glcanvas.glVertex3f(-0.5,-0.5, 0.5) - glcanvas.glVertex3f( 0.5,-0.5, 0.5) - - glcanvas.glNormal3f( 0.0, 0.0,-1.0) - glcanvas.glVertex3f(-0.5,-0.5,-0.5) - glcanvas.glVertex3f(-0.5, 0.5,-0.5) - glcanvas.glVertex3f( 0.5, 0.5,-0.5) - glcanvas.glVertex3f( 0.5,-0.5,-0.5) - - glcanvas.glNormal3f( 0.0, 1.0, 0.0) - glcanvas.glVertex3f( 0.5, 0.5, 0.5) - glcanvas.glVertex3f( 0.5, 0.5,-0.5) - glcanvas.glVertex3f(-0.5, 0.5,-0.5) - glcanvas.glVertex3f(-0.5, 0.5, 0.5) - - glcanvas.glNormal3f( 0.0,-1.0, 0.0) - glcanvas.glVertex3f(-0.5,-0.5,-0.5) - glcanvas.glVertex3f( 0.5,-0.5,-0.5) - glcanvas.glVertex3f( 0.5,-0.5, 0.5) - glcanvas.glVertex3f(-0.5,-0.5, 0.5) - - glcanvas.glNormal3f( 1.0, 0.0, 0.0) - glcanvas.glVertex3f( 0.5, 0.5, 0.5) - glcanvas.glVertex3f( 0.5,-0.5, 0.5) - glcanvas.glVertex3f( 0.5,-0.5,-0.5) - glcanvas.glVertex3f( 0.5, 0.5,-0.5) - - glcanvas.glNormal3f(-1.0, 0.0, 0.0) - glcanvas.glVertex3f(-0.5,-0.5,-0.5) - glcanvas.glVertex3f(-0.5,-0.5, 0.5) - glcanvas.glVertex3f(-0.5, 0.5, 0.5) - glcanvas.glVertex3f(-0.5, 0.5,-0.5) - glcanvas.glEnd() - - glcanvas.glRotatef((self.lasty - self.y)/100., 1.0, 0.0, 0.0); - glcanvas.glRotatef((self.lastx - self.x)/100., 0.0, 1.0, 0.0); - - self.SwapBuffers() - - - class ConeCanvas(MyCanvasBase): - def InitGL( self ): - glcanvas.glMatrixMode(glcanvas.GL_PROJECTION); - # camera frustrum setup - glcanvas.glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0); - glcanvas.glMaterial(glcanvas.GL_FRONT, glcanvas.GL_AMBIENT, [0.2, 0.2, 0.2, 1.0]) - glcanvas.glMaterial(glcanvas.GL_FRONT, glcanvas.GL_DIFFUSE, [0.8, 0.8, 0.8, 1.0]) - glcanvas.glMaterial(glcanvas.GL_FRONT, glcanvas.GL_SPECULAR, [1.0, 0.0, 1.0, 1.0]) - glcanvas.glMaterial(glcanvas.GL_FRONT, glcanvas.GL_SHININESS, 50.0) - glcanvas.glLight(glcanvas.GL_LIGHT0, glcanvas.GL_AMBIENT, [0.0, 1.0, 0.0, 1.0]) - glcanvas.glLight(glcanvas.GL_LIGHT0, glcanvas.GL_DIFFUSE, [1.0, 1.0, 1.0, 1.0]) - glcanvas.glLight(glcanvas.GL_LIGHT0, glcanvas.GL_SPECULAR, [1.0, 1.0, 1.0, 1.0]) - glcanvas.glLight(glcanvas.GL_LIGHT0, glcanvas.GL_POSITION, [1.0, 1.0, 1.0, 0.0]); - glcanvas.glLightModel(glcanvas.GL_LIGHT_MODEL_AMBIENT, [0.2, 0.2, 0.2, 1.0]) - glcanvas.glEnable(glcanvas.GL_LIGHTING) - glcanvas.glEnable(glcanvas.GL_LIGHT0) - glcanvas.glDepthFunc(glcanvas.GL_LESS) - glcanvas.glEnable(glcanvas.GL_DEPTH_TEST) - glcanvas.glClear(glcanvas.GL_COLOR_BUFFER_BIT | glcanvas.GL_DEPTH_BUFFER_BIT) - # position viewer - glcanvas.glMatrixMode(glcanvas.GL_MODELVIEW); - - - def OnDraw(self): - # clear color and depth buffers - glcanvas.glClear(glcanvas.GL_COLOR_BUFFER_BIT | glcanvas.GL_DEPTH_BUFFER_BIT); - # use a fresh transformation matrix - glcanvas.glPushMatrix() - # position object - glcanvas.glTranslate(0.0, 0.0, -2.0); - glcanvas.glRotate(30.0, 1.0, 0.0, 0.0); - glcanvas.glRotate(30.0, 0.0, 1.0, 0.0); - - glcanvas.glTranslate(0, -1, 0) - glcanvas.glRotate(250, 1, 0, 0) - glcanvas.glutSolidCone(0.5, 1, 30, 5) - glcanvas.glPopMatrix() - glcanvas.glRotatef((self.lasty - self.y)/100., 0.0, 0.0, 1.0); - glcanvas.glRotatef(0.0, (self.lastx - self.x)/100., 1.0, 0.0); - # push into visible buffer - self.SwapBuffers() +overview = """\ +""" -#---------------------------------------------------------------------- +if __name__ == '__main__': + import sys,os + import run + run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:]) -overview = """\ -""" #---------------------------------------------------------------------- -def _test(): - class MyApp(wxApp): - def OnInit(self): - frame = wx.Frame(None, -1, "GL Demos", wx.DefaultPosition, (600,300)) - #win = ConeCanvas(frame) - MySplitter(frame) - frame.Show(True) - self.SetTopWindow(frame) - return True - - app = MyApp(0) - app.MainLoop() - -if __name__ == '__main__': - _test() -