5 from wx
import glcanvas
11 # The Python OpenGL package can be found at
12 # http://PyOpenGL.sourceforge.net/
13 from OpenGL
.GL
import *
14 from OpenGL
.GLUT
import *
19 #----------------------------------------------------------------------
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
)
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
)
42 wx
.NewId() : ('CubeCanvas', 'Cube'),
43 wx
.NewId() : ('ConeCanvas', 'Cone'),
46 class ButtonPanel(wx
.Panel
):
47 def __init__(self
, parent
, log
):
48 wx
.Panel
.__init
__(self
, parent
, -1)
51 box
= wx
.BoxSizer(wx
.VERTICAL
)
53 keys
= buttonDefs
.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
)
61 #** Enable this to show putting a GLCanvas on the wx.Panel
65 box
.Add(c
, 0, wx
.ALIGN_CENTER|wx
.ALL
, 15)
67 self
.SetAutoLayout(True)
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
)
80 def runTest(frame
, nb
, log
):
81 win
= ButtonPanel(nb
, log
)
87 class MyCanvasBase(glcanvas
.GLCanvas
):
88 def __init__(self
, parent
):
89 glcanvas
.GLCanvas
.__init
__(self
, parent
, -1)
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
)
101 def OnEraseBackground(self
, event
):
102 pass # Do nothing, to avoid flashing on MSW.
104 def OnSize(self
, event
):
105 size
= self
.GetClientSize()
106 if self
.GetContext():
108 glViewport(0, 0, size
.width
, size
.height
)
110 def OnPaint(self
, event
):
111 dc
= wx
.PaintDC(self
)
118 def OnMouseDown(self
, evt
):
121 def OnMouseUp(self
, evt
):
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()
133 class CubeCanvas(MyCanvasBase
):
135 # set viewing projection
136 glMatrixMode(GL_PROJECTION
);
137 glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0);
140 glMatrixMode(GL_MODELVIEW
);
141 glTranslatef(0.0, 0.0, -2.0);
144 glRotatef(self
.y
, 1.0, 0.0, 0.0);
145 glRotatef(self
.x
, 0.0, 1.0, 0.0);
147 glEnable(GL_DEPTH_TEST
);
148 glEnable(GL_LIGHTING
);
153 # clear color and depth buffers
154 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT
);
156 # draw six faces of a cube
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)
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)
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)
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)
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)
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)
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);
204 class ConeCanvas(MyCanvasBase
):
206 glMatrixMode(GL_PROJECTION
);
207 # camera frustrum setup
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
)
221 glEnable(GL_DEPTH_TEST
)
222 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT
)
224 glMatrixMode(GL_MODELVIEW
);
228 # clear color and depth buffers
229 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT
);
230 # use a fresh transformation matrix
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);
237 glTranslate(0, -1, 0)
238 glRotate(250, 1, 0, 0)
239 glutSolidCone(0.5, 1, 30, 5)
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);
243 # push into visible buffer
249 #----------------------------------------------------------------------
259 if __name__
== '__main__':
262 run
.main(['', os
.path
.basename(sys
.argv
[0])])
267 #----------------------------------------------------------------------