X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8a693e6e0460b6b3c32e4b6f114a3ab7b7cd24ea..f6bcfd974ef26faf6f91a62cac09827e09463fd1:/wxPython/demo/wxGLCanvas.py diff --git a/wxPython/demo/wxGLCanvas.py b/wxPython/demo/wxGLCanvas.py new file mode 100644 index 0000000000..d6266f5814 --- /dev/null +++ b/wxPython/demo/wxGLCanvas.py @@ -0,0 +1,246 @@ + +from wxPython.wx import * +try: + from wxPython.glcanvas import * + haveGLCanvas = true +except ImportError: + haveGLCanvas = false + +try: + # The Python OpenGL package can be found at + # http://starship.python.net:9673/crew/da/Code/PyOpenGL/ + from OpenGL.GL import * + from OpenGL.GLUT import * + haveOpenGL = true +except ImportError: + haveOpenGL = false + +#---------------------------------------------------------------------- + +if not haveGLCanvas: + def runTest(frame, nb, log): + dlg = wxMessageDialog(frame, 'The wxGLCanvas has not been included with this build of wxPython!', + 'Sorry', wxOK | wxICON_INFORMATION) + dlg.ShowModal() + dlg.Destroy() + +elif not haveOpenGL: + def runTest(frame, nb, log): + dlg = wxMessageDialog(frame, + 'The OpenGL package was not found. You can get it at\n' + 'http://starship.python.net:9673/crew/da/Code/PyOpenGL/', + 'Sorry', wxOK | wxICON_INFORMATION) + dlg.ShowModal() + dlg.Destroy() + + +else: + def runTest(frame, nb, log): + win = wxFrame(frame, -1, "GL Demos", wxDefaultPosition, wxSize(300,300)) + CubeCanvas(win) + #MySplitter(win) + frame.otherWin = win + win.Show(true) + return None + + + class MySplitter(wxSplitterWindow): + def __init__(self, parent): + wxSplitterWindow.__init__(self, parent, -1) + cube = CubeCanvas(self) + cone = ConeCanvas(self) + + self.SplitVertically(cube, cone) + self.SetSashPosition(300) + + + + class CubeCanvas(wxGLCanvas): + def __init__(self, parent): + wxGLCanvas.__init__(self, parent, -1) + EVT_ERASE_BACKGROUND(self, self.OnEraseBackground) + EVT_SIZE(self, self.OnSize) + EVT_PAINT(self, self.OnPaint) + self.init = false + + def OnEraseBackground(self, event): + pass # Do nothing, to avoid flashing. + + def OnSize(self, event): + size = self.GetClientSize() + if self.GetContext(): + self.SetCurrent() + glViewport(0, 0, size.width, size.height) + + + def OnPaint(self, event): + dc = wxPaintDC(self) + + self.SetCurrent() + + if not self.init: + self.InitGL() + self.init = true + + # 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() + + self.SwapBuffers() + + + 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(30.0, 1.0, 0.0, 0.0); + glRotatef(30.0, 0.0, 1.0, 0.0); + + glEnable(GL_DEPTH_TEST); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + + + + class ConeCanvas(wxGLCanvas): + def __init__(self, parent): + wxGLCanvas.__init__(self, parent, -1) + EVT_ERASE_BACKGROUND(self, self.OnEraseBackground) + EVT_SIZE(self, self.OnSize) + EVT_PAINT(self, self.OnPaint) + self.init = false + + def OnEraseBackground(self, event): + pass # Do nothing, to avoid flashing. + + def OnSize(self, event): + size = self.GetClientSize() + if self.GetContext(): + self.SetCurrent() + glViewport(0, 0, size.width, size.height) + + def GLInit( 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]); + glLightModel(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) + + + def OnPaint( self, event ): + dc = wxPaintDC(self) + if not self.init: + self.GLInit() + self.init = true + + ### Tell system to use _this_ glcanvas for all commands + self.SetCurrent() + # clear color and depth buffers + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + # position viewer + glMatrixMode(GL_MODELVIEW); + # 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); + + ### From cone.py + glTranslate(0, -1, 0) + glRotate(250, 1, 0, 0) + glutSolidCone(1, 2, 50, 10) + glPopMatrix() + # push into visible buffer + self.SwapBuffers() + + +#---------------------------------------------------------------------- + + + + + + + + +overview = """\ +""" + + + + + +#---------------------------------------------------------------------- + +def _test(): + class MyApp(wxApp): + def OnInit(self): + frame = wxFrame(NULL, -1, "GL Demos", wxDefaultPosition, wxSize(600,300)) + #win = ConeCanvas(frame) + MySplitter(frame) + frame.Show(TRUE) + self.SetTopWindow(frame) + return TRUE + + app = MyApp(0) + app.MainLoop() + +if __name__ == '__main__': + _test()