]> git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/GLCanvas.py
fixed wxPluginLibrary unloading on failture (patch #962838)
[wxWidgets.git] / wxPython / demo / GLCanvas.py
1
2 import wx
3
4 try:
5 from wx import glcanvas
6 haveGLCanvas = True
7 except ImportError:
8 haveGLCanvas = False
9
10 try:
11 # The Python OpenGL package can be found at
12 # http://PyOpenGL.sourceforge.net/
13 from OpenGL.GL import *
14 from OpenGL.GLUT import *
15 haveOpenGL = True
16 except ImportError:
17 haveOpenGL = False
18
19 #----------------------------------------------------------------------
20
21 if not haveGLCanvas:
22 def runTest(frame, nb, log):
23 dlg = wx.MessageDialog(frame, 'The GLCanvas class has not been included with this build of wxPython!',
24 'Sorry', wx.OK | wx.ICON_INFORMATION)
25 dlg.ShowModal()
26 dlg.Destroy()
27
28 elif not haveOpenGL:
29 def runTest(frame, nb, log):
30 dlg = wx.MessageDialog(frame,
31 'The OpenGL package was not found. You can get it at\n'
32 'http://PyOpenGL.sourceforge.net/',
33 'Sorry', wx.OK | wx.ICON_INFORMATION)
34 dlg.ShowModal()
35 dlg.Destroy()
36
37
38
39
40 else:
41 buttonDefs = {
42 wx.NewId() : ('CubeCanvas', 'Cube'),
43 wx.NewId() : ('ConeCanvas', 'Cone'),
44 }
45
46 class ButtonPanel(wx.Panel):
47 def __init__(self, parent, log):
48 wx.Panel.__init__(self, parent, -1)
49 self.log = log
50
51 box = wx.BoxSizer(wx.VERTICAL)
52 box.Add((20, 30))
53 keys = buttonDefs.keys()
54 keys.sort()
55 for k in keys:
56 text = buttonDefs[k][1]
57 btn = wx.Button(self, k, text)
58 box.Add(btn, 0, wx.ALIGN_CENTER|wx.ALL, 15)
59 self.Bind(wx.EVT_BUTTON, self.OnButton, btn)
60
61 #** Enable this to show putting a GLCanvas on the wx.Panel
62 if 0:
63 c = CubeCanvas(self)
64 c.SetSize((200, 200))
65 box.Add(c, 0, wx.ALIGN_CENTER|wx.ALL, 15)
66
67 self.SetAutoLayout(True)
68 self.SetSizer(box)
69
70
71 def OnButton(self, evt):
72 canvasClassName = buttonDefs[evt.GetId()][0]
73 canvasClass = eval(canvasClassName)
74 frame = wx.Frame(None, -1, canvasClassName, size=(400,400))
75 canvas = canvasClass(frame)
76 frame.Show(True)
77
78
79
80 def runTest(frame, nb, log):
81 win = ButtonPanel(nb, log)
82 return win
83
84
85
86
87 class MyCanvasBase(glcanvas.GLCanvas):
88 def __init__(self, parent):
89 glcanvas.GLCanvas.__init__(self, parent, -1)
90 self.init = False
91 # initial mouse position
92 self.lastx = self.x = 30
93 self.lasty = self.y = 30
94 self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
95 self.Bind(wx.EVT_SIZE, self.OnSize)
96 self.Bind(wx.EVT_PAINT, self.OnPaint)
97 self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown)
98 self.Bind(wx.EVT_LEFT_UP, self.OnMouseUp)
99 self.Bind(wx.EVT_MOTION, self.OnMouseMotion)
100
101
102 def OnEraseBackground(self, event):
103 pass # Do nothing, to avoid flashing on MSW.
104
105
106 def OnSize(self, event):
107 size = self.GetClientSize()
108 if self.GetContext():
109 self.SetCurrent()
110 glViewport(0, 0, size.width, size.height)
111 event.Skip()
112
113
114 def OnPaint(self, event):
115 dc = wx.PaintDC(self)
116 self.SetCurrent()
117 if not self.init:
118 self.InitGL()
119 self.init = True
120 self.OnDraw()
121
122
123 def OnMouseDown(self, evt):
124 self.CaptureMouse()
125
126
127 def OnMouseUp(self, evt):
128 self.ReleaseMouse()
129
130
131 def OnMouseMotion(self, evt):
132 if evt.Dragging() and evt.LeftIsDown():
133 self.x, self.y = self.lastx, self.lasty
134 self.x, self.y = evt.GetPosition()
135 self.Refresh(False)
136
137
138
139
140 class CubeCanvas(MyCanvasBase):
141 def InitGL(self):
142 # set viewing projection
143 glMatrixMode(GL_PROJECTION);
144 glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0);
145
146 # position viewer
147 glMatrixMode(GL_MODELVIEW);
148 glTranslatef(0.0, 0.0, -2.0);
149
150 # position object
151 glRotatef(self.y, 1.0, 0.0, 0.0);
152 glRotatef(self.x, 0.0, 1.0, 0.0);
153
154 glEnable(GL_DEPTH_TEST);
155 glEnable(GL_LIGHTING);
156 glEnable(GL_LIGHT0);
157
158
159 def OnDraw(self):
160 # clear color and depth buffers
161 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
162
163 # draw six faces of a cube
164 glBegin(GL_QUADS)
165 glNormal3f( 0.0, 0.0, 1.0)
166 glVertex3f( 0.5, 0.5, 0.5)
167 glVertex3f(-0.5, 0.5, 0.5)
168 glVertex3f(-0.5,-0.5, 0.5)
169 glVertex3f( 0.5,-0.5, 0.5)
170
171 glNormal3f( 0.0, 0.0,-1.0)
172 glVertex3f(-0.5,-0.5,-0.5)
173 glVertex3f(-0.5, 0.5,-0.5)
174 glVertex3f( 0.5, 0.5,-0.5)
175 glVertex3f( 0.5,-0.5,-0.5)
176
177 glNormal3f( 0.0, 1.0, 0.0)
178 glVertex3f( 0.5, 0.5, 0.5)
179 glVertex3f( 0.5, 0.5,-0.5)
180 glVertex3f(-0.5, 0.5,-0.5)
181 glVertex3f(-0.5, 0.5, 0.5)
182
183 glNormal3f( 0.0,-1.0, 0.0)
184 glVertex3f(-0.5,-0.5,-0.5)
185 glVertex3f( 0.5,-0.5,-0.5)
186 glVertex3f( 0.5,-0.5, 0.5)
187 glVertex3f(-0.5,-0.5, 0.5)
188
189 glNormal3f( 1.0, 0.0, 0.0)
190 glVertex3f( 0.5, 0.5, 0.5)
191 glVertex3f( 0.5,-0.5, 0.5)
192 glVertex3f( 0.5,-0.5,-0.5)
193 glVertex3f( 0.5, 0.5,-0.5)
194
195 glNormal3f(-1.0, 0.0, 0.0)
196 glVertex3f(-0.5,-0.5,-0.5)
197 glVertex3f(-0.5,-0.5, 0.5)
198 glVertex3f(-0.5, 0.5, 0.5)
199 glVertex3f(-0.5, 0.5,-0.5)
200 glEnd()
201
202 glRotatef((self.lasty - self.y)/100., 1.0, 0.0, 0.0);
203 glRotatef((self.lastx - self.x)/100., 0.0, 1.0, 0.0);
204
205 self.SwapBuffers()
206
207
208
209
210
211 class ConeCanvas(MyCanvasBase):
212 def InitGL( self ):
213 glMatrixMode(GL_PROJECTION);
214 # camera frustrum setup
215 glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0);
216 glMaterial(GL_FRONT, GL_AMBIENT, [0.2, 0.2, 0.2, 1.0])
217 glMaterial(GL_FRONT, GL_DIFFUSE, [0.8, 0.8, 0.8, 1.0])
218 glMaterial(GL_FRONT, GL_SPECULAR, [1.0, 0.0, 1.0, 1.0])
219 glMaterial(GL_FRONT, GL_SHININESS, 50.0)
220 glLight(GL_LIGHT0, GL_AMBIENT, [0.0, 1.0, 0.0, 1.0])
221 glLight(GL_LIGHT0, GL_DIFFUSE, [1.0, 1.0, 1.0, 1.0])
222 glLight(GL_LIGHT0, GL_SPECULAR, [1.0, 1.0, 1.0, 1.0])
223 glLight(GL_LIGHT0, GL_POSITION, [1.0, 1.0, 1.0, 0.0]);
224 glLightModel(GL_LIGHT_MODEL_AMBIENT, [0.2, 0.2, 0.2, 1.0])
225 glEnable(GL_LIGHTING)
226 glEnable(GL_LIGHT0)
227 glDepthFunc(GL_LESS)
228 glEnable(GL_DEPTH_TEST)
229 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
230 # position viewer
231 glMatrixMode(GL_MODELVIEW);
232
233
234 def OnDraw(self):
235 # clear color and depth buffers
236 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
237 # use a fresh transformation matrix
238 glPushMatrix()
239 # position object
240 glTranslate(0.0, 0.0, -2.0);
241 glRotate(30.0, 1.0, 0.0, 0.0);
242 glRotate(30.0, 0.0, 1.0, 0.0);
243
244 glTranslate(0, -1, 0)
245 glRotate(250, 1, 0, 0)
246 glutSolidCone(0.5, 1, 30, 5)
247 glPopMatrix()
248 glRotatef((self.lasty - self.y)/100., 0.0, 0.0, 1.0);
249 glRotatef(0.0, (self.lastx - self.x)/100., 1.0, 0.0);
250 # push into visible buffer
251 self.SwapBuffers()
252
253
254
255
256 #----------------------------------------------------------------------
257
258
259
260
261 overview = """\
262 """
263
264
265
266 if __name__ == '__main__':
267 import sys,os
268 import run
269 run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
270
271
272
273
274 #----------------------------------------------------------------------
275