-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.t
64 lines (50 loc) · 1.58 KB
/
Program.t
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
local Shader = require "Shader"
local std = require "std"
local struct Program {
programID: GL.uint
}
terra Program:getint(name: GL.enum)
var result: GL.int
gl.GetProgramiv(self.programID, name, &result)
return result
end
terra Program:getInfoLog()
var len = self:getint(gl.INFO_LOG_LENGTH)
if len == 0 then return nil end
var infolog = rawstring(std.malloc(len))
if infolog == nil then return nil end
gl.GetProgramInfoLog(self.programID, len, nil, infolog)
return infolog
end
terra Program:init() self.programID = gl.CreateProgram() end
terra Program.methods.create()
var self: Program
self:init()
return self
end
terra Program:isAlive()
return self.programID ~= 0
end
terra Program:isLinked()
return self:isAlive() and self:getint(gl.LINK_STATUS) == gl.TRUE
end
terra Program:addShader(shader: Shader)
if shader:isAlive() then
gl.AttachShader(self.programID, shader.shaderID)
end
end
terra Program:link()
gl.LinkProgram(self.programID)
var success = self:getint(gl.LINK_STATUS)
if success == 0 then
var infolog = self:getInfoLog()
if infolog ~= nil then std.puts(infolog) std.free(infolog) end
end
end
terra Program:use() gl.UseProgram(self.programID) end
terra Program:destruct() gl.DeleteProgram(self.programID) end
terra Program:rawget() return self.programID end
terra Program:getUniformLoc(name: rawstring)
return gl.GetUniformLocation(self.programID, name)
end
return Program