From 5879a9e71b8d2556424a2b7210db69065a866a2b Mon Sep 17 00:00:00 2001 From: daid Date: Wed, 18 Apr 2012 17:04:03 +0200 Subject: [PATCH 1/3] Do less stuff in software, and more on the video card. Could be improved even more. --- Cura/gui/preview3d.py | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/Cura/gui/preview3d.py b/Cura/gui/preview3d.py index 19cb9ad66b..7e4ca6e896 100644 --- a/Cura/gui/preview3d.py +++ b/Cura/gui/preview3d.py @@ -137,7 +137,8 @@ class previewPanel(wx.Panel): if scale <= 0.0: scale = 1.0 profile.putProfileSetting('model_scale', scale) - self.updateModelTransform() + self.modelDirty = True + self.glCanvas.Refresh() def OnScaleMax(self, e): if self.triangleMesh == None: @@ -153,7 +154,8 @@ class previewPanel(wx.Panel): scale = min(scaleX1, scaleY1, scaleX2, scaleY2, scaleZ) self.scale.SetValue(str(scale)) profile.putProfileSetting('model_scale', self.scale.GetValue()) - self.updateModelTransform() + self.modelDirty = True + self.glCanvas.Refresh() def OnRotateReset(self, e): self.rotate.SetValue(0) @@ -183,12 +185,10 @@ class previewPanel(wx.Panel): def updateCenterX(self, x): self.machineCenter.x = x - self.moveModel() self.glCanvas.Refresh() def updateCenterY(self, y): self.machineCenter.y = y - self.moveModel() self.glCanvas.Refresh() def setViewMode(self, mode): @@ -290,16 +290,10 @@ class previewPanel(wx.Panel): def updateModelTransform(self, f=0): if self.triangleMesh == None: return - scale = 1.0 - rotate = 0.0 - try: - scale = profile.getProfileSettingFloat('model_scale') - rotate = profile.getProfileSettingFloat('model_rotate_base') / 180.0 * math.pi - except: - pass - scaleX = scale - scaleY = scale - scaleZ = scale + rotate = profile.getProfileSettingFloat('model_rotate_base') / 180.0 * math.pi + scaleX = 1.0 + scaleY = 1.0 + scaleZ = 1.0 if profile.getProfileSetting('flip_x') == 'True': scaleX = -scaleX if profile.getProfileSetting('flip_y') == 'True': @@ -332,9 +326,6 @@ class previewPanel(wx.Panel): face.normal = (v2 - v1).cross(v3 - v1) face.normal.normalize() - self.moveModel() - - def moveModel(self): if self.triangleMesh == None: return minZ = self.triangleMesh.getMinimumZ() @@ -344,8 +335,6 @@ class previewPanel(wx.Panel): v.z -= minZ v.x -= min.x + (max.x - min.x) / 2 v.y -= min.y + (max.y - min.y) / 2 - v.x += self.machineCenter.x - v.y += self.machineCenter.y self.triangleMesh.getMinimumZ() self.modelDirty = True self.glCanvas.Refresh() @@ -530,7 +519,8 @@ class PreviewGLCanvas(glcanvas.GLCanvas): self.parent.modelDirty = False multiX = int(profile.getProfileSetting('model_multiply_x')) multiY = int(profile.getProfileSetting('model_multiply_y')) - modelSize = self.parent.triangleMesh.getMaximum() - self.parent.triangleMesh.getMinimum() + modelScale = profile.getProfileSettingFloat('model_scale') + modelSize = (self.parent.triangleMesh.getMaximum() - self.parent.triangleMesh.getMinimum()) * modelScale glNewList(self.modelDisplayList, GL_COMPILE) glPushMatrix() glTranslate(-(modelSize.x+10)*(multiX-1)/2,-(modelSize.y+10)*(multiY-1)/2, 0) @@ -538,11 +528,14 @@ class PreviewGLCanvas(glcanvas.GLCanvas): for my in xrange(0, multiY): glPushMatrix() glTranslate((modelSize.x+10)*mx,(modelSize.y+10)*my, 0) + glScalef(modelScale, modelScale, modelScale) opengl.DrawSTL(self.parent.triangleMesh) glPopMatrix() glPopMatrix() glEndList() + glTranslate(self.parent.machineCenter.x, self.parent.machineCenter.y, 0) + glEnable(GL_NORMALIZE) if self.viewMode == "Transparent" or self.viewMode == "Mixed": glLightfv(GL_LIGHT0, GL_DIFFUSE, [0.5, 0.4, 0.3, 1.0]) glLightfv(GL_LIGHT0, GL_AMBIENT, [0.1, 0.1, 0.1, 0.0]) @@ -612,7 +605,6 @@ class PreviewGLCanvas(glcanvas.GLCanvas): glDisable(GL_DEPTH_TEST) glDisable(GL_BLEND) glColor3f(1,0,0) - glTranslate(self.parent.machineCenter.x, self.parent.machineCenter.y, 0) glBegin(GL_LINES) for err in self.parent.errorList: glVertex3f(err[0].x, err[0].y, err[0].z) From c49b6c99a9a27739c30fd877daa961d0a3210d2b Mon Sep 17 00:00:00 2001 From: daid Date: Wed, 18 Apr 2012 17:06:32 +0200 Subject: [PATCH 2/3] Fixing feature 32 - expressions in scale. --- Cura/gui/preview3d.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Cura/gui/preview3d.py b/Cura/gui/preview3d.py index 7e4ca6e896..c037b3ce0d 100644 --- a/Cura/gui/preview3d.py +++ b/Cura/gui/preview3d.py @@ -133,9 +133,7 @@ class previewPanel(wx.Panel): def OnScale(self, e): scale = 1.0 if self.scale.GetValue() != '': - scale = float(self.scale.GetValue()) - if scale <= 0.0: - scale = 1.0 + scale = self.scale.GetValue() profile.putProfileSetting('model_scale', scale) self.modelDirty = True self.glCanvas.Refresh() From 5ffbe4332981b6fdc78d740dbb40846d03f5a96c Mon Sep 17 00:00:00 2001 From: daid Date: Wed, 18 Apr 2012 17:48:34 +0200 Subject: [PATCH 3/3] Speed up preview when changing multiply/scale by offloading that to the 3D card, instead of recalculating vertex positions. --- Cura/gui/preview3d.py | 57 +++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/Cura/gui/preview3d.py b/Cura/gui/preview3d.py index c037b3ce0d..c9bb5b7570 100644 --- a/Cura/gui/preview3d.py +++ b/Cura/gui/preview3d.py @@ -112,19 +112,19 @@ class previewPanel(wx.Panel): def OnMulXAddClick(self, e): profile.putProfileSetting('model_multiply_x', str(max(1, int(profile.getProfileSetting('model_multiply_x'))+1))) - self.updateModelTransform() + self.glCanvas.Refresh() def OnMulXSubClick(self, e): profile.putProfileSetting('model_multiply_x', str(max(1, int(profile.getProfileSetting('model_multiply_x'))-1))) - self.updateModelTransform() + self.glCanvas.Refresh() def OnMulYAddClick(self, e): profile.putProfileSetting('model_multiply_y', str(max(1, int(profile.getProfileSetting('model_multiply_y'))+1))) - self.updateModelTransform() + self.glCanvas.Refresh() def OnMulYSubClick(self, e): profile.putProfileSetting('model_multiply_y', str(max(1, int(profile.getProfileSetting('model_multiply_y'))-1))) - self.updateModelTransform() + self.glCanvas.Refresh() def OnScaleReset(self, e): self.scale.SetValue('1.0') @@ -135,7 +135,6 @@ class previewPanel(wx.Panel): if self.scale.GetValue() != '': scale = self.scale.GetValue() profile.putProfileSetting('model_scale', scale) - self.modelDirty = True self.glCanvas.Refresh() def OnScaleMax(self, e): @@ -152,7 +151,6 @@ class previewPanel(wx.Panel): scale = min(scaleX1, scaleY1, scaleX2, scaleY2, scaleZ) self.scale.SetValue(str(scale)) profile.putProfileSetting('model_scale', self.scale.GetValue()) - self.modelDirty = True self.glCanvas.Refresh() def OnRotateReset(self, e): @@ -324,8 +322,6 @@ class previewPanel(wx.Panel): face.normal = (v2 - v1).cross(v3 - v1) face.normal.normalize() - if self.triangleMesh == None: - return minZ = self.triangleMesh.getMinimumZ() min = self.triangleMesh.getMinimum() max = self.triangleMesh.getMaximum() @@ -515,21 +511,8 @@ class PreviewGLCanvas(glcanvas.GLCanvas): self.modelDisplayList = glGenLists(1); if self.parent.modelDirty: self.parent.modelDirty = False - multiX = int(profile.getProfileSetting('model_multiply_x')) - multiY = int(profile.getProfileSetting('model_multiply_y')) - modelScale = profile.getProfileSettingFloat('model_scale') - modelSize = (self.parent.triangleMesh.getMaximum() - self.parent.triangleMesh.getMinimum()) * modelScale glNewList(self.modelDisplayList, GL_COMPILE) - glPushMatrix() - glTranslate(-(modelSize.x+10)*(multiX-1)/2,-(modelSize.y+10)*(multiY-1)/2, 0) - for mx in xrange(0, multiX): - for my in xrange(0, multiY): - glPushMatrix() - glTranslate((modelSize.x+10)*mx,(modelSize.y+10)*my, 0) - glScalef(modelScale, modelScale, modelScale) - opengl.DrawSTL(self.parent.triangleMesh) - glPopMatrix() - glPopMatrix() + opengl.DrawSTL(self.parent.triangleMesh) glEndList() glTranslate(self.parent.machineCenter.x, self.parent.machineCenter.y, 0) @@ -542,7 +525,7 @@ class PreviewGLCanvas(glcanvas.GLCanvas): glDisable(GL_BLEND) glDisable(GL_LIGHTING) glColor3f(0,0,0) - glCallList(self.modelDisplayList) + self.drawModel() glColor3f(1,1,1) #After the black model is rendered, render the model again but now with lighting and no depth testing. glDisable(GL_DEPTH_TEST) @@ -550,23 +533,23 @@ class PreviewGLCanvas(glcanvas.GLCanvas): glEnable(GL_BLEND) glBlendFunc(GL_ONE, GL_ONE) glEnable(GL_LIGHTING) - glCallList(self.modelDisplayList) + self.drawModel() elif self.viewMode == "X-Ray": glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE) glDisable(GL_DEPTH_TEST) glEnable(GL_STENCIL_TEST); glStencilFunc(GL_ALWAYS, 1, 1) glStencilOp(GL_INCR, GL_INCR, GL_INCR) - glCallList(self.modelDisplayList) + self.drawModel() glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE) glStencilFunc(GL_EQUAL, 0, 1); glColor(1, 1, 1) - glCallList(self.modelDisplayList) + self.drawModel() glStencilFunc(GL_EQUAL, 1, 1); glColor(1, 0, 0) - glCallList(self.modelDisplayList) + self.drawModel() glPushMatrix() glLoadIdentity() @@ -596,7 +579,7 @@ class PreviewGLCanvas(glcanvas.GLCanvas): glLightfv(GL_LIGHT0, GL_DIFFUSE, [1.0, 0.8, 0.6, 1.0]) glLightfv(GL_LIGHT0, GL_AMBIENT, [0.2, 0.2, 0.2, 0.0]) glEnable(GL_LIGHTING) - glCallList(self.modelDisplayList) + self.drawModel() if self.viewMode == "Normal" or self.viewMode == "Transparent" or self.viewMode == "X-Ray": glDisable(GL_LIGHTING) @@ -608,5 +591,21 @@ class PreviewGLCanvas(glcanvas.GLCanvas): glVertex3f(err[0].x, err[0].y, err[0].z) glVertex3f(err[1].x, err[1].y, err[1].z) glEnd() - glFlush() + + def drawModel(self): + multiX = int(profile.getProfileSetting('model_multiply_x')) + multiY = int(profile.getProfileSetting('model_multiply_y')) + modelScale = profile.getProfileSettingFloat('model_scale') + modelSize = (self.parent.triangleMesh.getMaximum() - self.parent.triangleMesh.getMinimum()) * modelScale + glPushMatrix() + glTranslate(-(modelSize.x+10)*(multiX-1)/2,-(modelSize.y+10)*(multiY-1)/2, 0) + for mx in xrange(0, multiX): + for my in xrange(0, multiY): + glPushMatrix() + glTranslate((modelSize.x+10)*mx,(modelSize.y+10)*my, 0) + glScalef(modelScale, modelScale, modelScale) + glCallList(self.modelDisplayList) + glPopMatrix() + glPopMatrix() +