def set(self, data): cls = type(self) glActiveTexture(GL_TEXTURE0 + cls.currentSampler) tex = texture.getTexture(data) if tex not in (False, None): glBindTexture(self.target, tex.textureId) glUniform1i(self.index, cls.currentSampler) cls.currentSampler += 1
def set(self, data): cls = type(self) glActiveTexture(GL_TEXTURE0 + cls.currentSampler) if data is not None: tex = texture.getTexture(data) else: tex = None if tex not in (False, None): glBindTexture(self.target, tex.textureId) else: tex = texture.getTexture(texture.NOTFOUND_TEXTURE) if tex in (None, False): glBindTexture(self.target, 0) else: glBindTexture(self.target, tex.textureId) glUniform1i(self.index, cls.currentSampler) cls.currentSampler += 1
def set(self, data): cls = type(self) glActiveTexture(GL_TEXTURE0 + cls.currentSampler) if data is not None: tex = texture.getTexture(data) else: tex = None if tex not in (False, None): glBindTexture(self.target, tex.textureId) else: tex = texture.getTexture(texture.NOTFOUND_TEXTURE) if tex in (None, False): glBindTexture(self.target, 0) else: glBindTexture(self.target, tex.textureId) try: glUniform1i(self.location, cls.currentSampler) except GLerror as err: log.error("%s", err.description) cls.currentSampler += 1
def textureTex(self): if self._texturePath != self.parent.texture: self._textureTex = None if self._textureTex is False: return None if self._textureTex is None: self._texturePath = self.parent.texture if self._texturePath is None: self._textureTex = None else: self._textureTex = texture.getTexture(self._texturePath) if self._textureTex is False: return None return self._textureTex
def drawMesh(obj): if not obj.visibility: return if G.args.get('fullloggingopengl', False): log.debug("Rendering mesh %s", obj.name) glDepthFunc(GL_LEQUAL) # Transform the current object glPushMatrix() transformObject(obj) glColor3f(1.0, 1.0, 1.0) useShader = obj.shader and obj.solid and not obj.shadeless if not useShader: if obj.isTextured and obj.texture and obj.solid: # Bind texture for fixed function shading if have_activeTexture: glActiveTexture(GL_TEXTURE0) glEnable(GL_TEXTURE_2D) tex = getTexture(obj.texture) if tex not in (False, None): glBindTexture(GL_TEXTURE_2D, tex.textureId) else: glBindTexture(GL_TEXTURE_2D, TEX_NOT_FOUND.textureId) if have_activeTexture: for gl_tex_idx in range(GL_TEXTURE0 + 1, GL_TEXTURE0 + MAX_TEXTURE_UNITS): glActiveTexture(gl_tex_idx) glBindTexture(GL_TEXTURE_2D, 0) glDisable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_1D, 0) glDisable(GL_TEXTURE_1D) else: # Disable all textures (when in fixed function textureless shading mode) for gl_tex_idx in range(GL_TEXTURE0, GL_TEXTURE0 + MAX_TEXTURE_UNITS): if have_activeTexture: glActiveTexture(gl_tex_idx) glBindTexture(GL_TEXTURE_2D, 0) glDisable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_1D, 0) glDisable(GL_TEXTURE_1D) if obj.nTransparentPrimitives: # TODO not needed for alpha-to-coverage rendering (it's face order independent) # TODO for other pipelines/older harware better to statically sort faces of hair meshes around BBox center #obj.sortFaces() pass # Fill the array pointers with object mesh data if obj.hasUVs: glEnableClientState(GL_TEXTURE_COORD_ARRAY) glTexCoordPointer(2, GL_FLOAT, 0, obj.UVs) glEnableClientState(GL_VERTEX_ARRAY) glVertexPointer(3, GL_FLOAT, 0, obj.verts) glEnableClientState(GL_NORMAL_ARRAY) glNormalPointer(GL_FLOAT, 0, obj.norms) glEnableClientState(GL_COLOR_ARRAY) if not useShader and obj.solid: # Vertex colors should be multiplied with the diffuse material value, also for fixed function # (with the exception of wireframe rendering) glColorPointer(4, GL_UNSIGNED_BYTE, 0, obj.color_diff) else: glColorPointer(4, GL_UNSIGNED_BYTE, 0, obj.color) # Disable lighting if the object is shadeless if obj.shadeless: glDisable(GL_LIGHTING) else: glEnable(GL_LIGHTING) if obj.cull: glEnable(GL_CULL_FACE) glCullFace(GL_BACK if obj.cull > 0 else GL_FRONT) else: glDisable(GL_CULL_FACE) if obj.solid: # Set material properties mat = obj.material MatAmb = A(mat.ambientColor.values, 1.0) # Material - Ambient MatDif = A(mat.diffuseColor.values, mat.opacity) # Material - Diffuse MatSpc = A(mat.specularColor.values, 1.0) # Material - Specular MatShn = A(128 * mat.shininess) # Material - Shininess MatEms = A(mat.emissiveColor.values, 1.0) # Material - Emission else: # Wireframe # Set some default material properties MatAmb = A(0.11, 0.11, 0.11, 1.0) # Material - Ambient Values MatDif = A(1.0, 1.0, 1.0, 1.0) # Material - Diffuse Values MatSpc = A(0.2, 0.2, 0.2, 1.0) # Material - Specular Values MatShn = A(10.0, ) # Material - Shininess MatEms = A(0.0, 0.0, 0.0, 1.0) # Material - Emission Values glMaterialfv(GL_FRONT, GL_AMBIENT, MatAmb) # Set Material Ambience glMaterialfv(GL_FRONT, GL_DIFFUSE, MatDif) # Set Material Diffuse glMaterialfv(GL_FRONT, GL_SPECULAR, MatSpc) # Set Material Specular glMaterialfv(GL_FRONT, GL_SHININESS, MatShn) # Set Material Shininess glMaterialfv(GL_FRONT, GL_EMISSION, MatEms) # Set Material Emission if obj.useVertexColors: # Vertex colors affect materials (lighting is enabled) glEnable(GL_COLOR_MATERIAL) # Vertex colors affect diffuse of material glColorMaterial(GL_FRONT, GL_DIFFUSE) else: glDisable(GL_COLOR_MATERIAL) # Enable the shader if the driver supports it and there is a shader assigned if useShader: glUseProgram(obj.shader) # Set custom attributes if obj.shaderObj.requiresVertexTangent(): glVertexAttribPointer(obj.shaderObj.vertexTangentAttrId, 4, GL_FLOAT, GL_FALSE, 0, obj.tangents) glEnableVertexAttribArray(obj.shaderObj.vertexTangentAttrId) # TODO # This should be optimized, since we only need to do it when it's changed # Validation should also only be done when it is set obj.shaderObj.setUniforms(obj.shaderParameters) elif Shader.supported(): glUseProgram(0) # draw the mesh if not obj.solid: # Wireframe drawing glEnable(GL_COLOR_MATERIAL) glDisableClientState(GL_COLOR_ARRAY) glColor3f(0.0, 0.0, 0.0) glDisable(GL_LIGHTING) glColorMaterial( GL_FRONT, GL_AMBIENT_AND_DIFFUSE ) # Vertex colors affect ambient and diffuse of material glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) glDrawElements(g_primitiveMap[obj.vertsPerPrimitive - 1], obj.primitives.size, GL_UNSIGNED_INT, obj.primitives) glEnableClientState(GL_COLOR_ARRAY) glEnable(GL_LIGHTING) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) glEnable(GL_POLYGON_OFFSET_FILL) glPolygonOffset(1.0, 1.0) glDrawElements(g_primitiveMap[obj.vertsPerPrimitive - 1], obj.primitives.size, GL_UNSIGNED_INT, obj.primitives) glDisable(GL_POLYGON_OFFSET_FILL) glDisable(GL_COLOR_MATERIAL) elif obj.nTransparentPrimitives: if have_multisample and obj.alphaToCoverage: # Enable alpha-to-coverage (also called CSAA) # using the multisample buffer for alpha to coverage disables its use for MSAA (anti-aliasing) glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE) #glEnable(GL_SAMPLE_ALPHA_TO_ONE) # Enable this if transparent objects are too transparent glDisable(GL_BLEND) # Disable alpha blending else: glDepthMask(GL_FALSE) glEnable(GL_ALPHA_TEST) glAlphaFunc(GL_GREATER, 0.0) glDrawElements(g_primitiveMap[obj.vertsPerPrimitive - 1], obj.primitives.size, GL_UNSIGNED_INT, obj.primitives) glDisable(GL_ALPHA_TEST) if have_multisample and obj.alphaToCoverage: glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE) glEnable(GL_BLEND) else: glDepthMask(GL_TRUE) elif obj.depthless: glDepthMask(GL_FALSE) glDisable(GL_DEPTH_TEST) glDrawElements(g_primitiveMap[obj.vertsPerPrimitive - 1], obj.primitives.size, GL_UNSIGNED_INT, obj.primitives) glEnable(GL_DEPTH_TEST) glDepthMask(GL_TRUE) else: glDrawElements(g_primitiveMap[obj.vertsPerPrimitive - 1], obj.primitives.size, GL_UNSIGNED_INT, obj.primitives) if obj.solid and not obj.nTransparentPrimitives: glDisableClientState(GL_COLOR_ARRAY) for i, (start, count) in enumerate(obj.groups): color = obj.gcolor(i) if color is None or np.all(color[:3] == 255): continue glColor4ub(*color) indices = obj.primitives[start:start + count, :] glDrawElements(g_primitiveMap[obj.vertsPerPrimitive - 1], indices.size, GL_UNSIGNED_INT, indices) glEnableClientState(GL_COLOR_ARRAY) # Disable the shader if the driver supports it and there is a shader assigned if useShader: glUseProgram(0) # Restore state defaults if have_activeTexture: glActiveTexture(GL_TEXTURE0) glDisable(GL_CULL_FACE) glColor3f(1.0, 1.0, 1.0) glColorMaterial(GL_FRONT, GL_DIFFUSE) if obj.useVertexColors: glDisable(GL_COLOR_MATERIAL) # Disable custom vertex arrays again if useShader and obj.shaderObj.requiresVertexTangent(): glDisableVertexAttribArray(obj.shaderObj.vertexTangentAttrId) # Re-enable lighting if it was disabled glEnable(GL_LIGHTING) glColorMaterial(GL_FRONT, GL_DIFFUSE) if obj.isTextured and obj.texture and obj.solid: glDisable(GL_TEXTURE_2D) if obj.hasUVs: glDisableClientState(GL_TEXTURE_COORD_ARRAY) glPopMatrix()
def OnInit(): try: # Start with writing relevant info to the debug dump in case stuff goes # wrong at a later time debugdump.dump.appendGL() debugdump.dump.appendMessage( "GL.VENDOR: " + str(glGetString(GL_VENDOR), encoding='UTF-8')) debugdump.dump.appendMessage( "GL.RENDERER: " + str(glGetString(GL_RENDERER), encoding='UTF-8')) debugdump.dump.appendMessage( "GL.VERSION: " + str(glGetString(GL_VERSION), encoding='UTF-8')) debugdump.dump.appendMessage( "GLSL.VERSION: " + str(Shader.glslVersionStr(), encoding='UTF-8')) except Exception as e: log.error("Failed to write GL debug info to debug dump: %s", format(str(e))) global have_multisample if G.args.get('nomultisampling', False): have_multisample = False else: have_multisample = glInitMultisampleARB() try: # Number of samples is setup in the QGLWidget context nb_samples = glGetInteger(OpenGL.GL.ARB.multisample.GL_SAMPLES_ARB) debugdump.dump.appendMessage( "GL.EXTENSION: GL_ARB_multisample %s (%sx samples)" % ("enabled" if have_multisample else "not available", nb_samples)) except Exception as e: log.error("Failed to write GL debug info to debug dump: %s", format(str(e))) global have_activeTexture have_activeTexture = bool(glActiveTexture) global MAX_TEXTURE_UNITS if have_activeTexture: MAX_TEXTURE_UNITS = glGetInteger(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS) else: MAX_TEXTURE_UNITS = 1 # Set global scene ambient glLightModelfv(GL_LIGHT_MODEL_AMBIENT, A(0.0, 0.0, 0.0, 1.0)) # Lights and materials lightPos = A(-10.99, 20.0, 20.0, 1.0) # Light - Position ambientLight = A(0.0, 0.0, 0.0, 1.0) # Light - Ambient Values diffuseLight = A(1.0, 1.0, 1.0, 1.0) # Light - Diffuse Values specularLight = A(1.0, 1.0, 1.0, 1.0) # Light - Specular Values MatAmb = A(0.11, 0.11, 0.11, 1.0) # Material - Ambient Values MatDif = A(1.0, 1.0, 1.0, 1.0) # Material - Diffuse Values MatSpc = A(0.2, 0.2, 0.2, 1.0) # Material - Specular Values MatShn = A(10.0, ) # Material - Shininess MatEms = A(0.0, 0.0, 0.0, 1.0) # Material - Emission Values glEnable(GL_DEPTH_TEST) # Hidden surface removal # glEnable(GL_CULL_FACE) # Inside face removal # glEnable(GL_ALPHA_TEST) # glAlphaFunc(GL_GREATER, 0.0) glDisable(GL_DITHER) glEnable(GL_LIGHTING) # Enable lighting # TODO set light properties based on selected scene glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight) glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight) glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight) glLightfv(GL_LIGHT0, GL_POSITION, lightPos) glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR ) # If we enable this, we have stronger specular highlights glMaterialfv(GL_FRONT, GL_AMBIENT, MatAmb) # Set Material Ambience glMaterialfv(GL_FRONT, GL_DIFFUSE, MatDif) # Set Material Diffuse glMaterialfv(GL_FRONT, GL_SPECULAR, MatSpc) # Set Material Specular glMaterialfv(GL_FRONT, GL_SHININESS, MatShn) # Set Material Shininess glMaterialfv(GL_FRONT, GL_EMISSION, MatEms) # Set Material Emission glEnable(GL_LIGHT0) glEnable(GL_COLOR_MATERIAL ) # Vertex colors affect materials (lighting is enabled) glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE ) # Vertex colors affect ambient and diffuse of material # glEnable(GL_TEXTURE_2D) glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) # Activate and specify pointers to vertex and normal array glEnableClientState(GL_NORMAL_ARRAY) glEnableClientState(GL_COLOR_ARRAY) glEnableClientState(GL_VERTEX_ARRAY) if have_multisample: glEnable(GL_MULTISAMPLE) #glSampleCoverage(1.0, GL_FALSE) # TODO probably not needed, is used for GL_SAMPLE_COVERAGE, which we do not use (do not confuse with GL_SAMPLE_ALPHA_TO_COVERAGE) #glSampleCoverageARB(1.0, GL_FALSE) # TODO flip mask each time global TEX_NOT_FOUND TEX_NOT_FOUND = getTexture(NOTFOUND_TEXTURE) if TEX_NOT_FOUND in (None, False): log.error('Unable to load texture %s, this might cause errors.', NOTFOUND_TEXTURE)
def drawMesh(obj): if not obj.visibility: return if G.args.get('fullloggingopengl', False): log.debug("Rendering mesh %s", obj.name) glDepthFunc(GL_LEQUAL) # Transform the current object glPushMatrix() transformObject(obj) glColor3f(1.0, 1.0, 1.0) useShader = obj.shader and obj.solid and not obj.shadeless if not useShader: if obj.isTextured and obj.texture and obj.solid: # Bind texture for fixed function shading if have_activeTexture: glActiveTexture(GL_TEXTURE0) glEnable(GL_TEXTURE_2D) tex = getTexture(obj.texture) if tex not in (False, None): glBindTexture(GL_TEXTURE_2D, tex.textureId) else: glBindTexture(GL_TEXTURE_2D, TEX_NOT_FOUND.textureId) if have_activeTexture: for gl_tex_idx in xrange(GL_TEXTURE0 + 1, GL_TEXTURE0 + MAX_TEXTURE_UNITS): glActiveTexture(gl_tex_idx) glBindTexture(GL_TEXTURE_2D, 0) glDisable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_1D, 0) glDisable(GL_TEXTURE_1D) else: # Disable all textures (when in fixed function textureless shading mode) for gl_tex_idx in xrange(GL_TEXTURE0, GL_TEXTURE0 + MAX_TEXTURE_UNITS): if have_activeTexture: glActiveTexture(gl_tex_idx) glBindTexture(GL_TEXTURE_2D, 0) glDisable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_1D, 0) glDisable(GL_TEXTURE_1D) if obj.nTransparentPrimitives: # TODO not needed for alpha-to-coverage rendering (it's face order independent) # TODO for other pipelines/older harware better to statically sort faces of hair meshes around BBox center #obj.sortFaces() pass # Fill the array pointers with object mesh data if obj.hasUVs: glEnableClientState(GL_TEXTURE_COORD_ARRAY) glTexCoordPointer(2, GL_FLOAT, 0, obj.UVs) glEnableClientState(GL_VERTEX_ARRAY) glVertexPointer(3, GL_FLOAT, 0, obj.verts) glEnableClientState(GL_NORMAL_ARRAY) glNormalPointer(GL_FLOAT, 0, obj.norms) glEnableClientState(GL_COLOR_ARRAY) if not useShader and obj.solid: # Vertex colors should be multiplied with the diffuse material value, also for fixed function # (with the exception of wireframe rendering) glColorPointer(4, GL_UNSIGNED_BYTE, 0, obj.color_diff) else: glColorPointer(4, GL_UNSIGNED_BYTE, 0, obj.color) # Disable lighting if the object is shadeless if obj.shadeless: glDisable(GL_LIGHTING) else: glEnable(GL_LIGHTING) if obj.cull: glEnable(GL_CULL_FACE) glCullFace(GL_BACK if obj.cull > 0 else GL_FRONT) else: glDisable(GL_CULL_FACE) if obj.solid: # Set material properties mat = obj.material MatAmb = A(mat.ambientColor.values, 1.0) # Material - Ambient MatDif = A(mat.diffuseColor.values, mat.opacity) # Material - Diffuse MatSpc = A(mat.specularColor.values, 1.0) # Material - Specular MatShn = A(128 * mat.shininess) # Material - Shininess MatEms = A(mat.emissiveColor.values, 1.0) # Material - Emission else: # Wireframe # Set some default material properties MatAmb = A(0.11, 0.11, 0.11, 1.0) # Material - Ambient Values MatDif = A(1.0, 1.0, 1.0, 1.0) # Material - Diffuse Values MatSpc = A(0.2, 0.2, 0.2, 1.0) # Material - Specular Values MatShn = A(10.0,) # Material - Shininess MatEms = A(0.0, 0.0, 0.0, 1.0) # Material - Emission Values glMaterialfv(GL_FRONT, GL_AMBIENT, MatAmb) # Set Material Ambience glMaterialfv(GL_FRONT, GL_DIFFUSE, MatDif) # Set Material Diffuse glMaterialfv(GL_FRONT, GL_SPECULAR, MatSpc) # Set Material Specular glMaterialfv(GL_FRONT, GL_SHININESS, MatShn) # Set Material Shininess glMaterialfv(GL_FRONT, GL_EMISSION, MatEms) # Set Material Emission if obj.useVertexColors: # Vertex colors affect materials (lighting is enabled) glEnable(GL_COLOR_MATERIAL) # Vertex colors affect diffuse of material glColorMaterial(GL_FRONT, GL_DIFFUSE) else: glDisable(GL_COLOR_MATERIAL) # Enable the shader if the driver supports it and there is a shader assigned if useShader: glUseProgram(obj.shader) # Set custom attributes if obj.shaderObj.requiresVertexTangent(): glVertexAttribPointer(obj.shaderObj.vertexTangentAttrId, 4, GL_FLOAT, GL_FALSE, 0, obj.tangents) glEnableVertexAttribArray(obj.shaderObj.vertexTangentAttrId) # TODO # This should be optimized, since we only need to do it when it's changed # Validation should also only be done when it is set obj.shaderObj.setUniforms(obj.shaderParameters) elif Shader.supported(): glUseProgram(0) # draw the mesh if not obj.solid: # Wireframe drawing glEnable(GL_COLOR_MATERIAL) glDisableClientState(GL_COLOR_ARRAY) glColor3f(0.0, 0.0, 0.0) glDisable(GL_LIGHTING) glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE) # Vertex colors affect ambient and diffuse of material glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) glDrawElements(g_primitiveMap[obj.vertsPerPrimitive-1], obj.primitives.size, GL_UNSIGNED_INT, obj.primitives) glEnableClientState(GL_COLOR_ARRAY) glEnable(GL_LIGHTING) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) glEnable(GL_POLYGON_OFFSET_FILL) glPolygonOffset(1.0, 1.0) glDrawElements(g_primitiveMap[obj.vertsPerPrimitive-1], obj.primitives.size, GL_UNSIGNED_INT, obj.primitives) glDisable(GL_POLYGON_OFFSET_FILL) glDisable(GL_COLOR_MATERIAL) elif obj.nTransparentPrimitives: if have_multisample and obj.alphaToCoverage: # Enable alpha-to-coverage (also called CSAA) # using the multisample buffer for alpha to coverage disables its use for MSAA (anti-aliasing) glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE) #glEnable(GL_SAMPLE_ALPHA_TO_ONE) # Enable this if transparent objects are too transparent glDisable(GL_BLEND) # Disable alpha blending else: glDepthMask(GL_FALSE) glEnable(GL_ALPHA_TEST) glAlphaFunc(GL_GREATER, 0.0) glDrawElements(g_primitiveMap[obj.vertsPerPrimitive-1], obj.primitives.size, GL_UNSIGNED_INT, obj.primitives) glDisable(GL_ALPHA_TEST) if have_multisample and obj.alphaToCoverage: glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE) glEnable(GL_BLEND) else: glDepthMask(GL_TRUE) elif obj.depthless: glDepthMask(GL_FALSE) glDisable(GL_DEPTH_TEST) glDrawElements(g_primitiveMap[obj.vertsPerPrimitive-1], obj.primitives.size, GL_UNSIGNED_INT, obj.primitives) glEnable(GL_DEPTH_TEST) glDepthMask(GL_TRUE) else: glDrawElements(g_primitiveMap[obj.vertsPerPrimitive-1], obj.primitives.size, GL_UNSIGNED_INT, obj.primitives) if obj.solid and not obj.nTransparentPrimitives: glDisableClientState(GL_COLOR_ARRAY) for i, (start, count) in enumerate(obj.groups): color = obj.gcolor(i) if color is None or np.all(color[:3] == 255): continue glColor4ub(*color) indices = obj.primitives[start:start+count,:] glDrawElements(g_primitiveMap[obj.vertsPerPrimitive-1], indices.size, GL_UNSIGNED_INT, indices) glEnableClientState(GL_COLOR_ARRAY) # Disable the shader if the driver supports it and there is a shader assigned if useShader: glUseProgram(0) # Restore state defaults if have_activeTexture: glActiveTexture(GL_TEXTURE0) glDisable(GL_CULL_FACE) glColor3f(1.0, 1.0, 1.0) glColorMaterial(GL_FRONT, GL_DIFFUSE) if obj.useVertexColors: glDisable(GL_COLOR_MATERIAL) # Disable custom vertex arrays again if useShader and obj.shaderObj.requiresVertexTangent(): glDisableVertexAttribArray(obj.shaderObj.vertexTangentAttrId) # Re-enable lighting if it was disabled glEnable(GL_LIGHTING) glColorMaterial(GL_FRONT, GL_DIFFUSE) if obj.isTextured and obj.texture and obj.solid: glDisable(GL_TEXTURE_2D) if obj.hasUVs: glDisableClientState(GL_TEXTURE_COORD_ARRAY) glPopMatrix()
def OnInit(): try: # Start with writing relevant info to the debug dump in case stuff goes # wrong at a later time debugdump.dump.appendGL() debugdump.dump.appendMessage("GL.VENDOR: " + glGetString(GL_VENDOR)) debugdump.dump.appendMessage("GL.RENDERER: " + glGetString(GL_RENDERER)) debugdump.dump.appendMessage("GL.VERSION: " + glGetString(GL_VERSION)) debugdump.dump.appendMessage("GLSL.VERSION: " + Shader.glslVersionStr()) except Exception as e: log.error("Failed to write GL debug info to debug dump: %s", format(str(e))) global have_multisample if G.args.get('nomultisampling', False): have_multisample = False else: have_multisample = glInitMultisampleARB() try: # Number of samples is setup in the QGLWidget context nb_samples = glGetInteger(OpenGL.GL.ARB.multisample.GL_SAMPLES_ARB) debugdump.dump.appendMessage("GL.EXTENSION: GL_ARB_multisample %s (%sx samples)" % ("enabled" if have_multisample else "not available", nb_samples)) except Exception as e: log.error("Failed to write GL debug info to debug dump: %s", format(str(e))) global have_activeTexture have_activeTexture = bool(glActiveTexture) global MAX_TEXTURE_UNITS if have_activeTexture: MAX_TEXTURE_UNITS = glGetInteger(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS) else: MAX_TEXTURE_UNITS = 1 # Set global scene ambient glLightModelfv(GL_LIGHT_MODEL_AMBIENT, A(0.0, 0.0, 0.0, 1.0)) # Lights and materials lightPos = A( -10.99, 20.0, 20.0, 1.0) # Light - Position ambientLight = A(0.0, 0.0, 0.0, 1.0) # Light - Ambient Values diffuseLight = A(1.0, 1.0, 1.0, 1.0) # Light - Diffuse Values specularLight = A(1.0, 1.0, 1.0, 1.0) # Light - Specular Values MatAmb = A(0.11, 0.11, 0.11, 1.0) # Material - Ambient Values MatDif = A(1.0, 1.0, 1.0, 1.0) # Material - Diffuse Values MatSpc = A(0.2, 0.2, 0.2, 1.0) # Material - Specular Values MatShn = A(10.0,) # Material - Shininess MatEms = A(0.0, 0.0, 0.0, 1.0) # Material - Emission Values glEnable(GL_DEPTH_TEST) # Hidden surface removal # glEnable(GL_CULL_FACE) # Inside face removal # glEnable(GL_ALPHA_TEST) # glAlphaFunc(GL_GREATER, 0.0) glDisable(GL_DITHER) glEnable(GL_LIGHTING) # Enable lighting # TODO set light properties based on selected scene glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight) glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight) glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight) glLightfv(GL_LIGHT0, GL_POSITION, lightPos) glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR) # If we enable this, we have stronger specular highlights glMaterialfv(GL_FRONT, GL_AMBIENT, MatAmb) # Set Material Ambience glMaterialfv(GL_FRONT, GL_DIFFUSE, MatDif) # Set Material Diffuse glMaterialfv(GL_FRONT, GL_SPECULAR, MatSpc) # Set Material Specular glMaterialfv(GL_FRONT, GL_SHININESS, MatShn) # Set Material Shininess glMaterialfv(GL_FRONT, GL_EMISSION, MatEms) # Set Material Emission glEnable(GL_LIGHT0) glEnable(GL_COLOR_MATERIAL) # Vertex colors affect materials (lighting is enabled) glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE) # Vertex colors affect ambient and diffuse of material # glEnable(GL_TEXTURE_2D) glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) # Activate and specify pointers to vertex and normal array glEnableClientState(GL_NORMAL_ARRAY) glEnableClientState(GL_COLOR_ARRAY) glEnableClientState(GL_VERTEX_ARRAY) if have_multisample: glEnable(GL_MULTISAMPLE) #glSampleCoverage(1.0, GL_FALSE) # TODO probably not needed, is used for GL_SAMPLE_COVERAGE, which we do not use (do not confuse with GL_SAMPLE_ALPHA_TO_COVERAGE) #glSampleCoverageARB(1.0, GL_FALSE) # TODO flip mask each time global TEX_NOT_FOUND TEX_NOT_FOUND = getTexture(NOTFOUND_TEXTURE) if TEX_NOT_FOUND in (None, False): log.error('Unable to load texture %s, this might cause errors.', NOTFOUND_TEXTURE)
def __call__(self, data): cls = type(self) glActiveTexture(GL_TEXTURE0 + cls.currentSampler) glBindTexture(self.target, texture.getTexture(data).textureId) glUniform1i(self.index, cls.currentSampler) cls.currentSampler += 1