-
Notifications
You must be signed in to change notification settings - Fork 0
/
glsl_tools.py
161 lines (129 loc) · 4.07 KB
/
glsl_tools.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
import pyglet.gl as gl
import ctypes as ct
import numpy as np
def rotation_matrix(deg, axis):
rad = deg * np.pi / 180.0
rot = np.eye(4)
axes = [0,1,2]
del axes[axis]
# if i remembered my linear algebra better, i'd call this a plane
# rotation
rot[(axes[0], axes[1]), (axes[0], axes[0])] = ( np.cos(rad), np.sin(rad) )
rot[(axes[0], axes[1]), (axes[1], axes[1])] = (-np.sin(rad), np.cos(rad) )
return rot
def perspective_matrix(fov_deg, ratio, near, far):
fov = fov_deg * np.pi / 180.0
tfov = np.tan(fov)
p = np.eye(4)
p[0,0] = 1.0 / (fov * ratio)
p[1,1] = 1.0 / fov
p[2,2] = (far+near)/(far-near)
p[3,2] = -1.0
p[3,3] = 0.0
p[2,3] = 2*(far+near)/(far-near)
return p
class program(object):
def __init__(self):
self.__value = gl.glCreateProgram()
def __del__(self):
gl.glDeleteProgram(self.__value)
def __get_value(self):
return self.__value
value = property(__get_value)
def link(self):
gl.glLinkProgram(self.__value)
err_status = ct.c_int()
gl.glGetProgramiv(self.__value, gl.GL_LINK_STATUS,
ct.byref(err_status))
if err_status.value != gl.GL_TRUE:
log_length = ct.c_int()
gl.glGetProgramiv(self.__value,
gl.GL_INFO_LOG_LENGTH,
ct.byref(log_length))
log_buf = (ct.c_char * (log_length.value))()
log_buf_ptr = ct.cast( \
ct.pointer(log_buf),
ct.c_char_p)
gl.glGetProgramInfoLog(self.__value, log_length.value,
None, log_buf_ptr)
raise GLException("Program failed to link:\n%s" % \
log_buf.value)
class vertex_array(object):
def __init__(self):
self.__value = None
buf = ct.c_uint()
gl.glGenVertexArrays(1, ct.byref(buf))
self.__value = buf.value
def __del__(self):
if self.__value is not None:
buf = ct.c_uint()
buf.value = self.__value
gl.glDeleteVertexArrays(1, ct.byref(buf))
def __get_value(self):
return self.__value
value = property(__get_value)
class texture(object):
def __init__(self):
self.__value = None
buf = ct.c_uint()
gl.glGenTextures(1, ct.byref(buf))
self.__value = buf.value
def __del__(self):
if self.__value is not None:
buf = ct.c_uint()
buf.value = self.__value
gl.glDeleteTextures(1, ct.byref(buf))
def __get_value(self):
return self.__value
value = property(__get_value)
class buffer(object):
def __init__(self):
self.__value = None
buf = ct.c_uint()
gl.glGenBuffers(1, ct.byref(buf))
self.__value = buf.value
def __del__(self):
if self.__value is not None:
buf = ct.c_uint()
buf.value = self.__value
gl.glDeleteBuffers(1, ct.byref(buf))
def __get_value(self):
return self.__value
value = property(__get_value)
class shader(object):
def __init__(self, source, shader_type):
self.__value = None
type_dict = {"vert":gl.GL_VERTEX_SHADER, "geom":gl.GL_GEOMETRY_SHADER,
"frag":gl.GL_FRAGMENT_SHADER}
# create and compile shader
shader = gl.glCreateShader(type_dict[shader_type])
source_ptr = ct.c_char_p(source)
source_ptr_ptr = ct.cast(
ct.pointer(source_ptr),
ct.POINTER(ct.POINTER(ct.c_char)) )
gl.glShaderSource(shader, 1, source_ptr_ptr, None)
gl.glCompileShader(shader)
# check for error
err_status = ct.c_int()
gl.glGetShaderiv(shader, gl.GL_COMPILE_STATUS, ct.byref(err_status))
if err_status.value != gl.GL_TRUE:
# error occurred
log_length = ct.c_int()
gl.glGetShaderiv(shader, gl.GL_INFO_LOG_LENGTH,
ct.byref(log_length))
log_buffer = (ct.c_char * log_length.value)()
log_buffer_ptr = ct.cast( \
ct.pointer(log_buffer),
ct.c_char_p)
gl.glGetShaderInfoLog(shader, log_length.value, None,
log_buffer_ptr)
gl.glDeleteShader(shader)
raise gl.GLException("Shader failed to compile: \n%s" % log_buffer.value)
else:
self.__value = shader
def __del__(self):
if self.__value is not None:
gl.glDeleteShader(self.__value)
def __get_value(self):
return self.__value
value = property(__get_value)