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