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