예제 #1
0
파일: Test.py 프로젝트: heavyairship/Magic

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()
예제 #2
0
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