Skip to main content

TextureCoordinateArithmetic — wiki

This class allows OpenGL texture coordinates to be easily scaled and translated Access the coordinates by index.
Index 0: left bottom
Index 1: left top
Index 2: right top
Index 3: right bottom


Be warned that __getitem__ operations are rather slow, so avoid using this class in an inner render loop.

class Coords(object):
    """
    A type for managing texture coordinates.
    Use * and / for scaling, + and - for translating.
    """

    def __init__(self, lrbt=(0.0,1.0,0.0,1.0)):
        self.lrbt = list(lrbt)
        
    def __repr__(self):
        return repr((self[0],self[1],self[2],self[3]))
        
    def __imul__(self, scalar):
        self.lrbt[:] = [i * scalar for i in self.lrbt]
        return self
        
    def __idiv__(self, scalar):
        self.lrbt[:] = [i / scalar for i in self.lrgb]
        return self
    
    def __iadd__(self, vec2):
        self.lrbt[0] += vec2[0]
        self.lrbt[1] += vec2[0]
        self.lrbt[2] += vec2[1]
        self.lrbt[3] += vec2[1]
        return self
        
    def __isub__(self, vec2):
        self.lrbt[0] -= vec2[0]
        self.lrbt[1] -= vec2[0]
        self.lrbt[2] -= vec2[1]
        self.lrbt[3] -= vec2[1]
        return self

    def __mul__(self, scalar):
        return Coords([i * scalar for i in self.lrbt])

    def __div__(self, scalar):
        return Coords([i / scalar for i in self.lrbt])

    def __add__(self, vec2):
        return Coords((self.lrbt[0]+vec2[0],
                       self.lrbt[1]+vec2[0],
                       self.lrbt[2]+vec2[1],
                       self.lrbt[3]+vec2[1]))

    def __sub__(self, vec2):
        return Coords((self.lrbt[0]-vec2[0],
                       self.lrbt[1]-vec2[0],
                       self.lrbt[2]-vec2[1],
                       self.lrbt[3]-vec2[1]))
        
    def __getitem__(self, i):
        if i == 0:
            return self.lrbt[0], self.lrbt[2]
        elif i == 1:
            return self.lrbt[0], self.lrbt[3]
        elif i == 2:
            return self.lrbt[1], self.lrbt[3]
        elif i == 3:
            return self.lrbt[1], self.lrbt[2]
        else:
            raise IndexError