diff --git a/punyverse/glgeom.py b/punyverse/glgeom.py index 5d40977..e1c75f8 100644 --- a/punyverse/glgeom.py +++ b/punyverse/glgeom.py @@ -98,7 +98,7 @@ class Circle(object): position_offset = 0 position_size = 2 - def __init__(self, r, segs): + def __init__(self, r, segs, shader): self.vertex_count = segs buffer = segs * 2 * [0] delta = 2 * pi / segs @@ -107,6 +107,13 @@ class Circle(object): buffer[2*i:2*i+2] = [cos(theta) * r, sin(theta) * r] self.vbo = list_to_gl_buffer(buffer) + self.vao = VAO() + with self.vao: + glBindBuffer(GL_ARRAY_BUFFER, self.vbo) + shader.vertex_attribute('a_position', self.position_size, self.type, GL_FALSE, + self.stride, self.position_offset) + glBindBuffer(GL_ARRAY_BUFFER, 0) + class Disk(object): type = GL_FLOAT @@ -256,13 +263,22 @@ class FontEngine(object): tex_offset = position_size * 2 tex_size = 2 - def __init__(self, max_length=256): + def __init__(self, shader, max_length=256): self.storage = array('h', max_length * 24 * [0]) vbo = GLuint() glGenBuffers(1, byref(vbo)) self.vbo = vbo.value self.vertex_count = None + self.vao = VAO() + with self.vao: + glBindBuffer(GL_ARRAY_BUFFER, self.vbo) + shader.vertex_attribute('a_rc', self.position_size, self.type, GL_FALSE, + self.stride, self.position_offset) + shader.vertex_attribute('a_tex', self.tex_size, self.type, GL_FALSE, + self.stride, self.tex_offset) + glBindBuffer(GL_ARRAY_BUFFER, 0) + def draw(self, string): index = 0 row = 0 @@ -290,8 +306,6 @@ class FontEngine(object): glBindBuffer(GL_ARRAY_BUFFER, self.vbo) glBufferData(GL_ARRAY_BUFFER, self.storage.itemsize * len(self.storage), array_to_ctypes(self.storage), GL_STREAM_DRAW) - - def end(self): glBindBuffer(GL_ARRAY_BUFFER, 0) diff --git a/punyverse/main.py b/punyverse/main.py index ee90565..468ddd0 100644 --- a/punyverse/main.py +++ b/punyverse/main.py @@ -27,7 +27,7 @@ def main(): template = pyglet.gl.Config(depth_size=args.depth, double_buffer=True, sample_buffers=args.multisample > 1, samples=args.multisample, - major_version=3, minor_version=0) + major_version=3, minor_version=2) platform = pyglet.window.get_platform() display = platform.get_default_display() @@ -57,9 +57,11 @@ def main(): loader = LoaderConsole() punyverse = Punyverse(context=context, **create_args) else: + context = config.create_context(None) loader = LoaderWindow(width=INITIAL_WIN_WIDTH, height=INITIAL_WIN_HEIGHT, caption='Punyverse is loading...') - punyverse = Punyverse(config=config, **create_args) + punyverse = Punyverse(context=context, **create_args) + loader.context.set_current() loader.set_main_context(punyverse.context) world = loader.load() diff --git a/punyverse/ui.py b/punyverse/ui.py index 121825b..988e09c 100644 --- a/punyverse/ui.py +++ b/punyverse/ui.py @@ -120,15 +120,14 @@ class Punyverse(pyglet.window.Window): glClearColor(0, 0, 0, 1) glClearDepth(1.0) - glAlphaFunc(GL_GEQUAL, 0.2) glDepthFunc(GL_LEQUAL) glEnable(GL_DEPTH_TEST) glShadeModel(GL_SMOOTH) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) - self.info_engine = FontEngine() - self.circle = Circle(10, 20) + self.info_engine = FontEngine(self.world.activate_shader('text')) + self.circle = Circle(10, 20, self.world.activate_shader('line')) pyglet.clock.schedule(self.update) self.on_resize(self.width, self.height) # On resize handler does nothing unless it's loaded @@ -255,20 +254,15 @@ class Punyverse(pyglet.window.Window): glEnable(GL_BLEND) shader = self.world.activate_shader('text') shader.uniform_mat4('u_projMatrix', projection) - self.info_engine.draw(info) glBindTexture(GL_TEXTURE_2D, self.world.font_tex) shader.uniform_texture('u_alpha', 0) shader.uniform_vec3('u_color', 1, 1, 1) shader.uniform_vec2('u_start', 10, 10) - shader.vertex_attribute('a_rc', self.info_engine.position_size, self.info_engine.type, GL_FALSE, - self.info_engine.stride, self.info_engine.position_offset) - shader.vertex_attribute('a_tex', self.info_engine.tex_size, self.info_engine.type, GL_FALSE, - self.info_engine.stride, self.info_engine.tex_offset) - - glDrawArrays(GL_TRIANGLES, 0, self.info_engine.vertex_count) - self.info_engine.end() + self.info_engine.draw(info) + with self.info_engine.vao: + glDrawArrays(GL_TRIANGLES, 0, self.info_engine.vertex_count) glDisable(GL_BLEND) @@ -277,9 +271,6 @@ class Punyverse(pyglet.window.Window): shader = self.world.activate_shader('line') shader.uniform_vec4('u_color', 0, 1, 0, 1) shader.uniform_mat4('u_mvpMatrix', mvp) - glBindBuffer(GL_ARRAY_BUFFER, self.circle.vbo) - shader.vertex_attribute('a_position', self.circle.position_size, self.circle.type, GL_FALSE, - self.circle.stride, self.circle.position_offset) - glDrawArrays(GL_LINE_LOOP, 0, self.circle.vertex_count) - glBindBuffer(GL_ARRAY_BUFFER, 0) + with self.circle.vao: + glDrawArrays(GL_LINE_LOOP, 0, self.circle.vertex_count) glLineWidth(1)