1 import math, time, os
\r
3 from util import meshLoader
\r
4 from util import util3d
\r
5 from util import profile
\r
9 OpenGL.ERROR_CHECKING = False
\r
10 from OpenGL.GLU import *
\r
11 from OpenGL.GL import *
\r
12 hasOpenGLlibs = True
\r
14 print "Failed to find PyOpenGL: http://pyopengl.sourceforge.net/"
\r
15 hasOpenGLlibs = False
\r
17 def InitGL(window, view3D, zoom):
\r
18 # set viewing projection
\r
19 glMatrixMode(GL_MODELVIEW)
\r
21 size = window.GetSize()
\r
22 glViewport(0,0, size.GetWidth(), size.GetHeight())
\r
24 glLightfv(GL_LIGHT0, GL_POSITION, [0.2, 0.2, 1.0, 0.0])
\r
25 glLightfv(GL_LIGHT1, GL_POSITION, [1.0, 1.0, 1.0, 0.0])
\r
27 glEnable(GL_RESCALE_NORMAL)
\r
28 glEnable(GL_LIGHTING)
\r
30 glEnable(GL_DEPTH_TEST)
\r
31 glEnable(GL_CULL_FACE)
\r
34 glClearColor(1.0, 1.0, 1.0, 1.0)
\r
38 glMatrixMode(GL_PROJECTION)
\r
40 aspect = float(size.GetWidth()) / float(size.GetHeight())
\r
42 gluPerspective(45.0, aspect, 1.0, 1000.0)
\r
44 glOrtho(-aspect * (zoom), aspect * (zoom), -1.0 * (zoom), 1.0 * (zoom), -1000.0, 1000.0)
\r
46 glMatrixMode(GL_MODELVIEW)
\r
48 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)
\r
52 def DrawMachine(machineSize):
\r
53 if profile.getPreference('machine_type') == 'ultimaker':
\r
55 glEnable(GL_LIGHTING)
\r
56 glTranslate(100,200,-5)
\r
57 glLightfv(GL_LIGHT0, GL_DIFFUSE, [0.8,0.8,0.8])
\r
58 glLightfv(GL_LIGHT0, GL_AMBIENT, [0.5,0.5,0.5])
\r
60 glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR)
\r
63 if platformMesh == None:
\r
64 platformMesh = meshLoader.loadMesh(os.path.normpath(os.path.join(os.path.split(__file__)[0], "../images", 'ultimaker_platform.stl')))
\r
65 platformMesh.setRotateMirror(0, False, False, False, False, False)
\r
67 DrawMesh(platformMesh)
\r
70 glDisable(GL_LIGHTING)
\r
72 glColor3f(0.7,0.7,0.7)
\r
75 for i in xrange(0, int(machineSize.x), 10):
\r
77 glVertex3f(i, machineSize.y, 0)
\r
78 for i in xrange(0, int(machineSize.y), 10):
\r
80 glVertex3f(machineSize.x, i, 0)
\r
83 glEnable(GL_LINE_SMOOTH)
\r
85 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
\r
86 glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
\r
88 glColor3f(0.0,0.0,0.0)
\r
90 glBegin(GL_LINE_LOOP)
\r
92 glVertex3f(machineSize.x, 0, 0)
\r
93 glVertex3f(machineSize.x, machineSize.y, 0)
\r
94 glVertex3f(0, machineSize.y, 0)
\r
98 glBegin(GL_LINE_LOOP)
\r
99 glVertex3f(0, 0, machineSize.z)
\r
100 glVertex3f(machineSize.x, 0, machineSize.z)
\r
101 glVertex3f(machineSize.x, machineSize.y, machineSize.z)
\r
102 glVertex3f(0, machineSize.y, machineSize.z)
\r
105 glVertex3f(0, 0, 0)
\r
106 glVertex3f(0, 0, machineSize.z)
\r
107 glVertex3f(machineSize.x, 0, 0)
\r
108 glVertex3f(machineSize.x, 0, machineSize.z)
\r
109 glVertex3f(machineSize.x, machineSize.y, 0)
\r
110 glVertex3f(machineSize.x, machineSize.y, machineSize.z)
\r
111 glVertex3f(0, machineSize.y, 0)
\r
112 glVertex3f(0, machineSize.y, machineSize.z)
\r
115 glDisable(GL_CULL_FACE)
\r
117 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
\r
118 glColor4ub(5,171,231,127)
\r
120 for x in xrange(0, int(machineSize.x), 20):
\r
121 for y in xrange(0, int(machineSize.y), 20):
\r
122 glVertex3f(x, y, -0.01)
\r
123 glVertex3f(min(x+10, machineSize.x), y, -0.01)
\r
124 glVertex3f(min(x+10, machineSize.x), min(y+10, machineSize.y), -0.01)
\r
125 glVertex3f(x, min(y+10, machineSize.y), -0.01)
\r
126 for x in xrange(10, int(machineSize.x), 20):
\r
127 for y in xrange(10, int(machineSize.y), 20):
\r
128 glVertex3f(x, y, -0.01)
\r
129 glVertex3f(min(x+10, machineSize.x), y, -0.01)
\r
130 glVertex3f(min(x+10, machineSize.x), min(y+10, machineSize.y), -0.01)
\r
131 glVertex3f(x, min(y+10, machineSize.y), -0.01)
\r
133 glColor4ub(5*8/10,171*8/10,231*8/10,128)
\r
135 for x in xrange(10, int(machineSize.x), 20):
\r
136 for y in xrange(0, int(machineSize.y), 20):
\r
137 glVertex3f(x, y, -0.01)
\r
138 glVertex3f(min(x+10, machineSize.x), y, -0.01)
\r
139 glVertex3f(min(x+10, machineSize.x), min(y+10, machineSize.y), -0.01)
\r
140 glVertex3f(x, min(y+10, machineSize.y), -0.01)
\r
141 for x in xrange(0, int(machineSize.x), 20):
\r
142 for y in xrange(10, int(machineSize.y), 20):
\r
143 glVertex3f(x, y, -0.01)
\r
144 glVertex3f(min(x+10, machineSize.x), y, -0.01)
\r
145 glVertex3f(min(x+10, machineSize.x), min(y+10, machineSize.y), -0.01)
\r
146 glVertex3f(x, min(y+10, machineSize.y), -0.01)
\r
148 glEnable(GL_CULL_FACE)
\r
150 glColor4ub(5,171,231,64)
\r
152 glVertex3f(0, 0, machineSize.z)
\r
153 glVertex3f(0, machineSize.y, machineSize.z)
\r
154 glVertex3f(machineSize.x, machineSize.y, machineSize.z)
\r
155 glVertex3f(machineSize.x, 0, machineSize.z)
\r
158 glColor4ub(5,171,231,96)
\r
160 glVertex3f(0, 0, 0)
\r
161 glVertex3f(0, 0, machineSize.z)
\r
162 glVertex3f(machineSize.x, 0, machineSize.z)
\r
163 glVertex3f(machineSize.x, 0, 0)
\r
165 glVertex3f(0, machineSize.y, machineSize.z)
\r
166 glVertex3f(0, machineSize.y, 0)
\r
167 glVertex3f(machineSize.x, machineSize.y, 0)
\r
168 glVertex3f(machineSize.x, machineSize.y, machineSize.z)
\r
171 glColor4ub(5,171,231,128)
\r
173 glVertex3f(0, 0, machineSize.z)
\r
174 glVertex3f(0, 0, 0)
\r
175 glVertex3f(0, machineSize.y, 0)
\r
176 glVertex3f(0, machineSize.y, machineSize.z)
\r
178 glVertex3f(machineSize.x, 0, 0)
\r
179 glVertex3f(machineSize.x, 0, machineSize.z)
\r
180 glVertex3f(machineSize.x, machineSize.y, machineSize.z)
\r
181 glVertex3f(machineSize.x, machineSize.y, 0)
\r
184 glDisable(GL_BLEND)
\r
205 glDisable(GL_DEPTH_TEST)
\r
209 glTranslate(23,0,0)
\r
210 noZ = ResetMatrixRotationAndScale()
\r
212 glVertex3f(-0.8,1,0)
\r
213 glVertex3f(0.8,-1,0)
\r
214 glVertex3f(0.8,1,0)
\r
215 glVertex3f(-0.8,-1,0)
\r
222 glTranslate(0,23,0)
\r
223 ResetMatrixRotationAndScale()
\r
225 glVertex3f(-0.8, 1,0)
\r
226 glVertex3f( 0.0, 0,0)
\r
227 glVertex3f( 0.8, 1,0)
\r
228 glVertex3f(-0.8,-1,0)
\r
236 glTranslate(0,0,23)
\r
237 ResetMatrixRotationAndScale()
\r
239 glVertex3f(-0.8, 1,0)
\r
240 glVertex3f( 0.8, 1,0)
\r
241 glVertex3f( 0.8, 1,0)
\r
242 glVertex3f(-0.8,-1,0)
\r
243 glVertex3f(-0.8,-1,0)
\r
244 glVertex3f( 0.8,-1,0)
\r
249 glEnable(GL_DEPTH_TEST)
\r
251 def ResetMatrixRotationAndScale():
\r
252 matrix = glGetFloatv(GL_MODELVIEW_MATRIX)
\r
254 if matrix[3][2] > 0:
\r
256 scale2D = matrix[0][0]
\r
267 if matrix[3][2] != 0.0:
\r
268 matrix[3][0] = matrix[3][0] / (-matrix[3][2] / 100)
\r
269 matrix[3][1] = matrix[3][1] / (-matrix[3][2] / 100)
\r
270 matrix[3][2] = -100
\r
272 matrix[0][0] = scale2D
\r
273 matrix[1][1] = scale2D
\r
274 matrix[2][2] = scale2D
\r
275 matrix[3][2] = -100
\r
278 glLoadMatrixf(matrix)
\r
281 def DrawBox(vMin, vMax):
\r
282 glBegin(GL_LINE_LOOP)
\r
283 glVertex3f(vMin[0], vMin[1], vMin[2])
\r
284 glVertex3f(vMax[0], vMin[1], vMin[2])
\r
285 glVertex3f(vMax[0], vMax[1], vMin[2])
\r
286 glVertex3f(vMin[0], vMax[1], vMin[2])
\r
289 glBegin(GL_LINE_LOOP)
\r
290 glVertex3f(vMin[0], vMin[1], vMax[2])
\r
291 glVertex3f(vMax[0], vMin[1], vMax[2])
\r
292 glVertex3f(vMax[0], vMax[1], vMax[2])
\r
293 glVertex3f(vMin[0], vMax[1], vMax[2])
\r
296 glVertex3f(vMin[0], vMin[1], vMin[2])
\r
297 glVertex3f(vMin[0], vMin[1], vMax[2])
\r
298 glVertex3f(vMax[0], vMin[1], vMin[2])
\r
299 glVertex3f(vMax[0], vMin[1], vMax[2])
\r
300 glVertex3f(vMax[0], vMax[1], vMin[2])
\r
301 glVertex3f(vMax[0], vMax[1], vMax[2])
\r
302 glVertex3f(vMin[0], vMax[1], vMin[2])
\r
303 glVertex3f(vMin[0], vMax[1], vMax[2])
\r
306 def DrawMeshOutline(mesh):
\r
307 glEnable(GL_CULL_FACE)
\r
308 glEnableClientState(GL_VERTEX_ARRAY);
\r
309 glVertexPointer(3, GL_FLOAT, 0, mesh.vertexes)
\r
311 glCullFace(GL_FRONT)
\r
313 glPolygonMode(GL_BACK, GL_LINE)
\r
314 glDrawArrays(GL_TRIANGLES, 0, mesh.vertexCount)
\r
315 glPolygonMode(GL_BACK, GL_FILL)
\r
316 glCullFace(GL_BACK)
\r
318 glDisableClientState(GL_VERTEX_ARRAY)
\r
320 def DrawMesh(mesh):
\r
321 glEnable(GL_CULL_FACE)
\r
322 glEnableClientState(GL_VERTEX_ARRAY);
\r
323 glEnableClientState(GL_NORMAL_ARRAY);
\r
324 glVertexPointer(3, GL_FLOAT, 0, mesh.vertexes)
\r
325 glNormalPointer(GL_FLOAT, 0, mesh.normal)
\r
327 #Odd, drawing in batchs is a LOT faster then drawing it all at once.
\r
328 batchSize = 999 #Warning, batchSize needs to be dividable by 3
\r
329 extraStartPos = int(mesh.vertexCount / batchSize) * batchSize
\r
330 extraCount = mesh.vertexCount - extraStartPos
\r
332 glCullFace(GL_BACK)
\r
333 for i in xrange(0, int(mesh.vertexCount / batchSize)):
\r
334 glDrawArrays(GL_TRIANGLES, i*batchSize, batchSize)
\r
335 glDrawArrays(GL_TRIANGLES, extraStartPos, extraCount)
\r
337 glCullFace(GL_FRONT)
\r
338 glNormalPointer(GL_FLOAT, 0, mesh.invNormal)
\r
339 for i in xrange(0, int(mesh.vertexCount / batchSize)):
\r
340 glDrawArrays(GL_TRIANGLES, i*batchSize, batchSize)
\r
341 extraStartPos = int(mesh.vertexCount / batchSize) * batchSize
\r
342 extraCount = mesh.vertexCount - extraStartPos
\r
343 glDrawArrays(GL_TRIANGLES, extraStartPos, extraCount)
\r
344 glCullFace(GL_BACK)
\r
346 glDisableClientState(GL_VERTEX_ARRAY)
\r
347 glDisableClientState(GL_NORMAL_ARRAY);
\r
349 def DrawMeshSteep(mesh, angle):
\r
350 cosAngle = math.sin(angle / 180.0 * math.pi)
\r
351 glDisable(GL_LIGHTING)
\r
352 glDepthFunc(GL_EQUAL)
\r
353 for i in xrange(0, int(mesh.vertexCount), 3):
\r
354 if mesh.normal[i][2] < -0.999999:
\r
355 if mesh.vertexes[i+0][2] > 0.01:
\r
357 glBegin(GL_TRIANGLES)
\r
358 glVertex3f(mesh.vertexes[i+0][0], mesh.vertexes[i+0][1], mesh.vertexes[i+0][2])
\r
359 glVertex3f(mesh.vertexes[i+1][0], mesh.vertexes[i+1][1], mesh.vertexes[i+1][2])
\r
360 glVertex3f(mesh.vertexes[i+2][0], mesh.vertexes[i+2][1], mesh.vertexes[i+2][2])
\r
362 elif mesh.normal[i][2] < -cosAngle:
\r
363 glColor3f(-mesh.normal[i][2],0,0)
\r
364 glBegin(GL_TRIANGLES)
\r
365 glVertex3f(mesh.vertexes[i+0][0], mesh.vertexes[i+0][1], mesh.vertexes[i+0][2])
\r
366 glVertex3f(mesh.vertexes[i+1][0], mesh.vertexes[i+1][1], mesh.vertexes[i+1][2])
\r
367 glVertex3f(mesh.vertexes[i+2][0], mesh.vertexes[i+2][1], mesh.vertexes[i+2][2])
\r
369 elif mesh.normal[i][2] > 0.999999:
\r
370 if mesh.vertexes[i+0][2] > 0.01:
\r
372 glBegin(GL_TRIANGLES)
\r
373 glVertex3f(mesh.vertexes[i+0][0], mesh.vertexes[i+0][1], mesh.vertexes[i+0][2])
\r
374 glVertex3f(mesh.vertexes[i+2][0], mesh.vertexes[i+2][1], mesh.vertexes[i+2][2])
\r
375 glVertex3f(mesh.vertexes[i+1][0], mesh.vertexes[i+1][1], mesh.vertexes[i+1][2])
\r
377 elif mesh.normal[i][2] > cosAngle:
\r
378 glColor3f(mesh.normal[i][2],0,0)
\r
379 glBegin(GL_TRIANGLES)
\r
380 glVertex3f(mesh.vertexes[i+0][0], mesh.vertexes[i+0][1], mesh.vertexes[i+0][2])
\r
381 glVertex3f(mesh.vertexes[i+2][0], mesh.vertexes[i+2][1], mesh.vertexes[i+2][2])
\r
382 glVertex3f(mesh.vertexes[i+1][0], mesh.vertexes[i+1][1], mesh.vertexes[i+1][2])
\r
384 glDepthFunc(GL_LESS)
\r
386 def DrawGCodeLayer(layer):
\r
387 filamentRadius = profile.getProfileSettingFloat('filament_diameter') / 2
\r
388 filamentArea = math.pi * filamentRadius * filamentRadius
\r
389 lineWidth = profile.getProfileSettingFloat('nozzle_size') / 2 / 10
\r
392 fillColorCycle = [[0.5,0.5,0.0],[0.0,0.5,0.5],[0.5,0.0,0.5]]
\r
393 moveColor = [0,0,1]
\r
394 retractColor = [1,0,0.5]
\r
395 supportColor = [0,1,1]
\r
396 extrudeColor = [1,0,0]
\r
397 innerWallColor = [0,1,0]
\r
398 skirtColor = [0,0.5,0.5]
\r
399 prevPathWasRetract = False
\r
401 glDisable(GL_CULL_FACE)
\r
403 if path.type == 'move':
\r
404 if prevPathWasRetract:
\r
409 if path.type == 'extrude':
\r
410 if path.pathType == 'FILL':
\r
411 c = fillColorCycle[fillCycle]
\r
412 fillCycle = (fillCycle + 1) % len(fillColorCycle)
\r
413 elif path.pathType == 'WALL-INNER':
\r
416 elif path.pathType == 'SUPPORT':
\r
418 elif path.pathType == 'SKIRT':
\r
422 if path.type == 'retract':
\r
424 if path.type == 'extrude':
\r
427 for i in xrange(0, len(path.list)-1):
\r
429 v1 = path.list[i+1]
\r
431 # Calculate line width from ePerDistance (needs layer thickness and filament diameter)
\r
432 dist = (v0 - v1).vsize()
\r
433 if dist > 0 and path.layerThickness > 0:
\r
434 extrusionMMperDist = (v1.e - v0.e) / dist
\r
435 lineWidth = extrusionMMperDist * filamentArea / path.layerThickness / 2 * v1.extrudeAmountMultiply
\r
437 drawLength += (v0 - v1).vsize()
\r
438 normal = (v0 - v1).cross(util3d.Vector3(0,0,1))
\r
441 vv2 = v0 + normal * lineWidth
\r
442 vv3 = v1 + normal * lineWidth
\r
443 vv0 = v0 - normal * lineWidth
\r
444 vv1 = v1 - normal * lineWidth
\r
448 glVertex3f(vv0.x, vv0.y, vv0.z - zOffset)
\r
449 glVertex3f(vv1.x, vv1.y, vv1.z - zOffset)
\r
450 glVertex3f(vv3.x, vv3.y, vv3.z - zOffset)
\r
451 glVertex3f(vv2.x, vv2.y, vv2.z - zOffset)
\r
453 if prevNormal != None:
\r
454 n = (normal + prevNormal)
\r
456 vv4 = v0 + n * lineWidth
\r
457 vv5 = v0 - n * lineWidth
\r
460 glVertex3f(vv2.x, vv2.y, vv2.z - zOffset)
\r
461 glVertex3f(vv4.x, vv4.y, vv4.z - zOffset)
\r
462 glVertex3f(prevVv3.x, prevVv3.y, prevVv3.z - zOffset)
\r
463 glVertex3f(v0.x, v0.y, v0.z - zOffset)
\r
465 glVertex3f(vv0.x, vv0.y, vv0.z - zOffset)
\r
466 glVertex3f(vv5.x, vv5.y, vv5.z - zOffset)
\r
467 glVertex3f(prevVv1.x, prevVv1.y, prevVv1.z - zOffset)
\r
468 glVertex3f(v0.x, v0.y, v0.z - zOffset)
\r
471 prevNormal = normal
\r
475 glBegin(GL_LINE_STRIP)
\r
477 for v in path.list:
\r
478 glVertex3f(v.x, v.y, v.z)
\r
480 if not path.type == 'move':
\r
481 prevPathWasRetract = False
\r
482 if path.type == 'retract' and path.list[0].almostEqual(path.list[-1]):
\r
483 prevPathWasRetract = True
\r
484 glEnable(GL_CULL_FACE)
\r