-
Notifications
You must be signed in to change notification settings - Fork 0
/
renderer.py
82 lines (74 loc) · 2.65 KB
/
renderer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.GL import shaders
from numpy import array
import numpy as np
from numpy import matrix
import pyui
import testopt
class shader(object):
def __init__(self):
self.attribs = {}
self.uni = {}
self.pID = 0
def addAttribs(self, attribs):
for attrib in attribs:
self.attribs[attrib] = glGetAttribLocation(self.pID,attrib)
def addUniforms(self, uniforms):
for uniform in uniforms:
self.uni[uniform] = glGetUniformLocation(self.pID, uniform)
def bind(self):
glUseProgram(self.pID);
for i in self.attribs.values():
glEnableVertexAttribArray(i)
def unbind(self):
glUseProgram(0)
for i in self.attribs.values():
glDisableVertexAttribArray(i)
class renderer(object):
def onTimer(self):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
for func in self.timerCalls:
func()
for rFunc in self.renderCalls:
rFunc(self)
#glutSwapBuffers()
def buildShader(self, vshader, fshader, attribs, uniforms, name):
sh = shader()
#From http://pyopengl.sourceforge.net/context/tutorials/shader_1.xhtml
VERTEX_SHADER = shaders.compileShader(vshader, GL_VERTEX_SHADER)
FRAGMENT_SHADER = shaders.compileShader(fshader, GL_FRAGMENT_SHADER)
sh.pID = shaders.compileProgram(VERTEX_SHADER,FRAGMENT_SHADER)
sh.addAttribs(attribs)
sh.addUniforms(uniforms)
self.shaders[name] = sh
def addRenderCall(self, rFunc):
self.renderCalls.append(rFunc)
def loop(self):
pyui.run()
def camera(self, x, y, z):
self.projection = array([1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,
0.0,0.0,1.0,z,
x,y,0.0,1.0], np.float32)
def __init__(self):
pyui.init(*(800,600,'gl',0))
self.shaders = {}
self.timerCalls = []
self.renderCalls = []
self.projection = array([1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,
0.0,0.0,1.0,0.0,
0.0,0.0,0.0,1.0], np.float32)
#glutInit()
#glutInitWindowSize(640,480)
#glutCreateWindow("SBD Simulator")
glEnable(GL_DEPTH_TEST)
glDepthMask(GL_TRUE)
glClearColor(0.9,0.9,0.9,1.0)
glClearDepth(1)
glDepthFunc(GL_LEQUAL)
glViewport(0,0,640,480)
#glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
pyui.desktop.getRenderer().setBackMethod(self.onTimer)