From 4aa6374ced2fd58d4125b42224c549a07ece900e Mon Sep 17 00:00:00 2001 From: daid Date: Mon, 17 Jun 2013 09:33:41 +0200 Subject: [PATCH] Implement fallback in case shader support is missing. I still think this is caused by missing OpenGL drivers. But windows users are general idiots. --- Cura/gui/sceneView.py | 47 ++++++++++++++++++++++++----------------- Cura/gui/util/opengl.py | 33 +++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 19 deletions(-) diff --git a/Cura/gui/sceneView.py b/Cura/gui/sceneView.py index ba7d651e..6eb8fc54 100644 --- a/Cura/gui/sceneView.py +++ b/Cura/gui/sceneView.py @@ -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() diff --git a/Cura/gui/util/opengl.py b/Cura/gui/util/opengl.py index 89d79606..feebf093 100644 --- a/Cura/gui/util/opengl.py +++ b/Cura/gui/util/opengl.py @@ -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__() -- 2.30.2