ludum_dare_37/src/com/gnarly/engine/graphics/Mesh.java

125 lines
3.1 KiB
Java
Raw Normal View History

2024-08-07 04:26:50 +00:00
package com.gnarly.engine.graphics;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;
import static org.lwjgl.opengl.GL30.*;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import org.lwjgl.BufferUtils;
public class Mesh {
private Shader shader;
private Texture texture;
private int count;
private int vaoID, vboID, iboID, tcboID;
private float[] vbo, tcbo;
private byte[] ibo;
public Mesh(float[] vbo, byte[] ibo, float[] tcbo, Texture texture, Shader shader) {
this.vbo = vbo;
this.ibo = ibo;
this.tcbo = tcbo;
this.texture = texture;
this.shader = shader;
count = ibo.length;
init();
}
public Mesh(float[] vbo, Texture texture, Shader shader) {
this.vbo = vbo;
this.ibo = defaultIBO();
this.tcbo = defaultTCBO();
this.texture = texture;
this.shader = shader;
count = ibo.length;
init();
}
public Mesh(float[] vbo, String texPath, String vertPath, String fragPath) {
this.vbo = vbo;
this.ibo = defaultIBO();
this.tcbo = defaultTCBO();
this.texture = new Texture(texPath);
this.shader = new Shader(vertPath, fragPath);
count = ibo.length;
init();
}
private void init() {
vaoID = glGenVertexArrays();
glBindVertexArray(vaoID);
vboID = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, createFloatBuffer(vbo), GL_STATIC_DRAW);
glVertexAttribPointer(Shader.VERT_ATTRIB, 3, GL_FLOAT, false, 0, 0);
glEnableVertexAttribArray(Shader.VERT_ATTRIB);
iboID = glGenBuffers();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, createByteBuffer(ibo), GL_STATIC_DRAW);
tcboID = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, tcboID);
glBufferData(GL_ARRAY_BUFFER, createFloatBuffer(tcbo), GL_STATIC_DRAW);
glVertexAttribPointer(Shader.TEX_COORD_ATTRIB, 2, GL_FLOAT, false, 0, 0);
glEnableVertexAttribArray(Shader.TEX_COORD_ATTRIB);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
public void render() {
shader.enable();
texture.bind();
glBindVertexArray(vaoID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboID);
glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_BYTE, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArray(0);
texture.unbind();
shader.enable();
}
public byte[] defaultIBO() {
return new byte[] {
0, 1, 2,
0, 2, 3
};
}
public float[] defaultTCBO() {
return new float[] {
1, 0,
1, 1,
0, 1,
0, 0,
};
}
public Shader getShader() {
return shader;
}
public FloatBuffer createFloatBuffer(float[] data) {
FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length);
buffer.put(data);
buffer.flip();
return buffer;
}
public ByteBuffer createByteBuffer(byte[] data) {
ByteBuffer buffer = BufferUtils.createByteBuffer(data.length);
buffer.put(data);
buffer.flip();
return buffer;
}
}