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 __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")
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):
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()