chiark / gitweb /
Speed up preview when changing multiply/scale by offloading that to the 3D card,...
authordaid <daid303@gmail.com>
Wed, 18 Apr 2012 15:48:34 +0000 (17:48 +0200)
committerdaid <daid303@gmail.com>
Wed, 18 Apr 2012 15:48:34 +0000 (17:48 +0200)
Cura/gui/preview3d.py

index c037b3ce0da13929393dc6f4ab84dadc3b3d0d0a..c9bb5b7570edef9646321e3154b1e500fe1770fe 100644 (file)
@@ -112,19 +112,19 @@ class previewPanel(wx.Panel):
        \r
        def OnMulXAddClick(self, e):\r
                profile.putProfileSetting('model_multiply_x', str(max(1, int(profile.getProfileSetting('model_multiply_x'))+1)))\r
-               self.updateModelTransform()\r
+               self.glCanvas.Refresh()\r
 \r
        def OnMulXSubClick(self, e):\r
                profile.putProfileSetting('model_multiply_x', str(max(1, int(profile.getProfileSetting('model_multiply_x'))-1)))\r
-               self.updateModelTransform()\r
+               self.glCanvas.Refresh()\r
 \r
        def OnMulYAddClick(self, e):\r
                profile.putProfileSetting('model_multiply_y', str(max(1, int(profile.getProfileSetting('model_multiply_y'))+1)))\r
-               self.updateModelTransform()\r
+               self.glCanvas.Refresh()\r
 \r
        def OnMulYSubClick(self, e):\r
                profile.putProfileSetting('model_multiply_y', str(max(1, int(profile.getProfileSetting('model_multiply_y'))-1)))\r
-               self.updateModelTransform()\r
+               self.glCanvas.Refresh()\r
 \r
        def OnScaleReset(self, e):\r
                self.scale.SetValue('1.0')\r
@@ -135,7 +135,6 @@ class previewPanel(wx.Panel):
                if self.scale.GetValue() != '':\r
                        scale = self.scale.GetValue()\r
                profile.putProfileSetting('model_scale', scale)\r
-               self.modelDirty = True\r
                self.glCanvas.Refresh()\r
        \r
        def OnScaleMax(self, e):\r
@@ -152,7 +151,6 @@ class previewPanel(wx.Panel):
                scale = min(scaleX1, scaleY1, scaleX2, scaleY2, scaleZ)\r
                self.scale.SetValue(str(scale))\r
                profile.putProfileSetting('model_scale', self.scale.GetValue())\r
-               self.modelDirty = True\r
                self.glCanvas.Refresh()\r
 \r
        def OnRotateReset(self, e):\r
@@ -324,8 +322,6 @@ class previewPanel(wx.Panel):
                        face.normal = (v2 - v1).cross(v3 - v1)\r
                        face.normal.normalize()\r
 \r
-               if self.triangleMesh == None:\r
-                       return\r
                minZ = self.triangleMesh.getMinimumZ()\r
                min = self.triangleMesh.getMinimum()\r
                max = self.triangleMesh.getMaximum()\r
@@ -515,21 +511,8 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                self.modelDisplayList = glGenLists(1);\r
                        if self.parent.modelDirty:\r
                                self.parent.modelDirty = False\r
-                               multiX = int(profile.getProfileSetting('model_multiply_x'))\r
-                               multiY = int(profile.getProfileSetting('model_multiply_y'))\r
-                               modelScale = profile.getProfileSettingFloat('model_scale')\r
-                               modelSize = (self.parent.triangleMesh.getMaximum() - self.parent.triangleMesh.getMinimum()) * modelScale\r
                                glNewList(self.modelDisplayList, GL_COMPILE)\r
-                               glPushMatrix()\r
-                               glTranslate(-(modelSize.x+10)*(multiX-1)/2,-(modelSize.y+10)*(multiY-1)/2, 0)\r
-                               for mx in xrange(0, multiX):\r
-                                       for my in xrange(0, multiY):\r
-                                               glPushMatrix()\r
-                                               glTranslate((modelSize.x+10)*mx,(modelSize.y+10)*my, 0)\r
-                                               glScalef(modelScale, modelScale, modelScale)\r
-                                               opengl.DrawSTL(self.parent.triangleMesh)\r
-                                               glPopMatrix()\r
-                               glPopMatrix()\r
+                               opengl.DrawSTL(self.parent.triangleMesh)\r
                                glEndList()\r
                        \r
                        glTranslate(self.parent.machineCenter.x, self.parent.machineCenter.y, 0)\r
@@ -542,7 +525,7 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                        glDisable(GL_BLEND)\r
                                        glDisable(GL_LIGHTING)\r
                                        glColor3f(0,0,0)\r
-                                       glCallList(self.modelDisplayList)\r
+                                       self.drawModel()\r
                                        glColor3f(1,1,1)\r
                                #After the black model is rendered, render the model again but now with lighting and no depth testing.\r
                                glDisable(GL_DEPTH_TEST)\r
@@ -550,23 +533,23 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                glEnable(GL_BLEND)\r
                                glBlendFunc(GL_ONE, GL_ONE)\r
                                glEnable(GL_LIGHTING)\r
-                               glCallList(self.modelDisplayList)\r
+                               self.drawModel()\r
                        elif self.viewMode == "X-Ray":\r
                                glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE)\r
                                glDisable(GL_DEPTH_TEST)\r
                                glEnable(GL_STENCIL_TEST);\r
                                glStencilFunc(GL_ALWAYS, 1, 1)\r
                                glStencilOp(GL_INCR, GL_INCR, GL_INCR)\r
-                               glCallList(self.modelDisplayList)\r
+                               self.drawModel()\r
                                glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP);\r
                                \r
                                glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE)\r
                                glStencilFunc(GL_EQUAL, 0, 1);\r
                                glColor(1, 1, 1)\r
-                               glCallList(self.modelDisplayList)\r
+                               self.drawModel()\r
                                glStencilFunc(GL_EQUAL, 1, 1);\r
                                glColor(1, 0, 0)\r
-                               glCallList(self.modelDisplayList)\r
+                               self.drawModel()\r
 \r
                                glPushMatrix()\r
                                glLoadIdentity()\r
@@ -596,7 +579,7 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                glLightfv(GL_LIGHT0, GL_DIFFUSE,  [1.0, 0.8, 0.6, 1.0])\r
                                glLightfv(GL_LIGHT0, GL_AMBIENT,  [0.2, 0.2, 0.2, 0.0])\r
                                glEnable(GL_LIGHTING)\r
-                               glCallList(self.modelDisplayList)\r
+                               self.drawModel()\r
                        \r
                        if self.viewMode == "Normal" or self.viewMode == "Transparent" or self.viewMode == "X-Ray":\r
                                glDisable(GL_LIGHTING)\r
@@ -608,5 +591,21 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                        glVertex3f(err[0].x, err[0].y, err[0].z)\r
                                        glVertex3f(err[1].x, err[1].y, err[1].z)\r
                                glEnd()\r
-               \r
                glFlush()\r
+       \r
+       def drawModel(self):\r
+               multiX = int(profile.getProfileSetting('model_multiply_x'))\r
+               multiY = int(profile.getProfileSetting('model_multiply_y'))\r
+               modelScale = profile.getProfileSettingFloat('model_scale')\r
+               modelSize = (self.parent.triangleMesh.getMaximum() - self.parent.triangleMesh.getMinimum()) * modelScale\r
+               glPushMatrix()\r
+               glTranslate(-(modelSize.x+10)*(multiX-1)/2,-(modelSize.y+10)*(multiY-1)/2, 0)\r
+               for mx in xrange(0, multiX):\r
+                       for my in xrange(0, multiY):\r
+                               glPushMatrix()\r
+                               glTranslate((modelSize.x+10)*mx,(modelSize.y+10)*my, 0)\r
+                               glScalef(modelScale, modelScale, modelScale)\r
+                               glCallList(self.modelDisplayList)\r
+                               glPopMatrix()\r
+               glPopMatrix()\r
+\r