chiark / gitweb /
Changed GCode preview code to be faster on layer switching.
authordaid <daid303@gmail.com>
Thu, 3 May 2012 16:41:58 +0000 (18:41 +0200)
committerdaid <daid303@gmail.com>
Thu, 3 May 2012 16:41:58 +0000 (18:41 +0200)
Cura/gui/preview3d.py

index ee1ed79ee4af0cf0216243abaee72037b313250c..a2949c911884c2b719f2c286063ff3b04d266f3a 100644 (file)
@@ -1,11 +1,6 @@
 from __future__ import division\r
 \r
-import sys\r
-import math\r
-import threading\r
-import re\r
-import time\r
-import os\r
+import sys, math, threading, re, time, os\r
 \r
 from wx import glcanvas\r
 import wx\r
@@ -102,7 +97,7 @@ class previewPanel(wx.Panel):
                self.rotateReset = toolbarUtil.NormalButton(self.toolbar2, self.OnRotateReset, 'object-rotate.png', 'Reset model rotation')\r
                self.rotate = wx.SpinCtrl(self.toolbar2, -1, profile.getProfileSetting('model_rotate_base'), size=(21*3,21), style=wx.SP_WRAP|wx.SP_ARROW_KEYS)\r
                self.rotate.SetRange(0, 360)\r
-               self.Bind(wx.EVT_TEXT, self.OnRotate)\r
+               self.rotate.Bind(wx.EVT_TEXT, self.OnRotate)\r
                self.toolbar2.AddControl(self.rotate)\r
 \r
                self.toolbar2.Realize()\r
@@ -179,7 +174,6 @@ class previewPanel(wx.Panel):
                self.glCanvas.Refresh()\r
 \r
        def OnLayerNrChange(self, e):\r
-               self.gcodeDirty = True\r
                self.glCanvas.Refresh()\r
 \r
        def updateCenterX(self):\r
@@ -378,6 +372,7 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                self.offsetY = 0\r
                self.view3D = True\r
                self.gcodeDisplayList = None\r
+               self.gcodeDisplayListCount = 0\r
                self.objColor = [[1.0, 0.8, 0.6, 1.0], [0.2, 1.0, 0.1, 1.0], [1.0, 0.2, 0.1, 1.0], [0.1, 0.2, 1.0, 1.0]]\r
        \r
        def OnMouseMotion(self,e):\r
@@ -441,33 +436,37 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                opengl.DrawMachine(machineSize)\r
 \r
                if self.parent.gcode != None:\r
-                       if self.gcodeDisplayList == None:\r
-                               self.gcodeDisplayList = glGenLists(1);\r
                        if self.parent.gcodeDirty:\r
+                               if self.gcodeDisplayListCount < len(self.parent.gcode.layerList) or self.gcodeDisplayList == None:\r
+                                       if self.gcodeDisplayList != None:\r
+                                               glDeleteLists(self.gcodeDisplayList, self.gcodeDisplayListCount)\r
+                                       self.gcodeDisplayList = glGenLists(len(self.parent.gcode.layerList));\r
+                                       self.gcodeDisplayListCount = len(self.parent.gcode.layerList)\r
                                self.parent.gcodeDirty = False\r
-                               glNewList(self.gcodeDisplayList, GL_COMPILE)\r
                                prevLayerZ = 0.0\r
                                curLayerZ = 0.0\r
                                \r
                                layerThickness = 0.0\r
-                               filamentRadius = float(profile.getProfileSetting('filament_diameter')) / 2\r
+                               filamentRadius = profile.getProfileSettingFloat('filament_diameter') / 2\r
                                filamentArea = math.pi * filamentRadius * filamentRadius\r
-                               lineWidth = float(profile.getProfileSetting('nozzle_size')) / 2 / 10\r
+                               lineWidth = profile.getProfileSettingFloat('nozzle_size') / 2 / 10\r
                                \r
                                curLayerNum = 0\r
                                for layer in self.parent.gcode.layerList:\r
+                                       glNewList(self.gcodeDisplayList + curLayerNum, GL_COMPILE)\r
+                                       glDisable(GL_CULL_FACE)\r
                                        curLayerZ = layer[0].list[1].z\r
                                        layerThickness = curLayerZ - prevLayerZ\r
                                        prevLayerZ = layer[-1].list[-1].z\r
                                        for path in layer:\r
                                                c = 1.0\r
-                                               if curLayerNum != self.parent.layerSpin.GetValue():\r
-                                                       if curLayerNum < self.parent.layerSpin.GetValue():\r
-                                                               c = 0.9 - (self.parent.layerSpin.GetValue() - curLayerNum) * 0.1\r
-                                                               if c < 0.4:\r
-                                                                       c = 0.4\r
-                                                       else:\r
-                                                               break\r
+                                               #if curLayerNum != self.parent.layerSpin.GetValue():\r
+                                               #       if curLayerNum < self.parent.layerSpin.GetValue():\r
+                                               #               c = 0.9 - (self.parent.layerSpin.GetValue() - curLayerNum) * 0.1\r
+                                               #               if c < 0.4:\r
+                                               #                       c = 0.4\r
+                                               #       else:\r
+                                               #               break\r
                                                if path.type == 'move':\r
                                                        glColor3f(0,0,c)\r
                                                if path.type == 'extrude':\r
@@ -529,9 +528,24 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                                                glVertex3f(v.x, v.y, v.z)\r
                                                        glEnd()\r
                                        curLayerNum += 1\r
-                               glEndList()\r
+                                       glEnable(GL_CULL_FACE)\r
+                                       glEndList()\r
                        if self.viewMode == "GCode" or self.viewMode == "Mixed":\r
-                               glCallList(self.gcodeDisplayList)\r
+                               glEnable(GL_COLOR_MATERIAL)\r
+                               glEnable(GL_LIGHTING)\r
+                               glLightfv(GL_LIGHT0, GL_DIFFUSE, [0,0,0,0])\r
+                               for i in xrange(0, self.parent.layerSpin.GetValue() + 1):\r
+                                       c = 1.0\r
+                                       if i < self.parent.layerSpin.GetValue():\r
+                                               c = 0.9 - (self.parent.layerSpin.GetValue() - i) * 0.1\r
+                                               if c < 0.4:\r
+                                                       c = (0.4 + c) / 2\r
+                                               if c < 0.1:\r
+                                                       c = 0.1\r
+                                       glLightfv(GL_LIGHT0, GL_AMBIENT, [c,c,c,c])\r
+                                       glCallList(self.gcodeDisplayList + i)\r
+                               glDisable(GL_COLOR_MATERIAL)\r
+                               glDisable(GL_LIGHTING)\r
                \r
                glTranslate(self.parent.machineCenter.x, self.parent.machineCenter.y, 0)\r
                for obj in self.parent.objectList:\r