Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import wx
- from wx import glcanvas
- from OpenGL.GL import *
- from OpenGL.GLUT import *
- 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)
- def OnEraseBackground(self, event):
- pass # Do nothing, to avoid flashing on MSW.
- def OnSize(self, event):
- size = self.size = self.GetClientSize()
- if self.GetContext():
- self.SetCurrent()
- glViewport(0, 0, size.width, size.height)
- event.Skip()
- 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()
- self.x, self.y = self.lastx, self.lasty = evt.GetPosition()
- 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 MyFrame(wx.Frame):
- def __init__(self):
- wx.Frame.__init__(self, None, -1, 'Test OpenGL', size=(300,320))
- button_panel = wx.Panel(self, -1)
- wx.Button(button_panel, -1, 'TEST')
- gl_panel = CubeCanvas(self)
- sizer = wx.BoxSizer(wx.VERTICAL)
- sizer.Add(button_panel, 0, wx.ALL|wx.EXPAND, 5)
- sizer.Add(gl_panel, 1, wx.ALL|wx.EXPAND, 5)
- self.SetSizer(sizer)
- app = wx.App()
- frame = MyFrame()
- app.SetTopWindow(frame)
- frame.Show(True)
- app.MainLoop()
Advertisement
Add Comment
Please, Sign In to add comment