Exemplo n.º 1
0
 def __init__(self, output, default_font, program=None):
     self.output = output
     self.default_font = default_font
     self.stream = VertexStream(fmt)
     self.textures = TextureCache()
     if program is None:
         self.program = Program.load(in_module('shaders/flat.glsl'))
     else:
         self.program = program
Exemplo n.º 2
0
 def __init__(self, resolution=(1200, 1000)):
     self.flags = HWSURFACE | OPENGL | DOUBLEBUF
     self.resolution = self.last_resolution = resolution
     pygame.display.set_mode(self.resolution, self.flags)
     self.initgl()
     self.listeners = {}
     self.average_latency = 0
     self.cache = Cache([in_module('assets'), os.getcwd(), '.'])
     self.texture_cache = TextureCache()
     self.image_empty = Image(1, 1, "\xff\xff\xff\xff")
Exemplo n.º 3
0
class Argon(object):
    def __init__(self, resolution=(1200, 1000)):
        self.flags = HWSURFACE | OPENGL | DOUBLEBUF
        self.resolution = self.last_resolution = resolution
        pygame.display.set_mode(self.resolution, self.flags)
        self.initgl()
        self.listeners = {}
        self.average_latency = 0
        self.cache = Cache([in_module('assets'), os.getcwd(), '.'])
        self.texture_cache = TextureCache()
        self.image_empty = Image(1, 1, "\xff\xff\xff\xff")

    def initgl(self):
        glEnable(GL_TEXTURE_2D)
        glEnable(GL_BLEND)
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
        self.program = Program.load(in_module('glsl/flat.glsl'))
        self.program_ms = Program.load(in_module('glsl/flat_ms.glsl'))
        self.use_program(self.resolution)
        self.stream = BufferStream(Vertex, GL_TRIANGLES)

    def use_program(self, resolution=None, sample_count=0):
        if resolution == None:
            resolution = self.last_resolution
        if sample_count > 0:
            program = self.program_ms
            program.use()
            program.uniform2f('resolution', resolution)
            program.uniform1i('sample_count', sample_count)
        else:
            program = self.program
            program.use()
            program.uniform2f('resolution', resolution)
        glViewport(0,0,*resolution)

    def listen(self, fn):
        self.listeners[fn.__name__] = fn
        return fn

    def run(self):
        self.running = True
        latencies = []
        while self.running:
            frame_begin = now = time.time()
            self.listeners["on_frame"](now)
            pygame.display.flip()
            now = time.time()
            latencies.append(now - frame_begin)
            if len(latencies) >= 100:
                latencies.pop(0)
            self.average_latency = sum(latencies) / len(latencies)
            for event in pygame.event.get():
                if event.type == QUIT:
                    self.running = False
                if 'on_keydown' in self.listeners and event.type == KEYDOWN:
                    name = keyboard.bindings.get(event.key, None)
                    modifiers = frozenset(keyboard.parse_modifiers(event.mod))
                    self.listeners["on_keydown"](name, modifiers, event.unicode)
                if 'on_keyup' in self.listeners and event.type == KEYUP:
                    name = keyboard.bindings.get(event.key, None)
                    modifiers = frozenset(keyboard.parse_modifiers(event.mod))
                    self.listeners["on_keyup"](name, modifiers)
                if 'on_mousedown' in self.listeners and event.type == MOUSEBUTTONDOWN:
                    self.listeners["on_mousedown"](event.button, event.pos)
                if 'on_mouseup' in self.listeners and event.type == MOUSEBUTTONUP:
                    self.listeners["on_mouseup"](event.button, event.pos)
                if 'on_mousemotion' in self.listeners and event.type == MOUSEMOTION:
                    self.listeners["on_mousemotion"](event.pos, event.rel)

    def clear(self, color=rgba(255,255,255)):
        r,g,b,a = color
        glClearColor(r/255.0, g/255.0, b/255.0, a/255.0)
        glClear(GL_COLOR_BUFFER_BIT)

    def viewport(self, x, y, w, h):
        glViewport(x,y,w,h)

    def render_rectangle(self, rect, image=None, color=rgba(255,255,255,255), gradient=None):
        image = self.image_empty if image is None else image
        if isinstance(image, Patch9):
            patch9 = image
            image = image.image
        else:
            patch9 = None
        if isinstance(color, rgba):
            color = tuple(color)
        if gradient is None:
            gradient = color, color, color, color
        texture = self.texture_cache.get(image)
        texture.bind()
        stream = self.stream
        stream.begin(self.program)
        if patch9 is None:
            quad(stream, rect, (0,1,1,0), gradient)
        else:
            quad(stream, *patch9.cell(rect, gradient, 0, 0))
            quad(stream, *patch9.cell(rect, gradient, 1, 0))
            quad(stream, *patch9.cell(rect, gradient, 2, 0))
            quad(stream, *patch9.cell(rect, gradient, 0, 1))
            quad(stream, *patch9.cell(rect, gradient, 1, 1))
            quad(stream, *patch9.cell(rect, gradient, 2, 1))
            quad(stream, *patch9.cell(rect, gradient, 0, 2))
            quad(stream, *patch9.cell(rect, gradient, 1, 2))
            quad(stream, *patch9.cell(rect, gradient, 2, 2))
        stream.end()
        texture.unbind()

    def render_text(self, (x,y), text, font, color=rgba(255,255,255,255), gradient=None):
Exemplo n.º 4
0
class Renderer(object):
    def __init__(self, output, default_font, program=None):
        self.output = output
        self.default_font = default_font
        self.stream = VertexStream(fmt)
        self.textures = TextureCache()
        if program is None:
            self.program = Program.load(in_module('shaders/flat.glsl'))
        else:
            self.program = program

    def bind(self):
        self.output.bind()
        self.program.use()
        self.program.uniform2f('resolution', (self.output.width, self.output.height))
        glViewport(0, 0, self.output.width, self.output.height)
        self.stream.vbo.bind()
        fmt.use(self.program)

    def unbind(self):
        fmt.enduse(self.program)
        self.stream.vbo.unbind()
        self.program.enduse()
        self.output.unbind()

    def rectangle(self, rect, image=image_empty, color=white, gradient=None):
        if isinstance(image, Patch9) and gradient is None:
            patch9 = image
            image  = image.image
            texture = self.textures.get(image)
            texture.bind()
            patch9_cell_flat(self.stream, patch9, 0, 0, rect, color)
            patch9_cell_flat(self.stream, patch9, 1, 0, rect, color)
            patch9_cell_flat(self.stream, patch9, 2, 0, rect, color)
            patch9_cell_flat(self.stream, patch9, 0, 1, rect, color)
            patch9_cell_flat(self.stream, patch9, 1, 1, rect, color)
            patch9_cell_flat(self.stream, patch9, 2, 1, rect, color)
            patch9_cell_flat(self.stream, patch9, 0, 2, rect, color)
            patch9_cell_flat(self.stream, patch9, 1, 2, rect, color)
            patch9_cell_flat(self.stream, patch9, 2, 2, rect, color)
            self.stream.flush()
            texture.unbind()
        elif isinstance(image, Patch9):
            patch9 = image
            image  = image.image
            texture = self.textures.get(image)
            texture.bind()
            patch9_cell_gradient(self.stream, 0, 0, rect, gradient)
            patch9_cell_gradient(self.stream, 1, 0, rect, gradient)
            patch9_cell_gradient(self.stream, 2, 0, rect, gradient)
            patch9_cell_gradient(self.stream, 0, 1, rect, gradient)
            patch9_cell_gradient(self.stream, 1, 1, rect, gradient)
            patch9_cell_gradient(self.stream, 2, 1, rect, gradient)
            patch9_cell_gradient(self.stream, 0, 2, rect, gradient)
            patch9_cell_gradient(self.stream, 1, 2, rect, gradient)
            patch9_cell_gradient(self.stream, 2, 2, rect, gradient)
            self.stream.flush()
            texture.unbind()
        else:
            if gradient is None:
                gradient = color, color, color, color
            texture = self.textures.get(image)
            texture.bind()
            quad_gradient(self.stream, rect, (0,1,1,0), gradient)
            self.stream.flush()
            texture.unbind()

    def text(self, pos, text, font=None, color=white):
        font = self.default_font if font is None else font
        texture = self.textures.get(font.image)
        texture.bind()
        characters_flat(self.stream, font, pos, text, color)
        self.stream.flush()
        texture.unbind()