From 32d1ea11c2cea843ff3290c1b28060a63aef265e Mon Sep 17 00:00:00 2001 From: daid Date: Thu, 3 May 2012 18:41:58 +0200 Subject: [PATCH] Changed GCode preview code to be faster on layer switching. --- Cura/gui/preview3d.py | 58 +++++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/Cura/gui/preview3d.py b/Cura/gui/preview3d.py index ee1ed79..a2949c9 100644 --- a/Cura/gui/preview3d.py +++ b/Cura/gui/preview3d.py @@ -1,11 +1,6 @@ from __future__ import division -import sys -import math -import threading -import re -import time -import os +import sys, math, threading, re, time, os from wx import glcanvas import wx @@ -102,7 +97,7 @@ class previewPanel(wx.Panel): self.rotateReset = toolbarUtil.NormalButton(self.toolbar2, self.OnRotateReset, 'object-rotate.png', 'Reset model rotation') self.rotate = wx.SpinCtrl(self.toolbar2, -1, profile.getProfileSetting('model_rotate_base'), size=(21*3,21), style=wx.SP_WRAP|wx.SP_ARROW_KEYS) self.rotate.SetRange(0, 360) - self.Bind(wx.EVT_TEXT, self.OnRotate) + self.rotate.Bind(wx.EVT_TEXT, self.OnRotate) self.toolbar2.AddControl(self.rotate) self.toolbar2.Realize() @@ -179,7 +174,6 @@ class previewPanel(wx.Panel): self.glCanvas.Refresh() def OnLayerNrChange(self, e): - self.gcodeDirty = True self.glCanvas.Refresh() def updateCenterX(self): @@ -378,6 +372,7 @@ class PreviewGLCanvas(glcanvas.GLCanvas): self.offsetY = 0 self.view3D = True self.gcodeDisplayList = None + self.gcodeDisplayListCount = 0 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]] def OnMouseMotion(self,e): @@ -441,33 +436,37 @@ class PreviewGLCanvas(glcanvas.GLCanvas): opengl.DrawMachine(machineSize) if self.parent.gcode != None: - if self.gcodeDisplayList == None: - self.gcodeDisplayList = glGenLists(1); if self.parent.gcodeDirty: + if self.gcodeDisplayListCount < len(self.parent.gcode.layerList) or self.gcodeDisplayList == None: + if self.gcodeDisplayList != None: + glDeleteLists(self.gcodeDisplayList, self.gcodeDisplayListCount) + self.gcodeDisplayList = glGenLists(len(self.parent.gcode.layerList)); + self.gcodeDisplayListCount = len(self.parent.gcode.layerList) self.parent.gcodeDirty = False - glNewList(self.gcodeDisplayList, GL_COMPILE) prevLayerZ = 0.0 curLayerZ = 0.0 layerThickness = 0.0 - filamentRadius = float(profile.getProfileSetting('filament_diameter')) / 2 + filamentRadius = profile.getProfileSettingFloat('filament_diameter') / 2 filamentArea = math.pi * filamentRadius * filamentRadius - lineWidth = float(profile.getProfileSetting('nozzle_size')) / 2 / 10 + lineWidth = profile.getProfileSettingFloat('nozzle_size') / 2 / 10 curLayerNum = 0 for layer in self.parent.gcode.layerList: + glNewList(self.gcodeDisplayList + curLayerNum, GL_COMPILE) + glDisable(GL_CULL_FACE) curLayerZ = layer[0].list[1].z layerThickness = curLayerZ - prevLayerZ prevLayerZ = layer[-1].list[-1].z for path in layer: c = 1.0 - if curLayerNum != self.parent.layerSpin.GetValue(): - if curLayerNum < self.parent.layerSpin.GetValue(): - c = 0.9 - (self.parent.layerSpin.GetValue() - curLayerNum) * 0.1 - if c < 0.4: - c = 0.4 - else: - break + #if curLayerNum != self.parent.layerSpin.GetValue(): + # if curLayerNum < self.parent.layerSpin.GetValue(): + # c = 0.9 - (self.parent.layerSpin.GetValue() - curLayerNum) * 0.1 + # if c < 0.4: + # c = 0.4 + # else: + # break if path.type == 'move': glColor3f(0,0,c) if path.type == 'extrude': @@ -529,9 +528,24 @@ class PreviewGLCanvas(glcanvas.GLCanvas): glVertex3f(v.x, v.y, v.z) glEnd() curLayerNum += 1 - glEndList() + glEnable(GL_CULL_FACE) + glEndList() if self.viewMode == "GCode" or self.viewMode == "Mixed": - glCallList(self.gcodeDisplayList) + glEnable(GL_COLOR_MATERIAL) + glEnable(GL_LIGHTING) + glLightfv(GL_LIGHT0, GL_DIFFUSE, [0,0,0,0]) + for i in xrange(0, self.parent.layerSpin.GetValue() + 1): + c = 1.0 + if i < self.parent.layerSpin.GetValue(): + c = 0.9 - (self.parent.layerSpin.GetValue() - i) * 0.1 + if c < 0.4: + c = (0.4 + c) / 2 + if c < 0.1: + c = 0.1 + glLightfv(GL_LIGHT0, GL_AMBIENT, [c,c,c,c]) + glCallList(self.gcodeDisplayList + i) + glDisable(GL_COLOR_MATERIAL) + glDisable(GL_LIGHTING) glTranslate(self.parent.machineCenter.x, self.parent.machineCenter.y, 0) for obj in self.parent.objectList: