chiark / gitweb /
Implement fallback in case shader support is missing. I still think this is caused...
authordaid <daid303@gmail.com>
Mon, 17 Jun 2013 07:33:41 +0000 (09:33 +0200)
committerdaid <daid303@gmail.com>
Mon, 17 Jun 2013 07:33:41 +0000 (09:33 +0200)
Cura/gui/sceneView.py
Cura/gui/util/opengl.py

index ba7d651e2acb60b215345464942fc448fcf771d5..6eb8fc544ce5551f9db34e411eeea6e6db6caa61 100644 (file)
@@ -470,7 +470,10 @@ class SceneView(openglGui.glGuiPanel):
                                traceback.print_exc()
                        else:
                                for obj in objList:
-                                       obj._loadAnim = openglGui.animation(self, 1, 0, 1.5)
+                                       if self._objectLoadShader is not None:
+                                               obj._loadAnim = openglGui.animation(self, 1, 0, 1.5)
+                                       else:
+                                               obj._loadAnim = None
                                        self._scene.add(obj)
                                        self._scene.centerAll()
                                        self._selectObject(obj)
@@ -751,7 +754,8 @@ class SceneView(openglGui.glGuiPanel):
                        except:
                                pass
                if self._objectShader is None:
-                       self._objectShader = opengl.GLShader("""
+                       if opengl.hasShaderSupport():
+                               self._objectShader = opengl.GLShader("""
 varying float light_amount;
 
 void main(void)
@@ -762,15 +766,15 @@ void main(void)
        light_amount = abs(dot(normalize(gl_NormalMatrix * gl_Normal), normalize(gl_LightSource[0].position.xyz)));
        light_amount += 0.2;
 }
-                       ""","""
+                               ""","""
 varying float light_amount;
 
 void main(void)
 {
        gl_FragColor = vec4(gl_Color.xyz * light_amount, gl_Color[3]);
 }
-                       """)
-                       self._objectOverhangShader = opengl.GLShader("""
+                               """)
+                               self._objectOverhangShader = opengl.GLShader("""
 uniform float cosAngle;
 uniform mat3 rotMatrix;
 varying float light_amount;
@@ -787,7 +791,7 @@ void main(void)
                light_amount = -10.0;
        }
 }
-                       ""","""
+                               ""","""
 varying float light_amount;
 
 void main(void)
@@ -799,8 +803,8 @@ void main(void)
                gl_FragColor = vec4(gl_Color.xyz * light_amount, gl_Color[3]);
        }
 }
-                       """)
-                       self._objectLoadShader = opengl.GLShader("""
+                               """)
+                               self._objectLoadShader = opengl.GLShader("""
 uniform float intensity;
 uniform float scale;
 varying float light_amount;
@@ -824,7 +828,11 @@ void main(void)
 {
        gl_FragColor = vec4(gl_Color.xyz * light_amount, 1.0-intensity);
 }
-                       """)
+                               """)
+                       else:
+                               self._objectShader = opengl.GLFakeShader()
+                               self._objectOverhangShader = opengl.GLFakeShader()
+                               self._objectLoadShader = None
                self._init3DView()
                glTranslate(0,0,-self._zoom)
                glRotate(-self._pitch, 1,0,0)
@@ -989,16 +997,17 @@ void main(void)
 
                        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
                        glEnable(GL_BLEND)
-                       self._objectLoadShader.bind()
-                       glColor4f(0.2, 0.6, 1.0, 1.0)
-                       for obj in self._scene.objects():
-                               if obj._loadAnim is None:
-                                       continue
-                               self._objectLoadShader.setUniform('intensity', obj._loadAnim.getPosition())
-                               self._objectLoadShader.setUniform('scale', obj.getBoundaryCircle() / 10)
-                               self._renderObject(obj)
-                       self._objectLoadShader.unbind()
-                       glDisable(GL_BLEND)
+                       if self._objectLoadShader is not None:
+                               self._objectLoadShader.bind()
+                               glColor4f(0.2, 0.6, 1.0, 1.0)
+                               for obj in self._scene.objects():
+                                       if obj._loadAnim is None:
+                                               continue
+                                       self._objectLoadShader.setUniform('intensity', obj._loadAnim.getPosition())
+                                       self._objectLoadShader.setUniform('scale', obj.getBoundaryCircle() / 10)
+                                       self._renderObject(obj)
+                               self._objectLoadShader.unbind()
+                               glDisable(GL_BLEND)
 
                self._drawMachine()
 
index 89d79606e81d696a16b70636ecb22c2ad8b3c780..feebf09317eec6356e6dca6c4994a1762f8c8f07 100644 (file)
@@ -33,6 +33,9 @@ class GLReferenceCounter(object):
                self._refCounter -= 1
                return self._refCounter <= 0
 
+def hasShaderSupport():
+       return glCreateShader != False
+
 class GLShader(GLReferenceCounter):
        def __init__(self, vertexProgram, fragmentProgram):
                super(GLShader, self).__init__()
@@ -82,6 +85,36 @@ class GLShader(GLReferenceCounter):
                if self._program is not None and bool(glDeleteProgram):
                        print "Shader was not properly released!"
 
+#A Class that acts as an OpenGL shader, but in reality is not none.
+class GLFakeShader(GLReferenceCounter):
+       def __init__(self):
+               super(GLFakeShader, self).__init__()
+
+       def bind(self):
+               glEnable(GL_LIGHTING)
+               glEnable(GL_LIGHT0)
+               glEnable(GL_COLOR_MATERIAL)
+               glLightfv(GL_LIGHT0, GL_DIFFUSE, [0.3,0.3,0.3,1])
+               glLightfv(GL_LIGHT0, GL_AMBIENT, [0,0,0,0])
+
+       def unbind(self):
+               glDisable(GL_LIGHTING)
+
+       def release(self):
+               pass
+
+       def setUniform(self, name, value):
+               pass
+
+       def isValid(self):
+               return True
+
+       def getVertexShader(self):
+               return ''
+
+       def getFragmentShader(self):
+               return ''
+
 class GLVBO(GLReferenceCounter):
        def __init__(self, vertexArray, normalArray = None):
                super(GLVBO, self).__init__()