def __init__(self, sizes, surface_type, filter=GL_LINEAR, wrap=GL_CLAMP_TO_EDGE): """ where sizes is a dict some_key -> Size2 textures and surfaces are later accessed by this key """ assert len(sizes) self.surftype = surface_type self.frontbuf, self.backbuf = glGenBuffers(2) self.store = {} self.surfaces = {} offset = 0 self.texnames = tuple(glGenTextures(len(sizes))) texnames = list(self.texnames) for some_key, size in sizes.items(): texname = texnames.pop(0) glBindTexture(GL_TEXTURE_2D, texname) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter) self.store[some_key] = ( texname, size, offset ) offset += size.w*size.h*4 self.bufsize = offset glBindTexture(GL_TEXTURE_2D, 0) glBindBuffer(GL_PIXEL_UNPACK_BUFFER, self.backbuf) glBufferData(GL_PIXEL_UNPACK_BUFFER, self.bufsize, gl_off_t(0), GL_STREAM_DRAW) glBindBuffer(GL_PIXEL_UNPACK_BUFFER, self.frontbuf) glBufferData(GL_PIXEL_UNPACK_BUFFER, self.bufsize, gl_off_t(0), GL_STREAM_DRAW) glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0) self.swap() # initializes self.surfaces.
def upload(self): glBindBuffer(GL_PIXEL_UNPACK_BUFFER, self.frontbuf) glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER) for texname, size, offset in self.store.values(): glBindTexture(GL_TEXTURE_2D, texname) glTexImage2D(GL_TEXTURE_2D, 0, self.surftype.gl_internal_fmt, size.w, size.h, 0, self.surftype.gl_data_fmt, self.surftype.gl_data_type, gl_off_t(offset)) self.swap()