from Context import Context from Buffer import Buffer from Shader import Shader from Program import Program from Texture import Texture from Mat4 import Mat4 import OpenGL.GL as gl import ctypes c = Context() b = Buffer(gl.GL_ARRAY_BUFFER, gl.GL_STATIC_DRAW, ctypes.c_int) b.sync() b.push(1) b.push(2) b.push(3) b.push(4) b.push(5) b[12] = 3 assert(b[0]==1) assert(b[1]==2) assert(b[2]==3) assert(b[3]==4) assert(b[4]==5) assert(b[5]==0) assert(b[13]==None) b.sync()
class Renderer(object): def __init__(self): self.program = Program('Shader/Quad.prog') # Prepare quad geometry self.vbuffer = Buffer(gl.GL_ARRAY_BUFFER, gl.GL_STATIC_DRAW, Vertex) self.vbuffer.push(Vertex(-.5, -.5, 0, 0, 1)) self.vbuffer.push(Vertex(-.5, .5, 0, 0, 0)) self.vbuffer.push(Vertex( .5, -.5, 0, 1, 1)) self.vbuffer.push(Vertex( .5, .5, 0, 1, 0)) # Set up vertex array object for mapping structs => shader inputs vao = (ctypes.c_int * 1)() gl.glGenVertexArrays(1, vao) self.vao = vao[0] stride = ctypes.sizeof(Vertex) gl.glBindVertexArray(self.vao) gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.vbuffer.id) gl.glEnableVertexAttribArray(Attr.POSITION) offset = ctypes.c_void_p(0) gl.glVertexAttribPointer(Attr.POSITION, 3, gl.GL_FLOAT, gl.GL_FALSE, stride, offset) gl.glEnableVertexAttribArray(Attr.TEXCOORD) offset = ctypes.c_void_p(12) gl.glVertexAttribPointer(Attr.TEXCOORD, 2, gl.GL_FLOAT, gl.GL_FALSE, stride, offset) gl.glBindVertexArray(0) def render(self, g): # Render all objects attached to the graphics context. for quad in g.quad: self.quad(g, quad) for text in g.text: self.text(g, text) def quad(self, g, quad): # Enable alpha blending/transparency self.vbuffer.sync() gl.glUseProgram(self.program.id) gl.glEnable(gl.GL_BLEND) gl.glEnable(gl.GL_DEPTH_TEST) gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA) # Bind texture gl.glUniform1i(self.program.tex, 0) gl.glBindTexture(gl.GL_TEXTURE_2D, quad.texture.id) # Set up geometry transforms worldMatrix = Matrix.scale(quad.width, quad.height, 1) worldMatrix = Matrix.translate(quad.x, quad.y, 0) * worldMatrix worldViewProjectionMatrix = g.viewProjectionMatrix * worldMatrix #worldViewProjectionMatrix = g.viewProjectionMatrix gl.glUniformMatrix4fv(self.program.worldViewProjectionMatrix, 1, 0, worldViewProjectionMatrix.data) # Draw geometry gl.glBindVertexArray(self.vao) gl.glDrawArrays(gl.GL_TRIANGLE_STRIP, 0, 4) gl.glBindVertexArray(0) def text(self, g, text): pass