def setDefaultUniformBindings(shaderProgram): assert glGetIntegerv(GL_CURRENT_PROGRAM) == shaderProgram glUniform1i( lu.getUniformLocationDebug(shaderProgram, "diffuse_texture"), ObjModel.TU_Diffuse) glUniform1i( lu.getUniformLocationDebug(shaderProgram, "opacity_texture"), ObjModel.TU_Opacity) glUniform1i( lu.getUniformLocationDebug(shaderProgram, "specular_texture"), ObjModel.TU_Specular) glUniform1i( lu.getUniformLocationDebug(shaderProgram, "normal_texture"), ObjModel.TU_Normal)
def render(self, shaderProgram=None, renderFlags=None, transforms={}): if not renderFlags: renderFlags = self.RF_All if not shaderProgram: shaderProgram = self.defaultShader # Filter chunks based of render flags chunks = [ch for ch in self.chunks if ch[3] & renderFlags] glBindVertexArray(self.vertexArrayObject) glUseProgram(shaderProgram) # define defaults (identity) defaultTfms = { # "modelToClipTransform" : lu.Mat4(), # "modelToViewTransform" : lu.Mat4(), # "modelToViewNormalTransform" : lu.Mat3(), } # overwrite defaults defaultTfms.update(transforms) # upload map of transforms for tfmName, tfm in defaultTfms.items(): loc = lu.getUniformLocationDebug(shaderProgram, tfmName) tfm._set_open_gl_uniform(loc) previousMaterial = None for material, chunkOffset, chunkCount, renderFlags in chunks: # as an optimization we only do this if the material has changed between chunks. # for more efficiency still consider sorting chunks based on material (or fusing them?) if material != previousMaterial: previousMaterial = material if self.overrideDiffuseTextureWithDefault: bindTexture(self.TU_Diffuse, self.defaultTextureOne, self.defaultTextureOne) else: bindTexture(self.TU_Diffuse, material["texture"]["diffuse"], self.defaultTextureOne) bindTexture(self.TU_Opacity, material["texture"]["opacity"], self.defaultTextureOne) bindTexture(self.TU_Specular, material["texture"]["specular"], self.defaultTextureOne) bindTexture(self.TU_Normal, material["texture"]["normal"], self.defaultNormalTexture) # TODO: can I do uniform buffers from python (yes, I need to use that struct thingo!) #uint32_t matUniformSize = sizeof(MaterialProperties_Std140); #glBindBufferRange(GL_UNIFORM_BUFFER, UBS_MaterialProperties, m_materialPropertiesBuffer, (uint32_t)chunk.material->offset * matUniformSize, matUniformSize); # TODO: this is very slow, it should be packed into an uniform buffer as per above! for k, v in material["color"].items(): glUniform3fv( lu.getUniformLocationDebug(shaderProgram, "material_%s_color" % k), 1, v) glUniform1f( lu.getUniformLocationDebug(shaderProgram, "material_specular_exponent"), material["specularExponent"]) glUniform1f( lu.getUniformLocationDebug(shaderProgram, "material_alpha"), material["alpha"]) glDrawArrays(GL_TRIANGLES, chunkOffset, chunkCount) glUseProgram(0)