chiark / gitweb /
Updated all lineends for py files to unix style.
[cura.git] / Cura / gui / opengl.py
index 8e327a7017f1b44b787ad16a31abe1f4955957f8..78bd8fd4aeeaf3e9de484f6f2932fcbce783b6a3 100644 (file)
-# coding=utf-8\r
-from __future__ import absolute_import\r
-\r
-import math\r
-\r
-from util import meshLoader\r
-from util import util3d\r
-from util import profile\r
-from util.resources import getPathForMesh\r
-\r
-try:\r
-       import OpenGL\r
-\r
-       OpenGL.ERROR_CHECKING = False\r
-       from OpenGL.GLU import *\r
-       from OpenGL.GL import *\r
-\r
-       hasOpenGLlibs = True\r
-except:\r
-       print "Failed to find PyOpenGL: http://pyopengl.sourceforge.net/"\r
-       hasOpenGLlibs = False\r
-\r
-def InitGL(window, view3D, zoom):\r
-       # set viewing projection\r
-       glMatrixMode(GL_MODELVIEW)\r
-       glLoadIdentity()\r
-       size = window.GetSize()\r
-       glViewport(0, 0, size.GetWidth(), size.GetHeight())\r
-\r
-       glLightfv(GL_LIGHT0, GL_POSITION, [0.2, 0.2, 1.0, 0.0])\r
-       glLightfv(GL_LIGHT1, GL_POSITION, [1.0, 1.0, 1.0, 0.0])\r
-\r
-       glEnable(GL_RESCALE_NORMAL)\r
-       glEnable(GL_LIGHTING)\r
-       glEnable(GL_LIGHT0)\r
-       glEnable(GL_DEPTH_TEST)\r
-       glEnable(GL_CULL_FACE)\r
-       glDisable(GL_BLEND)\r
-\r
-       glClearColor(1.0, 1.0, 1.0, 1.0)\r
-       glClearStencil(0)\r
-       glClearDepth(1.0)\r
-\r
-       glMatrixMode(GL_PROJECTION)\r
-       glLoadIdentity()\r
-       aspect = float(size.GetWidth()) / float(size.GetHeight())\r
-       if view3D:\r
-               gluPerspective(45.0, aspect, 1.0, 1000.0)\r
-       else:\r
-               glOrtho(-aspect * (zoom), aspect * (zoom), -1.0 * (zoom), 1.0 * (zoom), -1000.0, 1000.0)\r
-\r
-       glMatrixMode(GL_MODELVIEW)\r
-       glLoadIdentity()\r
-       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)\r
-\r
-platformMesh = None\r
-\r
-def DrawMachine(machineSize):\r
-       if profile.getPreference('machine_type') == 'ultimaker':\r
-               glPushMatrix()\r
-               glEnable(GL_LIGHTING)\r
-               glTranslate(100, 200, -5)\r
-               glLightfv(GL_LIGHT0, GL_DIFFUSE, [0.8, 0.8, 0.8])\r
-               glLightfv(GL_LIGHT0, GL_AMBIENT, [0.5, 0.5, 0.5])\r
-               glEnable(GL_BLEND)\r
-               glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR)\r
-\r
-               global platformMesh\r
-               if platformMesh == None:\r
-                       platformMesh = meshLoader.loadMesh(getPathForMesh('ultimaker_platform.stl'))\r
-                       platformMesh.setRotateMirror(0, False, False, False, False, False)\r
-\r
-               DrawMesh(platformMesh)\r
-               glPopMatrix()\r
-\r
-       glDisable(GL_LIGHTING)\r
-       if False:\r
-               glColor3f(0.7, 0.7, 0.7)\r
-               glLineWidth(2)\r
-               glBegin(GL_LINES)\r
-               for i in xrange(0, int(machineSize.x), 10):\r
-                       glVertex3f(i, 0, 0)\r
-                       glVertex3f(i, machineSize.y, 0)\r
-               for i in xrange(0, int(machineSize.y), 10):\r
-                       glVertex3f(0, i, 0)\r
-                       glVertex3f(machineSize.x, i, 0)\r
-               glEnd()\r
-\r
-               glEnable(GL_LINE_SMOOTH)\r
-               glEnable(GL_BLEND)\r
-               glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)\r
-               glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);\r
-\r
-               glColor3f(0.0, 0.0, 0.0)\r
-               glLineWidth(4)\r
-               glBegin(GL_LINE_LOOP)\r
-               glVertex3f(0, 0, 0)\r
-               glVertex3f(machineSize.x, 0, 0)\r
-               glVertex3f(machineSize.x, machineSize.y, 0)\r
-               glVertex3f(0, machineSize.y, 0)\r
-               glEnd()\r
-\r
-               glLineWidth(2)\r
-               glBegin(GL_LINE_LOOP)\r
-               glVertex3f(0, 0, machineSize.z)\r
-               glVertex3f(machineSize.x, 0, machineSize.z)\r
-               glVertex3f(machineSize.x, machineSize.y, machineSize.z)\r
-               glVertex3f(0, machineSize.y, machineSize.z)\r
-               glEnd()\r
-               glBegin(GL_LINES)\r
-               glVertex3f(0, 0, 0)\r
-               glVertex3f(0, 0, machineSize.z)\r
-               glVertex3f(machineSize.x, 0, 0)\r
-               glVertex3f(machineSize.x, 0, machineSize.z)\r
-               glVertex3f(machineSize.x, machineSize.y, 0)\r
-               glVertex3f(machineSize.x, machineSize.y, machineSize.z)\r
-               glVertex3f(0, machineSize.y, 0)\r
-               glVertex3f(0, machineSize.y, machineSize.z)\r
-               glEnd()\r
-       else:\r
-               glDisable(GL_CULL_FACE)\r
-               glEnable(GL_BLEND)\r
-               glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)\r
-               glColor4ub(5, 171, 231, 127)\r
-               glBegin(GL_QUADS)\r
-               for x in xrange(0, int(machineSize.x), 20):\r
-                       for y in xrange(0, int(machineSize.y), 20):\r
-                               glVertex3f(x, y, -0.01)\r
-                               glVertex3f(min(x + 10, machineSize.x), y, -0.01)\r
-                               glVertex3f(min(x + 10, machineSize.x), min(y + 10, machineSize.y), -0.01)\r
-                               glVertex3f(x, min(y + 10, machineSize.y), -0.01)\r
-               for x in xrange(10, int(machineSize.x), 20):\r
-                       for y in xrange(10, int(machineSize.y), 20):\r
-                               glVertex3f(x, y, -0.01)\r
-                               glVertex3f(min(x + 10, machineSize.x), y, -0.01)\r
-                               glVertex3f(min(x + 10, machineSize.x), min(y + 10, machineSize.y), -0.01)\r
-                               glVertex3f(x, min(y + 10, machineSize.y), -0.01)\r
-               glEnd()\r
-               glColor4ub(5 * 8 / 10, 171 * 8 / 10, 231 * 8 / 10, 128)\r
-               glBegin(GL_QUADS)\r
-               for x in xrange(10, int(machineSize.x), 20):\r
-                       for y in xrange(0, int(machineSize.y), 20):\r
-                               glVertex3f(x, y, -0.01)\r
-                               glVertex3f(min(x + 10, machineSize.x), y, -0.01)\r
-                               glVertex3f(min(x + 10, machineSize.x), min(y + 10, machineSize.y), -0.01)\r
-                               glVertex3f(x, min(y + 10, machineSize.y), -0.01)\r
-               for x in xrange(0, int(machineSize.x), 20):\r
-                       for y in xrange(10, int(machineSize.y), 20):\r
-                               glVertex3f(x, y, -0.01)\r
-                               glVertex3f(min(x + 10, machineSize.x), y, -0.01)\r
-                               glVertex3f(min(x + 10, machineSize.x), min(y + 10, machineSize.y), -0.01)\r
-                               glVertex3f(x, min(y + 10, machineSize.y), -0.01)\r
-               glEnd()\r
-               glEnable(GL_CULL_FACE)\r
-\r
-               glColor4ub(5, 171, 231, 64)\r
-               glBegin(GL_QUADS)\r
-               glVertex3f(0, 0, machineSize.z)\r
-               glVertex3f(0, machineSize.y, machineSize.z)\r
-               glVertex3f(machineSize.x, machineSize.y, machineSize.z)\r
-               glVertex3f(machineSize.x, 0, machineSize.z)\r
-               glEnd()\r
-\r
-               glColor4ub(5, 171, 231, 96)\r
-               glBegin(GL_QUADS)\r
-               glVertex3f(0, 0, 0)\r
-               glVertex3f(0, 0, machineSize.z)\r
-               glVertex3f(machineSize.x, 0, machineSize.z)\r
-               glVertex3f(machineSize.x, 0, 0)\r
-\r
-               glVertex3f(0, machineSize.y, machineSize.z)\r
-               glVertex3f(0, machineSize.y, 0)\r
-               glVertex3f(machineSize.x, machineSize.y, 0)\r
-               glVertex3f(machineSize.x, machineSize.y, machineSize.z)\r
-               glEnd()\r
-\r
-               glColor4ub(5, 171, 231, 128)\r
-               glBegin(GL_QUADS)\r
-               glVertex3f(0, 0, machineSize.z)\r
-               glVertex3f(0, 0, 0)\r
-               glVertex3f(0, machineSize.y, 0)\r
-               glVertex3f(0, machineSize.y, machineSize.z)\r
-\r
-               glVertex3f(machineSize.x, 0, 0)\r
-               glVertex3f(machineSize.x, 0, machineSize.z)\r
-               glVertex3f(machineSize.x, machineSize.y, machineSize.z)\r
-               glVertex3f(machineSize.x, machineSize.y, 0)\r
-               glEnd()\r
-\r
-               glDisable(GL_BLEND)\r
-\r
-       glPushMatrix()\r
-       glTranslate(5, 5, 2)\r
-       glLineWidth(2)\r
-       glColor3f(0.5, 0, 0)\r
-       glBegin(GL_LINES)\r
-       glVertex3f(0, 0, 0)\r
-       glVertex3f(20, 0, 0)\r
-       glEnd()\r
-       glColor3f(0, 0.5, 0)\r
-       glBegin(GL_LINES)\r
-       glVertex3f(0, 0, 0)\r
-       glVertex3f(0, 20, 0)\r
-       glEnd()\r
-       glColor3f(0, 0, 0.5)\r
-       glBegin(GL_LINES)\r
-       glVertex3f(0, 0, 0)\r
-       glVertex3f(0, 0, 20)\r
-       glEnd()\r
-\r
-       glDisable(GL_DEPTH_TEST)\r
-       #X\r
-       glColor3f(1, 0, 0)\r
-       glPushMatrix()\r
-       glTranslate(23, 0, 0)\r
-       noZ = ResetMatrixRotationAndScale()\r
-       glBegin(GL_LINES)\r
-       glVertex3f(-0.8, 1, 0)\r
-       glVertex3f(0.8, -1, 0)\r
-       glVertex3f(0.8, 1, 0)\r
-       glVertex3f(-0.8, -1, 0)\r
-       glEnd()\r
-       glPopMatrix()\r
-\r
-       #Y\r
-       glColor3f(0, 1, 0)\r
-       glPushMatrix()\r
-       glTranslate(0, 23, 0)\r
-       ResetMatrixRotationAndScale()\r
-       glBegin(GL_LINES)\r
-       glVertex3f(-0.8, 1, 0)\r
-       glVertex3f(0.0, 0, 0)\r
-       glVertex3f(0.8, 1, 0)\r
-       glVertex3f(-0.8, -1, 0)\r
-       glEnd()\r
-       glPopMatrix()\r
-\r
-       #Z\r
-       if not noZ:\r
-               glColor3f(0, 0, 1)\r
-               glPushMatrix()\r
-               glTranslate(0, 0, 23)\r
-               ResetMatrixRotationAndScale()\r
-               glBegin(GL_LINES)\r
-               glVertex3f(-0.8, 1, 0)\r
-               glVertex3f(0.8, 1, 0)\r
-               glVertex3f(0.8, 1, 0)\r
-               glVertex3f(-0.8, -1, 0)\r
-               glVertex3f(-0.8, -1, 0)\r
-               glVertex3f(0.8, -1, 0)\r
-               glEnd()\r
-               glPopMatrix()\r
-\r
-       glPopMatrix()\r
-       glEnable(GL_DEPTH_TEST)\r
-\r
-\r
-def ResetMatrixRotationAndScale():\r
-       matrix = glGetFloatv(GL_MODELVIEW_MATRIX)\r
-       noZ = False\r
-       if matrix[3][2] > 0:\r
-               return False\r
-       scale2D = matrix[0][0]\r
-       matrix[0][0] = 1.0\r
-       matrix[1][0] = 0.0\r
-       matrix[2][0] = 0.0\r
-       matrix[0][1] = 0.0\r
-       matrix[1][1] = 1.0\r
-       matrix[2][1] = 0.0\r
-       matrix[0][2] = 0.0\r
-       matrix[1][2] = 0.0\r
-       matrix[2][2] = 1.0\r
-\r
-       if matrix[3][2] != 0.0:\r
-               matrix[3][0] = matrix[3][0] / (-matrix[3][2] / 100)\r
-               matrix[3][1] = matrix[3][1] / (-matrix[3][2] / 100)\r
-               matrix[3][2] = -100\r
-       else:\r
-               matrix[0][0] = scale2D\r
-               matrix[1][1] = scale2D\r
-               matrix[2][2] = scale2D\r
-               matrix[3][2] = -100\r
-               noZ = True\r
-\r
-       glLoadMatrixf(matrix)\r
-       return noZ\r
-\r
-\r
-def DrawBox(vMin, vMax):\r
-       glBegin(GL_LINE_LOOP)\r
-       glVertex3f(vMin[0], vMin[1], vMin[2])\r
-       glVertex3f(vMax[0], vMin[1], vMin[2])\r
-       glVertex3f(vMax[0], vMax[1], vMin[2])\r
-       glVertex3f(vMin[0], vMax[1], vMin[2])\r
-       glEnd()\r
-\r
-       glBegin(GL_LINE_LOOP)\r
-       glVertex3f(vMin[0], vMin[1], vMax[2])\r
-       glVertex3f(vMax[0], vMin[1], vMax[2])\r
-       glVertex3f(vMax[0], vMax[1], vMax[2])\r
-       glVertex3f(vMin[0], vMax[1], vMax[2])\r
-       glEnd()\r
-       glBegin(GL_LINES)\r
-       glVertex3f(vMin[0], vMin[1], vMin[2])\r
-       glVertex3f(vMin[0], vMin[1], vMax[2])\r
-       glVertex3f(vMax[0], vMin[1], vMin[2])\r
-       glVertex3f(vMax[0], vMin[1], vMax[2])\r
-       glVertex3f(vMax[0], vMax[1], vMin[2])\r
-       glVertex3f(vMax[0], vMax[1], vMax[2])\r
-       glVertex3f(vMin[0], vMax[1], vMin[2])\r
-       glVertex3f(vMin[0], vMax[1], vMax[2])\r
-       glEnd()\r
-\r
-\r
-def DrawMeshOutline(mesh):\r
-       glEnable(GL_CULL_FACE)\r
-       glEnableClientState(GL_VERTEX_ARRAY);\r
-       glVertexPointer(3, GL_FLOAT, 0, mesh.vertexes)\r
-\r
-       glCullFace(GL_FRONT)\r
-       glLineWidth(3)\r
-       glPolygonMode(GL_BACK, GL_LINE)\r
-       glDrawArrays(GL_TRIANGLES, 0, mesh.vertexCount)\r
-       glPolygonMode(GL_BACK, GL_FILL)\r
-       glCullFace(GL_BACK)\r
-\r
-       glDisableClientState(GL_VERTEX_ARRAY)\r
-\r
-\r
-def DrawMesh(mesh):\r
-       glEnable(GL_CULL_FACE)\r
-       glEnableClientState(GL_VERTEX_ARRAY);\r
-       glEnableClientState(GL_NORMAL_ARRAY);\r
-       glVertexPointer(3, GL_FLOAT, 0, mesh.vertexes)\r
-       glNormalPointer(GL_FLOAT, 0, mesh.normal)\r
-\r
-       #Odd, drawing in batchs is a LOT faster then drawing it all at once.\r
-       batchSize = 999    #Warning, batchSize needs to be dividable by 3\r
-       extraStartPos = int(mesh.vertexCount / batchSize) * batchSize\r
-       extraCount = mesh.vertexCount - extraStartPos\r
-\r
-       glCullFace(GL_BACK)\r
-       for i in xrange(0, int(mesh.vertexCount / batchSize)):\r
-               glDrawArrays(GL_TRIANGLES, i * batchSize, batchSize)\r
-       glDrawArrays(GL_TRIANGLES, extraStartPos, extraCount)\r
-\r
-       glCullFace(GL_FRONT)\r
-       glNormalPointer(GL_FLOAT, 0, mesh.invNormal)\r
-       for i in xrange(0, int(mesh.vertexCount / batchSize)):\r
-               glDrawArrays(GL_TRIANGLES, i * batchSize, batchSize)\r
-       extraStartPos = int(mesh.vertexCount / batchSize) * batchSize\r
-       extraCount = mesh.vertexCount - extraStartPos\r
-       glDrawArrays(GL_TRIANGLES, extraStartPos, extraCount)\r
-       glCullFace(GL_BACK)\r
-\r
-       glDisableClientState(GL_VERTEX_ARRAY)\r
-       glDisableClientState(GL_NORMAL_ARRAY);\r
-\r
-\r
-def DrawMeshSteep(mesh, angle):\r
-       cosAngle = math.sin(angle / 180.0 * math.pi)\r
-       glDisable(GL_LIGHTING)\r
-       glDepthFunc(GL_EQUAL)\r
-       for i in xrange(0, int(mesh.vertexCount), 3):\r
-               if mesh.normal[i][2] < -0.999999:\r
-                       if mesh.vertexes[i + 0][2] > 0.01:\r
-                               glColor3f(0.5, 0, 0)\r
-                               glBegin(GL_TRIANGLES)\r
-                               glVertex3f(mesh.vertexes[i + 0][0], mesh.vertexes[i + 0][1], mesh.vertexes[i + 0][2])\r
-                               glVertex3f(mesh.vertexes[i + 1][0], mesh.vertexes[i + 1][1], mesh.vertexes[i + 1][2])\r
-                               glVertex3f(mesh.vertexes[i + 2][0], mesh.vertexes[i + 2][1], mesh.vertexes[i + 2][2])\r
-                               glEnd()\r
-               elif mesh.normal[i][2] < -cosAngle:\r
-                       glColor3f(-mesh.normal[i][2], 0, 0)\r
-                       glBegin(GL_TRIANGLES)\r
-                       glVertex3f(mesh.vertexes[i + 0][0], mesh.vertexes[i + 0][1], mesh.vertexes[i + 0][2])\r
-                       glVertex3f(mesh.vertexes[i + 1][0], mesh.vertexes[i + 1][1], mesh.vertexes[i + 1][2])\r
-                       glVertex3f(mesh.vertexes[i + 2][0], mesh.vertexes[i + 2][1], mesh.vertexes[i + 2][2])\r
-                       glEnd()\r
-               elif mesh.normal[i][2] > 0.999999:\r
-                       if mesh.vertexes[i + 0][2] > 0.01:\r
-                               glColor3f(0.5, 0, 0)\r
-                               glBegin(GL_TRIANGLES)\r
-                               glVertex3f(mesh.vertexes[i + 0][0], mesh.vertexes[i + 0][1], mesh.vertexes[i + 0][2])\r
-                               glVertex3f(mesh.vertexes[i + 2][0], mesh.vertexes[i + 2][1], mesh.vertexes[i + 2][2])\r
-                               glVertex3f(mesh.vertexes[i + 1][0], mesh.vertexes[i + 1][1], mesh.vertexes[i + 1][2])\r
-                               glEnd()\r
-               elif mesh.normal[i][2] > cosAngle:\r
-                       glColor3f(mesh.normal[i][2], 0, 0)\r
-                       glBegin(GL_TRIANGLES)\r
-                       glVertex3f(mesh.vertexes[i + 0][0], mesh.vertexes[i + 0][1], mesh.vertexes[i + 0][2])\r
-                       glVertex3f(mesh.vertexes[i + 2][0], mesh.vertexes[i + 2][1], mesh.vertexes[i + 2][2])\r
-                       glVertex3f(mesh.vertexes[i + 1][0], mesh.vertexes[i + 1][1], mesh.vertexes[i + 1][2])\r
-                       glEnd()\r
-       glDepthFunc(GL_LESS)\r
-\r
-\r
-def DrawGCodeLayer(layer):\r
-       filamentRadius = profile.getProfileSettingFloat('filament_diameter') / 2\r
-       filamentArea = math.pi * filamentRadius * filamentRadius\r
-       lineWidth = profile.getProfileSettingFloat('nozzle_size') / 2 / 10\r
-\r
-       fillCycle = 0\r
-       fillColorCycle = [[0.5, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.5]]\r
-       moveColor = [0, 0, 1]\r
-       retractColor = [1, 0, 0.5]\r
-       supportColor = [0, 1, 1]\r
-       extrudeColor = [1, 0, 0]\r
-       innerWallColor = [0, 1, 0]\r
-       skirtColor = [0, 0.5, 0.5]\r
-       prevPathWasRetract = False\r
-\r
-       glDisable(GL_CULL_FACE)\r
-       for path in layer:\r
-               if path.type == 'move':\r
-                       if prevPathWasRetract:\r
-                               c = retractColor\r
-                       else:\r
-                               c = moveColor\r
-               zOffset = 0.01\r
-               if path.type == 'extrude':\r
-                       if path.pathType == 'FILL':\r
-                               c = fillColorCycle[fillCycle]\r
-                               fillCycle = (fillCycle + 1) % len(fillColorCycle)\r
-                       elif path.pathType == 'WALL-INNER':\r
-                               c = innerWallColor\r
-                               zOffset = 0.02\r
-                       elif path.pathType == 'SUPPORT':\r
-                               c = supportColor\r
-                       elif path.pathType == 'SKIRT':\r
-                               c = skirtColor\r
-                       else:\r
-                               c = extrudeColor\r
-               if path.type == 'retract':\r
-                       c = [0, 1, 1]\r
-               if path.type == 'extrude':\r
-                       drawLength = 0.0\r
-                       prevNormal = None\r
-                       for i in xrange(0, len(path.list) - 1):\r
-                               v0 = path.list[i]\r
-                               v1 = path.list[i + 1]\r
-\r
-                               # Calculate line width from ePerDistance (needs layer thickness and filament diameter)\r
-                               dist = (v0 - v1).vsize()\r
-                               if dist > 0 and path.layerThickness > 0:\r
-                                       extrusionMMperDist = (v1.e - v0.e) / dist\r
-                                       lineWidth = extrusionMMperDist * filamentArea / path.layerThickness / 2 * v1.extrudeAmountMultiply\r
-\r
-                               drawLength += (v0 - v1).vsize()\r
-                               normal = (v0 - v1).cross(util3d.Vector3(0, 0, 1))\r
-                               normal.normalize()\r
-\r
-                               vv2 = v0 + normal * lineWidth\r
-                               vv3 = v1 + normal * lineWidth\r
-                               vv0 = v0 - normal * lineWidth\r
-                               vv1 = v1 - normal * lineWidth\r
-\r
-                               glBegin(GL_QUADS)\r
-                               glColor3fv(c)\r
-                               glVertex3f(vv0.x, vv0.y, vv0.z - zOffset)\r
-                               glVertex3f(vv1.x, vv1.y, vv1.z - zOffset)\r
-                               glVertex3f(vv3.x, vv3.y, vv3.z - zOffset)\r
-                               glVertex3f(vv2.x, vv2.y, vv2.z - zOffset)\r
-                               glEnd()\r
-                               if prevNormal != None:\r
-                                       n = (normal + prevNormal)\r
-                                       n.normalize()\r
-                                       vv4 = v0 + n * lineWidth\r
-                                       vv5 = v0 - n * lineWidth\r
-                                       glBegin(GL_QUADS)\r
-                                       glColor3fv(c)\r
-                                       glVertex3f(vv2.x, vv2.y, vv2.z - zOffset)\r
-                                       glVertex3f(vv4.x, vv4.y, vv4.z - zOffset)\r
-                                       glVertex3f(prevVv3.x, prevVv3.y, prevVv3.z - zOffset)\r
-                                       glVertex3f(v0.x, v0.y, v0.z - zOffset)\r
-\r
-                                       glVertex3f(vv0.x, vv0.y, vv0.z - zOffset)\r
-                                       glVertex3f(vv5.x, vv5.y, vv5.z - zOffset)\r
-                                       glVertex3f(prevVv1.x, prevVv1.y, prevVv1.z - zOffset)\r
-                                       glVertex3f(v0.x, v0.y, v0.z - zOffset)\r
-                                       glEnd()\r
-\r
-                               prevNormal = normal\r
-                               prevVv1 = vv1\r
-                               prevVv3 = vv3\r
-               else:\r
-                       glBegin(GL_LINE_STRIP)\r
-                       glColor3fv(c)\r
-                       for v in path.list:\r
-                               glVertex3f(v.x, v.y, v.z)\r
-                       glEnd()\r
-               if not path.type == 'move':\r
-                       prevPathWasRetract = False\r
-               if path.type == 'retract' and path.list[0].almostEqual(path.list[-1]):\r
-                       prevPathWasRetract = True\r
-       glEnable(GL_CULL_FACE)\r
+# coding=utf-8
+from __future__ import absolute_import
+
+import math
+
+from util import meshLoader
+from util import util3d
+from util import profile
+from util.resources import getPathForMesh
+
+try:
+       import OpenGL
+
+       OpenGL.ERROR_CHECKING = False
+       from OpenGL.GLU import *
+       from OpenGL.GL import *
+
+       hasOpenGLlibs = True
+except:
+       print "Failed to find PyOpenGL: http://pyopengl.sourceforge.net/"
+       hasOpenGLlibs = False
+
+def InitGL(window, view3D, zoom):
+       # set viewing projection
+       glMatrixMode(GL_MODELVIEW)
+       glLoadIdentity()
+       size = window.GetSize()
+       glViewport(0, 0, size.GetWidth(), size.GetHeight())
+
+       glLightfv(GL_LIGHT0, GL_POSITION, [0.2, 0.2, 1.0, 0.0])
+       glLightfv(GL_LIGHT1, GL_POSITION, [1.0, 1.0, 1.0, 0.0])
+
+       glEnable(GL_RESCALE_NORMAL)
+       glEnable(GL_LIGHTING)
+       glEnable(GL_LIGHT0)
+       glEnable(GL_DEPTH_TEST)
+       glEnable(GL_CULL_FACE)
+       glDisable(GL_BLEND)
+
+       glClearColor(1.0, 1.0, 1.0, 1.0)
+       glClearStencil(0)
+       glClearDepth(1.0)
+
+       glMatrixMode(GL_PROJECTION)
+       glLoadIdentity()
+       aspect = float(size.GetWidth()) / float(size.GetHeight())
+       if view3D:
+               gluPerspective(45.0, aspect, 1.0, 1000.0)
+       else:
+               glOrtho(-aspect * (zoom), aspect * (zoom), -1.0 * (zoom), 1.0 * (zoom), -1000.0, 1000.0)
+
+       glMatrixMode(GL_MODELVIEW)
+       glLoadIdentity()
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)
+
+platformMesh = None
+
+def DrawMachine(machineSize):
+       if profile.getPreference('machine_type') == 'ultimaker':
+               glPushMatrix()
+               glEnable(GL_LIGHTING)
+               glTranslate(100, 200, -5)
+               glLightfv(GL_LIGHT0, GL_DIFFUSE, [0.8, 0.8, 0.8])
+               glLightfv(GL_LIGHT0, GL_AMBIENT, [0.5, 0.5, 0.5])
+               glEnable(GL_BLEND)
+               glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR)
+
+               global platformMesh
+               if platformMesh == None:
+                       platformMesh = meshLoader.loadMesh(getPathForMesh('ultimaker_platform.stl'))
+                       platformMesh.setRotateMirror(0, False, False, False, False, False)
+
+               DrawMesh(platformMesh)
+               glPopMatrix()
+
+       glDisable(GL_LIGHTING)
+       if False:
+               glColor3f(0.7, 0.7, 0.7)
+               glLineWidth(2)
+               glBegin(GL_LINES)
+               for i in xrange(0, int(machineSize.x), 10):
+                       glVertex3f(i, 0, 0)
+                       glVertex3f(i, machineSize.y, 0)
+               for i in xrange(0, int(machineSize.y), 10):
+                       glVertex3f(0, i, 0)
+                       glVertex3f(machineSize.x, i, 0)
+               glEnd()
+
+               glEnable(GL_LINE_SMOOTH)
+               glEnable(GL_BLEND)
+               glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
+               glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
+
+               glColor3f(0.0, 0.0, 0.0)
+               glLineWidth(4)
+               glBegin(GL_LINE_LOOP)
+               glVertex3f(0, 0, 0)
+               glVertex3f(machineSize.x, 0, 0)
+               glVertex3f(machineSize.x, machineSize.y, 0)
+               glVertex3f(0, machineSize.y, 0)
+               glEnd()
+
+               glLineWidth(2)
+               glBegin(GL_LINE_LOOP)
+               glVertex3f(0, 0, machineSize.z)
+               glVertex3f(machineSize.x, 0, machineSize.z)
+               glVertex3f(machineSize.x, machineSize.y, machineSize.z)
+               glVertex3f(0, machineSize.y, machineSize.z)
+               glEnd()
+               glBegin(GL_LINES)
+               glVertex3f(0, 0, 0)
+               glVertex3f(0, 0, machineSize.z)
+               glVertex3f(machineSize.x, 0, 0)
+               glVertex3f(machineSize.x, 0, machineSize.z)
+               glVertex3f(machineSize.x, machineSize.y, 0)
+               glVertex3f(machineSize.x, machineSize.y, machineSize.z)
+               glVertex3f(0, machineSize.y, 0)
+               glVertex3f(0, machineSize.y, machineSize.z)
+               glEnd()
+       else:
+               glDisable(GL_CULL_FACE)
+               glEnable(GL_BLEND)
+               glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
+               glColor4ub(5, 171, 231, 127)
+               glBegin(GL_QUADS)
+               for x in xrange(0, int(machineSize.x), 20):
+                       for y in xrange(0, int(machineSize.y), 20):
+                               glVertex3f(x, y, -0.01)
+                               glVertex3f(min(x + 10, machineSize.x), y, -0.01)
+                               glVertex3f(min(x + 10, machineSize.x), min(y + 10, machineSize.y), -0.01)
+                               glVertex3f(x, min(y + 10, machineSize.y), -0.01)
+               for x in xrange(10, int(machineSize.x), 20):
+                       for y in xrange(10, int(machineSize.y), 20):
+                               glVertex3f(x, y, -0.01)
+                               glVertex3f(min(x + 10, machineSize.x), y, -0.01)
+                               glVertex3f(min(x + 10, machineSize.x), min(y + 10, machineSize.y), -0.01)
+                               glVertex3f(x, min(y + 10, machineSize.y), -0.01)
+               glEnd()
+               glColor4ub(5 * 8 / 10, 171 * 8 / 10, 231 * 8 / 10, 128)
+               glBegin(GL_QUADS)
+               for x in xrange(10, int(machineSize.x), 20):
+                       for y in xrange(0, int(machineSize.y), 20):
+                               glVertex3f(x, y, -0.01)
+                               glVertex3f(min(x + 10, machineSize.x), y, -0.01)
+                               glVertex3f(min(x + 10, machineSize.x), min(y + 10, machineSize.y), -0.01)
+                               glVertex3f(x, min(y + 10, machineSize.y), -0.01)
+               for x in xrange(0, int(machineSize.x), 20):
+                       for y in xrange(10, int(machineSize.y), 20):
+                               glVertex3f(x, y, -0.01)
+                               glVertex3f(min(x + 10, machineSize.x), y, -0.01)
+                               glVertex3f(min(x + 10, machineSize.x), min(y + 10, machineSize.y), -0.01)
+                               glVertex3f(x, min(y + 10, machineSize.y), -0.01)
+               glEnd()
+               glEnable(GL_CULL_FACE)
+
+               glColor4ub(5, 171, 231, 64)
+               glBegin(GL_QUADS)
+               glVertex3f(0, 0, machineSize.z)
+               glVertex3f(0, machineSize.y, machineSize.z)
+               glVertex3f(machineSize.x, machineSize.y, machineSize.z)
+               glVertex3f(machineSize.x, 0, machineSize.z)
+               glEnd()
+
+               glColor4ub(5, 171, 231, 96)
+               glBegin(GL_QUADS)
+               glVertex3f(0, 0, 0)
+               glVertex3f(0, 0, machineSize.z)
+               glVertex3f(machineSize.x, 0, machineSize.z)
+               glVertex3f(machineSize.x, 0, 0)
+
+               glVertex3f(0, machineSize.y, machineSize.z)
+               glVertex3f(0, machineSize.y, 0)
+               glVertex3f(machineSize.x, machineSize.y, 0)
+               glVertex3f(machineSize.x, machineSize.y, machineSize.z)
+               glEnd()
+
+               glColor4ub(5, 171, 231, 128)
+               glBegin(GL_QUADS)
+               glVertex3f(0, 0, machineSize.z)
+               glVertex3f(0, 0, 0)
+               glVertex3f(0, machineSize.y, 0)
+               glVertex3f(0, machineSize.y, machineSize.z)
+
+               glVertex3f(machineSize.x, 0, 0)
+               glVertex3f(machineSize.x, 0, machineSize.z)
+               glVertex3f(machineSize.x, machineSize.y, machineSize.z)
+               glVertex3f(machineSize.x, machineSize.y, 0)
+               glEnd()
+
+               glDisable(GL_BLEND)
+
+       glPushMatrix()
+       glTranslate(5, 5, 2)
+       glLineWidth(2)
+       glColor3f(0.5, 0, 0)
+       glBegin(GL_LINES)
+       glVertex3f(0, 0, 0)
+       glVertex3f(20, 0, 0)
+       glEnd()
+       glColor3f(0, 0.5, 0)
+       glBegin(GL_LINES)
+       glVertex3f(0, 0, 0)
+       glVertex3f(0, 20, 0)
+       glEnd()
+       glColor3f(0, 0, 0.5)
+       glBegin(GL_LINES)
+       glVertex3f(0, 0, 0)
+       glVertex3f(0, 0, 20)
+       glEnd()
+
+       glDisable(GL_DEPTH_TEST)
+       #X
+       glColor3f(1, 0, 0)
+       glPushMatrix()
+       glTranslate(23, 0, 0)
+       noZ = ResetMatrixRotationAndScale()
+       glBegin(GL_LINES)
+       glVertex3f(-0.8, 1, 0)
+       glVertex3f(0.8, -1, 0)
+       glVertex3f(0.8, 1, 0)
+       glVertex3f(-0.8, -1, 0)
+       glEnd()
+       glPopMatrix()
+
+       #Y
+       glColor3f(0, 1, 0)
+       glPushMatrix()
+       glTranslate(0, 23, 0)
+       ResetMatrixRotationAndScale()
+       glBegin(GL_LINES)
+       glVertex3f(-0.8, 1, 0)
+       glVertex3f(0.0, 0, 0)
+       glVertex3f(0.8, 1, 0)
+       glVertex3f(-0.8, -1, 0)
+       glEnd()
+       glPopMatrix()
+
+       #Z
+       if not noZ:
+               glColor3f(0, 0, 1)
+               glPushMatrix()
+               glTranslate(0, 0, 23)
+               ResetMatrixRotationAndScale()
+               glBegin(GL_LINES)
+               glVertex3f(-0.8, 1, 0)
+               glVertex3f(0.8, 1, 0)
+               glVertex3f(0.8, 1, 0)
+               glVertex3f(-0.8, -1, 0)
+               glVertex3f(-0.8, -1, 0)
+               glVertex3f(0.8, -1, 0)
+               glEnd()
+               glPopMatrix()
+
+       glPopMatrix()
+       glEnable(GL_DEPTH_TEST)
+
+
+def ResetMatrixRotationAndScale():
+       matrix = glGetFloatv(GL_MODELVIEW_MATRIX)
+       noZ = False
+       if matrix[3][2] > 0:
+               return False
+       scale2D = matrix[0][0]
+       matrix[0][0] = 1.0
+       matrix[1][0] = 0.0
+       matrix[2][0] = 0.0
+       matrix[0][1] = 0.0
+       matrix[1][1] = 1.0
+       matrix[2][1] = 0.0
+       matrix[0][2] = 0.0
+       matrix[1][2] = 0.0
+       matrix[2][2] = 1.0
+
+       if matrix[3][2] != 0.0:
+               matrix[3][0] = matrix[3][0] / (-matrix[3][2] / 100)
+               matrix[3][1] = matrix[3][1] / (-matrix[3][2] / 100)
+               matrix[3][2] = -100
+       else:
+               matrix[0][0] = scale2D
+               matrix[1][1] = scale2D
+               matrix[2][2] = scale2D
+               matrix[3][2] = -100
+               noZ = True
+
+       glLoadMatrixf(matrix)
+       return noZ
+
+
+def DrawBox(vMin, vMax):
+       glBegin(GL_LINE_LOOP)
+       glVertex3f(vMin[0], vMin[1], vMin[2])
+       glVertex3f(vMax[0], vMin[1], vMin[2])
+       glVertex3f(vMax[0], vMax[1], vMin[2])
+       glVertex3f(vMin[0], vMax[1], vMin[2])
+       glEnd()
+
+       glBegin(GL_LINE_LOOP)
+       glVertex3f(vMin[0], vMin[1], vMax[2])
+       glVertex3f(vMax[0], vMin[1], vMax[2])
+       glVertex3f(vMax[0], vMax[1], vMax[2])
+       glVertex3f(vMin[0], vMax[1], vMax[2])
+       glEnd()
+       glBegin(GL_LINES)
+       glVertex3f(vMin[0], vMin[1], vMin[2])
+       glVertex3f(vMin[0], vMin[1], vMax[2])
+       glVertex3f(vMax[0], vMin[1], vMin[2])
+       glVertex3f(vMax[0], vMin[1], vMax[2])
+       glVertex3f(vMax[0], vMax[1], vMin[2])
+       glVertex3f(vMax[0], vMax[1], vMax[2])
+       glVertex3f(vMin[0], vMax[1], vMin[2])
+       glVertex3f(vMin[0], vMax[1], vMax[2])
+       glEnd()
+
+
+def DrawMeshOutline(mesh):
+       glEnable(GL_CULL_FACE)
+       glEnableClientState(GL_VERTEX_ARRAY);
+       glVertexPointer(3, GL_FLOAT, 0, mesh.vertexes)
+
+       glCullFace(GL_FRONT)
+       glLineWidth(3)
+       glPolygonMode(GL_BACK, GL_LINE)
+       glDrawArrays(GL_TRIANGLES, 0, mesh.vertexCount)
+       glPolygonMode(GL_BACK, GL_FILL)
+       glCullFace(GL_BACK)
+
+       glDisableClientState(GL_VERTEX_ARRAY)
+
+
+def DrawMesh(mesh):
+       glEnable(GL_CULL_FACE)
+       glEnableClientState(GL_VERTEX_ARRAY);
+       glEnableClientState(GL_NORMAL_ARRAY);
+       glVertexPointer(3, GL_FLOAT, 0, mesh.vertexes)
+       glNormalPointer(GL_FLOAT, 0, mesh.normal)
+
+       #Odd, drawing in batchs is a LOT faster then drawing it all at once.
+       batchSize = 999    #Warning, batchSize needs to be dividable by 3
+       extraStartPos = int(mesh.vertexCount / batchSize) * batchSize
+       extraCount = mesh.vertexCount - extraStartPos
+
+       glCullFace(GL_BACK)
+       for i in xrange(0, int(mesh.vertexCount / batchSize)):
+               glDrawArrays(GL_TRIANGLES, i * batchSize, batchSize)
+       glDrawArrays(GL_TRIANGLES, extraStartPos, extraCount)
+
+       glCullFace(GL_FRONT)
+       glNormalPointer(GL_FLOAT, 0, mesh.invNormal)
+       for i in xrange(0, int(mesh.vertexCount / batchSize)):
+               glDrawArrays(GL_TRIANGLES, i * batchSize, batchSize)
+       extraStartPos = int(mesh.vertexCount / batchSize) * batchSize
+       extraCount = mesh.vertexCount - extraStartPos
+       glDrawArrays(GL_TRIANGLES, extraStartPos, extraCount)
+       glCullFace(GL_BACK)
+
+       glDisableClientState(GL_VERTEX_ARRAY)
+       glDisableClientState(GL_NORMAL_ARRAY);
+
+
+def DrawMeshSteep(mesh, angle):
+       cosAngle = math.sin(angle / 180.0 * math.pi)
+       glDisable(GL_LIGHTING)
+       glDepthFunc(GL_EQUAL)
+       for i in xrange(0, int(mesh.vertexCount), 3):
+               if mesh.normal[i][2] < -0.999999:
+                       if mesh.vertexes[i + 0][2] > 0.01:
+                               glColor3f(0.5, 0, 0)
+                               glBegin(GL_TRIANGLES)
+                               glVertex3f(mesh.vertexes[i + 0][0], mesh.vertexes[i + 0][1], mesh.vertexes[i + 0][2])
+                               glVertex3f(mesh.vertexes[i + 1][0], mesh.vertexes[i + 1][1], mesh.vertexes[i + 1][2])
+                               glVertex3f(mesh.vertexes[i + 2][0], mesh.vertexes[i + 2][1], mesh.vertexes[i + 2][2])
+                               glEnd()
+               elif mesh.normal[i][2] < -cosAngle:
+                       glColor3f(-mesh.normal[i][2], 0, 0)
+                       glBegin(GL_TRIANGLES)
+                       glVertex3f(mesh.vertexes[i + 0][0], mesh.vertexes[i + 0][1], mesh.vertexes[i + 0][2])
+                       glVertex3f(mesh.vertexes[i + 1][0], mesh.vertexes[i + 1][1], mesh.vertexes[i + 1][2])
+                       glVertex3f(mesh.vertexes[i + 2][0], mesh.vertexes[i + 2][1], mesh.vertexes[i + 2][2])
+                       glEnd()
+               elif mesh.normal[i][2] > 0.999999:
+                       if mesh.vertexes[i + 0][2] > 0.01:
+                               glColor3f(0.5, 0, 0)
+                               glBegin(GL_TRIANGLES)
+                               glVertex3f(mesh.vertexes[i + 0][0], mesh.vertexes[i + 0][1], mesh.vertexes[i + 0][2])
+                               glVertex3f(mesh.vertexes[i + 2][0], mesh.vertexes[i + 2][1], mesh.vertexes[i + 2][2])
+                               glVertex3f(mesh.vertexes[i + 1][0], mesh.vertexes[i + 1][1], mesh.vertexes[i + 1][2])
+                               glEnd()
+               elif mesh.normal[i][2] > cosAngle:
+                       glColor3f(mesh.normal[i][2], 0, 0)
+                       glBegin(GL_TRIANGLES)
+                       glVertex3f(mesh.vertexes[i + 0][0], mesh.vertexes[i + 0][1], mesh.vertexes[i + 0][2])
+                       glVertex3f(mesh.vertexes[i + 2][0], mesh.vertexes[i + 2][1], mesh.vertexes[i + 2][2])
+                       glVertex3f(mesh.vertexes[i + 1][0], mesh.vertexes[i + 1][1], mesh.vertexes[i + 1][2])
+                       glEnd()
+       glDepthFunc(GL_LESS)
+
+
+def DrawGCodeLayer(layer):
+       filamentRadius = profile.getProfileSettingFloat('filament_diameter') / 2
+       filamentArea = math.pi * filamentRadius * filamentRadius
+       lineWidth = profile.getProfileSettingFloat('nozzle_size') / 2 / 10
+
+       fillCycle = 0
+       fillColorCycle = [[0.5, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.5]]
+       moveColor = [0, 0, 1]
+       retractColor = [1, 0, 0.5]
+       supportColor = [0, 1, 1]
+       extrudeColor = [1, 0, 0]
+       innerWallColor = [0, 1, 0]
+       skirtColor = [0, 0.5, 0.5]
+       prevPathWasRetract = False
+
+       glDisable(GL_CULL_FACE)
+       for path in layer:
+               if path.type == 'move':
+                       if prevPathWasRetract:
+                               c = retractColor
+                       else:
+                               c = moveColor
+               zOffset = 0.01
+               if path.type == 'extrude':
+                       if path.pathType == 'FILL':
+                               c = fillColorCycle[fillCycle]
+                               fillCycle = (fillCycle + 1) % len(fillColorCycle)
+                       elif path.pathType == 'WALL-INNER':
+                               c = innerWallColor
+                               zOffset = 0.02
+                       elif path.pathType == 'SUPPORT':
+                               c = supportColor
+                       elif path.pathType == 'SKIRT':
+                               c = skirtColor
+                       else:
+                               c = extrudeColor
+               if path.type == 'retract':
+                       c = [0, 1, 1]
+               if path.type == 'extrude':
+                       drawLength = 0.0
+                       prevNormal = None
+                       for i in xrange(0, len(path.list) - 1):
+                               v0 = path.list[i]
+                               v1 = path.list[i + 1]
+
+                               # Calculate line width from ePerDistance (needs layer thickness and filament diameter)
+                               dist = (v0 - v1).vsize()
+                               if dist > 0 and path.layerThickness > 0:
+                                       extrusionMMperDist = (v1.e - v0.e) / dist
+                                       lineWidth = extrusionMMperDist * filamentArea / path.layerThickness / 2 * v1.extrudeAmountMultiply
+
+                               drawLength += (v0 - v1).vsize()
+                               normal = (v0 - v1).cross(util3d.Vector3(0, 0, 1))
+                               normal.normalize()
+
+                               vv2 = v0 + normal * lineWidth
+                               vv3 = v1 + normal * lineWidth
+                               vv0 = v0 - normal * lineWidth
+                               vv1 = v1 - normal * lineWidth
+
+                               glBegin(GL_QUADS)
+                               glColor3fv(c)
+                               glVertex3f(vv0.x, vv0.y, vv0.z - zOffset)
+                               glVertex3f(vv1.x, vv1.y, vv1.z - zOffset)
+                               glVertex3f(vv3.x, vv3.y, vv3.z - zOffset)
+                               glVertex3f(vv2.x, vv2.y, vv2.z - zOffset)
+                               glEnd()
+                               if prevNormal != None:
+                                       n = (normal + prevNormal)
+                                       n.normalize()
+                                       vv4 = v0 + n * lineWidth
+                                       vv5 = v0 - n * lineWidth
+                                       glBegin(GL_QUADS)
+                                       glColor3fv(c)
+                                       glVertex3f(vv2.x, vv2.y, vv2.z - zOffset)
+                                       glVertex3f(vv4.x, vv4.y, vv4.z - zOffset)
+                                       glVertex3f(prevVv3.x, prevVv3.y, prevVv3.z - zOffset)
+                                       glVertex3f(v0.x, v0.y, v0.z - zOffset)
+
+                                       glVertex3f(vv0.x, vv0.y, vv0.z - zOffset)
+                                       glVertex3f(vv5.x, vv5.y, vv5.z - zOffset)
+                                       glVertex3f(prevVv1.x, prevVv1.y, prevVv1.z - zOffset)
+                                       glVertex3f(v0.x, v0.y, v0.z - zOffset)
+                                       glEnd()
+
+                               prevNormal = normal
+                               prevVv1 = vv1
+                               prevVv3 = vv3
+               else:
+                       glBegin(GL_LINE_STRIP)
+                       glColor3fv(c)
+                       for v in path.list:
+                               glVertex3f(v.x, v.y, v.z)
+                       glEnd()
+               if not path.type == 'move':
+                       prevPathWasRetract = False
+               if path.type == 'retract' and path.list[0].almostEqual(path.list[-1]):
+                       prevPathWasRetract = True
+       glEnable(GL_CULL_FACE)