X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..3f55f5b81fbe7a2294912663c192113209bbc930:/wxPython/demo/wxGLCanvas.py diff --git a/wxPython/demo/wxGLCanvas.py b/wxPython/demo/wxGLCanvas.py index d6266f5814..a4d0194cb0 100644 --- a/wxPython/demo/wxGLCanvas.py +++ b/wxPython/demo/wxGLCanvas.py @@ -1,19 +1,18 @@ - from wxPython.wx import * try: from wxPython.glcanvas import * - haveGLCanvas = true + haveGLCanvas = True except ImportError: - haveGLCanvas = false + haveGLCanvas = False try: # The Python OpenGL package can be found at - # http://starship.python.net:9673/crew/da/Code/PyOpenGL/ + # http://PyOpenGL.sourceforge.net/ from OpenGL.GL import * from OpenGL.GLUT import * - haveOpenGL = true + haveOpenGL = True except ImportError: - haveOpenGL = false + haveOpenGL = False #---------------------------------------------------------------------- @@ -28,43 +27,77 @@ 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/', + 'http://PyOpenGL.sourceforge.net/', '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 + buttonDefs = { + wxNewId() : ('CubeCanvas', 'Cube'), + wxNewId() : ('ConeCanvas', 'Cone'), + } + class ButtonPanel(wxPanel): + def __init__(self, parent, log): + wxPanel.__init__(self, parent, -1) + self.log = log + + box = wxBoxSizer(wxVERTICAL) + box.Add(20, 30) + keys = buttonDefs.keys() + keys.sort() + for k in keys: + text = buttonDefs[k][1] + btn = wxButton(self, k, text) + box.Add(btn, 0, wxALIGN_CENTER|wxALL, 15) + EVT_BUTTON(self, k, self.OnButton) + + #** Enable this to show putting a wxGLCanvas on the wxPanel + if 0: + c = CubeCanvas(self) + c.SetSize((200, 200)) + box.Add(c, 0, wxALIGN_CENTER|wxALL, 15) + + self.SetAutoLayout(True) + self.SetSizer(box) + + + def OnButton(self, evt): + canvasClassName = buttonDefs[evt.GetId()][0] + canvasClass = eval(canvasClassName) + frame = wxFrame(None, -1, canvasClassName, size=(400,400)) + canvas = canvasClass(frame) + frame.Show(True) - 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) + + def runTest(frame, nb, log): + win = ButtonPanel(nb, log) + return win + - class CubeCanvas(wxGLCanvas): + class MyCanvasBase(wxGLCanvas): def __init__(self, parent): wxGLCanvas.__init__(self, parent, -1) + self.init = False + # initial mouse position + self.lastx = self.x = 30 + self.lasty = self.y = 30 EVT_ERASE_BACKGROUND(self, self.OnEraseBackground) EVT_SIZE(self, self.OnSize) EVT_PAINT(self, self.OnPaint) - self.init = false + EVT_LEFT_DOWN(self, self.OnMouseDown) # needs fixing... + EVT_LEFT_UP(self, self.OnMouseUp) + EVT_MOTION(self, self.OnMouseMotion) def OnEraseBackground(self, event): - pass # Do nothing, to avoid flashing. + pass # Do nothing, to avoid flashing on MSW. def OnSize(self, event): size = self.GetClientSize() @@ -72,16 +105,49 @@ else: 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 + 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 + 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); @@ -124,46 +190,17 @@ else: 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); + glRotatef((self.lasty - self.y)/100., 1.0, 0.0, 0.0); + glRotatef((self.lastx - self.x)/100., 0.0, 1.0, 0.0); - # position object - glRotatef(30.0, 1.0, 0.0, 0.0); - glRotatef(30.0, 0.0, 1.0, 0.0); + self.SwapBuffers() - 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 ): + 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); @@ -181,20 +218,13 @@ else: glDepthFunc(GL_LESS) glEnable(GL_DEPTH_TEST) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) + # position viewer + glMatrixMode(GL_MODELVIEW); - 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() + def OnDraw(self): # 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 @@ -202,15 +232,18 @@ else: 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) + glutSolidCone(0.5, 1, 30, 5) glPopMatrix() + glRotatef((self.lasty - self.y)/100., 0.0, 0.0, 1.0); + glRotatef(0.0, (self.lastx - self.x)/100., 1.0, 0.0); # push into visible buffer self.SwapBuffers() + + #---------------------------------------------------------------------- @@ -232,15 +265,16 @@ overview = """\ def _test(): class MyApp(wxApp): def OnInit(self): - frame = wxFrame(NULL, -1, "GL Demos", wxDefaultPosition, wxSize(600,300)) + frame = wxFrame(None, -1, "GL Demos", wxDefaultPosition, wxSize(600,300)) #win = ConeCanvas(frame) MySplitter(frame) - frame.Show(TRUE) + frame.Show(True) self.SetTopWindow(frame) - return TRUE + return True app = MyApp(0) app.MainLoop() if __name__ == '__main__': _test() +