diff --git a/Cura/gui/opengl.py b/Cura/gui/opengl.py index c227600..bf89bf8 100644 --- a/Cura/gui/opengl.py +++ b/Cura/gui/opengl.py @@ -47,7 +47,7 @@ def InitGL(window, view3D, zoom): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) def DrawMachine(machineSize): - glColor3f(1,1,1) + glColor3f(1.0,1.0,1.0) glLineWidth(4) glDisable(GL_LIGHTING) glBegin(GL_LINE_LOOP) @@ -56,6 +56,7 @@ def DrawMachine(machineSize): glVertex3f(machineSize.x, machineSize.y, 0) glVertex3f(0, machineSize.y, 0) glEnd() + glColor3f(0.7,0.7,0.7) glLineWidth(2) glBegin(GL_LINES) for i in xrange(0, int(machineSize.x), 10): @@ -203,7 +204,21 @@ def DrawBox(vMin, vMax): glVertex3f(vMin[0], vMax[1], vMax[2]) glEnd() -def DrawSTL(mesh): +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); diff --git a/Cura/gui/preview3d.py b/Cura/gui/preview3d.py index 27605a3..26ebe04 100644 --- a/Cura/gui/preview3d.py +++ b/Cura/gui/preview3d.py @@ -76,6 +76,9 @@ class previewPanel(wx.Panel): toolbarUtil.RadioButton(self.toolbar, group, 'object-top-on.png', 'object-top-off.png', 'Topdown view', callback=self.OnTopClick) self.toolbar.AddSeparator() + self.showBorderButton = toolbarUtil.ToggleButton(self.toolbar, '', 'view-border-on.png', 'view-border-off.png', 'Show model borders', callback=self.OnViewChange) + self.toolbar.AddSeparator() + group = [] self.normalViewButton = toolbarUtil.RadioButton(self.toolbar, group, 'view-normal-on.png', 'view-normal-off.png', 'Normal model view', callback=self.OnViewChange) self.transparentViewButton = toolbarUtil.RadioButton(self.toolbar, group, 'view-transparent-on.png', 'view-transparent-off.png', 'Transparent model view', callback=self.OnViewChange) @@ -331,6 +334,7 @@ class previewPanel(wx.Panel): self.glCanvas.viewMode = "GCode" elif self.mixedViewButton.GetValue(): self.glCanvas.viewMode = "Mixed" + self.glCanvas.drawBorders = self.showBorderButton.GetValue() self.updateToolbar() self.glCanvas.Refresh() @@ -533,7 +537,7 @@ class PreviewGLCanvas(glcanvas.GLCanvas): if obj.dirty: obj.dirty = False glNewList(obj.displayList, GL_COMPILE) - opengl.DrawSTL(obj.mesh) + opengl.DrawMesh(obj.mesh) glEndList() if self.viewMode == "Transparent" or self.viewMode == "Mixed": @@ -593,11 +597,23 @@ class PreviewGLCanvas(glcanvas.GLCanvas): glDisable(GL_STENCIL_TEST) glEnable(GL_DEPTH_TEST) + + if self.drawBorders: + #Fix the depth buffer for the outline drawing. + glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE) + self.drawModel(obj) + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE) elif self.viewMode == "Normal": glLightfv(GL_LIGHT0, GL_DIFFUSE, self.objColor[self.parent.objectList.index(obj)]) glLightfv(GL_LIGHT0, GL_AMBIENT, map(lambda x: x / 5, self.objColor[self.parent.objectList.index(obj)])) glEnable(GL_LIGHTING) self.drawModel(obj) + + if self.drawBorders and (self.viewMode == "Normal" or self.viewMode == "Transparent" or self.viewMode == "X-Ray"): + glEnable(GL_DEPTH_TEST) + glDisable(GL_LIGHTING) + glColor3f(1,1,1) + opengl.DrawMeshOutline(obj.mesh) glPopMatrix() if self.viewMode == "Normal" or self.viewMode == "Transparent" or self.viewMode == "X-Ray": diff --git a/Cura/gui/toolbarUtil.py b/Cura/gui/toolbarUtil.py index e49d77c..64dc984 100644 --- a/Cura/gui/toolbarUtil.py +++ b/Cura/gui/toolbarUtil.py @@ -94,6 +94,8 @@ class ToggleButton(buttons.GenBitmapToggleButton): def OnButton(self, event): self.SetBitmap(self.GetValue()) + if self.callback != None: + self.callback() event.Skip() def OnButtonProfile(self, event): @@ -103,7 +105,8 @@ class ToggleButton(buttons.GenBitmapToggleButton): else: self.SetBitmap(False) profile.putProfileSetting(self.profileSetting, 'False') - self.callback() + if self.callback != None: + self.callback() event.Skip() def OnMouseEnter(self, event): diff --git a/Cura/images/view-border-off.png b/Cura/images/view-border-off.png new file mode 100644 index 0000000..3019205 Binary files /dev/null and b/Cura/images/view-border-off.png differ diff --git a/Cura/images/view-border-on.png b/Cura/images/view-border-on.png new file mode 100644 index 0000000..2d27e29 Binary files /dev/null and b/Cura/images/view-border-on.png differ