def setFilter(self, min=None, mag=GL_LINEAR): Texture.bind(self) if min is None: if self.useMipmaps: min = GL_LINEAR_MIPMAP_LINEAR else: min = GL_LINEAR glTexParameteri(self.glTarget, GL_TEXTURE_MIN_FILTER, min) glTexParameteri(self.glTarget, GL_TEXTURE_MAG_FILTER, mag)
def setRepeat(self, u=GL_REPEAT, v=GL_REPEAT): Texture.bind(self) glTexParameteri(self.glTarget, GL_TEXTURE_WRAP_S, u) glTexParameteri(self.glTarget, GL_TEXTURE_WRAP_T, v)
def textureSetup(self): # Free memory if we already allocated space for textures. if len(self.animTexs) > 0: glDeleteTextures(self.animTexs) self.animTexs = glGenTextures(len(self.animImgs)) for texIdx, img in enumerate(self.animImgs): animSize = img.get_size() if img.get_alpha is None: color = "RGB" colorGL = GL_RGB else: color = "RGBA" colorGL = GL_RGBA # Log.debug("AnimationPlayer: Image %d format: %s (%dx%d)" % (texIdx, color, animSize[0], animSize[1])) glBindTexture(GL_TEXTURE_2D, self.animTexs[texIdx]) surfaceData = pygame.image.tostring(img, color, True) # Linear filtering glTexImage2D(GL_TEXTURE_2D, 0, 3, animSize[0], animSize[1], 0, colorGL, GL_UNSIGNED_BYTE, surfaceData) # MipMapping # gluBuild2DMipmaps(GL_TEXTURE_2D, colorGL, # animSize[0], animSize[1], colorGL, # GL_UNSIGNED_BYTE, surfaceData) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) Log.debug("AnimationPlayer progress: %d%%" % \ ( 100*(texIdx+1+len(self.animImgs)) / \ (2*len(self.animImgs)) )) # Resize animation (polygon) to respect resolution ratio # (The math is actually simple, take the time to draw it down if required) winRes = float(self.winWidth)/float(self.winHeight) animWidth = float(self.animImgs[0].get_size()[0]) animHeight = float(self.animImgs[0].get_size()[1]) animRes = animWidth/animHeight vtxX = 1.0 vtxY = 1.0 if winRes > animRes: r = float(self.winHeight)/animHeight vtxX = 1.0 - abs(self.winWidth-r*animWidth) / (float(self.winWidth)) elif winRes < animRes: r = float(self.winWidth)/animWidth vtxY = 1.0 - abs(self.winHeight-r*animHeight) / (float(self.winHeight)) # Vertices animVtx = array([[-vtxX, vtxY], [ vtxX, -vtxY], [ vtxX, vtxY], [-vtxX, vtxY], [-vtxX, -vtxY], [ vtxX, -vtxY]], dtype=float32) # Texture coordinates texCoord = array([[0.0, 1.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0], [0.0, 0.0], [1.0, 0.0]], dtype=float32) # Create a compiled OpenGL call list and do array-based drawing # Could have used GL_QUADS but IIRC triangles are recommended self.animList = cmglList() with self.animList: glEnable(GL_TEXTURE_2D) glColor3f(1., 1., 1.) cmglDrawArrays(GL_TRIANGLE_STRIP, vertices=animVtx, texcoords=texCoord) glDisable(GL_TEXTURE_2D)