forked from skeeto/sample-java-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.java
More file actions
68 lines (56 loc) · 1.75 KB
/
Program.java
File metadata and controls
68 lines (56 loc) · 1.75 KB
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
package com.nullprogram.lwjgl;
import java.nio.Buffer;
import java.nio.FloatBuffer;
import java.util.HashSet;
import java.util.Set;
import lombok.Getter;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.GL20;
public class Program {
@Getter
private final int handle = GL20.glCreateProgram();
private boolean disposed = false;
@Getter
private Set<Shader> shaders = new HashSet<Shader>();
public Program add(Shader shader) {
if (shaders.add(shader)) {
GL20.glAttachShader(handle, shader.getHandle());
}
return this;
}
public void detach(Shader shader) {
if (shaders.remove(shader)) {
GL20.glDetachShader(handle, shader.getHandle());
}
}
public Program attrib(GlFloatBuffer buffer, String name, int size) {
int attrib = GL20.glGetAttribLocation(handle, name);
if (attrib < 1) {
throw new IllegalStateException("Unknown attrib \"" + name + "\"");
}
GL20.glVertexAttribPointer(attrib, size, false, size,
(FloatBuffer) buffer.getBuffer());
return this;
}
public void link() throws LWJGLException {
GL20.glLinkProgram(handle);
if (GL20.glGetProgram(handle, GL20.GL_LINK_STATUS) == 0) {
/* Link failed. */
int len = GL20.glGetProgram(handle, GL20.GL_INFO_LOG_LENGTH);
String info = GL20.glGetProgramInfoLog(handle, len);
throw new LWJGLException(info);
}
}
public void run() {
GL20.glUseProgram(handle);
}
public void dispose() {
if (!disposed) {
GL20.glDeleteProgram(handle);
}
}
@Override
protected void finalize() {
dispose();
}
}