chiark / gitweb /
Added depth complexity to 3D view. This helps in finding problems in 3D models.
authordaid <daid303@gmail.com>
Wed, 29 Feb 2012 17:25:57 +0000 (18:25 +0100)
committerdaid <daid303@gmail.com>
Wed, 29 Feb 2012 17:25:57 +0000 (18:25 +0100)
SkeinPyPy_NewUI/newui/preview3d.py

index 52c592d9f19685ddbfd005538e6c0ec6a01077ee..1615fed50cc8397cf295d9122d857473c4391b10 100644 (file)
@@ -3,7 +3,7 @@ import math
 import threading\r
 import re\r
 \r
-from wx.glcanvas import GLCanvas\r
+from wx import glcanvas\r
 import wx\r
 try:\r
        from OpenGL.GLUT import *\r
@@ -47,7 +47,10 @@ class previewPanel(wx.Panel):
 \r
                self.transparentButton = wx.Button(tb, -1, "T", size=(21,21))\r
                tb.AddControl(self.transparentButton)\r
-               self.Bind(wx.EVT_BUTTON, self.OnConfigClick, self.transparentButton)\r
+               self.Bind(wx.EVT_BUTTON, self.OnTransparentClick, self.transparentButton)\r
+               self.depthComplexityButton = wx.Button(tb, -1, "DC", size=(21*2,21))\r
+               tb.AddControl(self.depthComplexityButton)\r
+               self.Bind(wx.EVT_BUTTON, self.OnDepthComplexityClick, self.depthComplexityButton)\r
                \r
                self.layerSpin = wx.SpinCtrl(tb, -1, '', size=(21*4,21), style=wx.SP_ARROW_KEYS)\r
                tb.AddControl(self.layerSpin)\r
@@ -131,8 +134,16 @@ class previewPanel(wx.Panel):
                if self.gcode != None:\r
                        self.layerSpin.SetRange(1, self.gcode.layerCount)\r
        \r
-       def OnConfigClick(self, e):\r
+       def OnTransparentClick(self, e):\r
                self.glCanvas.renderTransparent = not self.glCanvas.renderTransparent\r
+               if self.glCanvas.renderTransparent:\r
+                       self.glCanvas.renderDepthComplexity = False\r
+               self.glCanvas.Refresh()\r
+       \r
+       def OnDepthComplexityClick(self, e):\r
+               self.glCanvas.renderDepthComplexity = not self.glCanvas.renderDepthComplexity\r
+               if self.glCanvas.renderDepthComplexity:\r
+                       self.glCanvas.renderTransparent = False\r
                self.glCanvas.Refresh()\r
        \r
        def moveModel(self):\r
@@ -150,9 +161,10 @@ class previewPanel(wx.Panel):
                self.triangleMesh.getMinimumZ()\r
                self.modelDirty = True\r
 \r
-class PreviewGLCanvas(GLCanvas):\r
+class PreviewGLCanvas(glcanvas.GLCanvas):\r
        def __init__(self, parent):\r
-               GLCanvas.__init__(self, parent)\r
+               attribList = (glcanvas.WX_GL_RGBA, glcanvas.WX_GL_DOUBLEBUFFER, glcanvas.WX_GL_DEPTH_SIZE, 24, glcanvas.WX_GL_STENCIL_SIZE, 8)\r
+               glcanvas.GLCanvas.__init__(self, parent, attribList = attribList)\r
                self.parent = parent\r
                wx.EVT_PAINT(self, self.OnPaint)\r
                wx.EVT_SIZE(self, self.OnSize)\r
@@ -168,6 +180,7 @@ class PreviewGLCanvas(GLCanvas):
                self.fillLineWidth = 0.4\r
                self.view3D = True\r
                self.renderTransparent = False\r
+               self.renderDepthComplexity = False\r
                self.modelDisplayList = None\r
 \r
        def OnMouseMotion(self,e):\r
@@ -217,7 +230,7 @@ class PreviewGLCanvas(GLCanvas):
 \r
        def OnDraw(self):\r
                machineSize = self.parent.machineSize\r
-               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)\r
+               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)\r
                \r
                glTranslate(-self.parent.machineCenter.x, -self.parent.machineCenter.y, 0)\r
                \r
@@ -354,6 +367,47 @@ class PreviewGLCanvas(GLCanvas):
                                glBlendFunc(GL_ONE, GL_ONE)\r
                                glEnable(GL_LIGHTING)\r
                                glCallList(self.modelDisplayList)\r
+                       elif self.renderDepthComplexity:\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
+                               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(0, 1, 0)\r
+                               glCallList(self.modelDisplayList)\r
+                               glStencilFunc(GL_EQUAL, 1, 1);\r
+                               glColor(1, 0, 0)\r
+                               glCallList(self.modelDisplayList)\r
+\r
+                               glPushMatrix()\r
+                               glLoadIdentity()\r
+                               for i in xrange(2, 20, 2):\r
+                                       glStencilFunc(GL_EQUAL, i, 0xFF);\r
+                                       glColor(0, float(i)/10, 0)\r
+                                       glBegin(GL_QUADS)\r
+                                       glVertex3f(-10,-10,-1)\r
+                                       glVertex3f( 10,-10,-1)\r
+                                       glVertex3f( 10, 10,-1)\r
+                                       glVertex3f(-10, 10,-1)\r
+                                       glEnd()\r
+                               for i in xrange(1, 20, 2):\r
+                                       glStencilFunc(GL_EQUAL, i, 0xFF);\r
+                                       glColor(float(i)/10, 0, 0)\r
+                                       glBegin(GL_QUADS)\r
+                                       glVertex3f(-10,-10,-1)\r
+                                       glVertex3f( 10,-10,-1)\r
+                                       glVertex3f( 10, 10,-1)\r
+                                       glVertex3f(-10, 10,-1)\r
+                                       glEnd()\r
+                               glPopMatrix()\r
+\r
+                               glDisable(GL_STENCIL_TEST);\r
+                               glEnable(GL_DEPTH_TEST)\r
                        else:\r
                                glEnable(GL_LIGHTING)\r
                                glCallList(self.modelDisplayList)\r
@@ -382,6 +436,7 @@ class PreviewGLCanvas(GLCanvas):
                glDisable(GL_BLEND)\r
 \r
                glClearColor(0.0, 0.0, 0.0, 1.0)\r
+               glClearStencil(0)\r
                glClearDepth(1.0)\r
 \r
                glMatrixMode(GL_PROJECTION)\r