220 lines
8.8 KiB
Java
220 lines
8.8 KiB
Java
package io.github.hydos.ginger.engine.utils;
|
|
|
|
import java.nio.FloatBuffer;
|
|
import java.nio.IntBuffer;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import org.lwjgl.BufferUtils;
|
|
import org.lwjgl.opengl.EXTTextureFilterAnisotropic;
|
|
import org.lwjgl.opengl.GL11;
|
|
import org.lwjgl.opengl.GL13;
|
|
import org.lwjgl.opengl.GL14;
|
|
import org.lwjgl.opengl.GL15;
|
|
import org.lwjgl.opengl.GL20;
|
|
import org.lwjgl.opengl.GL30;
|
|
import org.lwjgl.opengl.GL33;
|
|
|
|
import io.github.hydos.ginger.engine.io.Window;
|
|
import io.github.hydos.ginger.engine.renderEngine.models.RawModel;
|
|
import io.github.hydos.ginger.engine.renderEngine.texture.Image;
|
|
import io.github.hydos.ginger.engine.renderEngine.texture.ModelTexture;
|
|
import io.github.hydos.ginger.engine.terrain.TerrainTexture;
|
|
|
|
public class Loader {
|
|
|
|
private static List<Integer> vaos = new ArrayList<Integer>();
|
|
private static List<Integer> vbos = new ArrayList<Integer>();
|
|
|
|
public static int loadCubeMap(String[] textureFiles) {
|
|
int texID = GL11.glGenTextures();
|
|
GL13.glActiveTexture(GL13.GL_TEXTURE0);
|
|
GL11.glBindTexture(GL13.GL_TEXTURE_CUBE_MAP, texID);
|
|
|
|
for(int i=0;i<textureFiles.length;i++) {
|
|
// System.out.println("/textures/skybox/" + textureFiles[i]);
|
|
Image data = Image.createImage("/textures/skybox/" + textureFiles[i]);
|
|
GL11.glTexImage2D(GL13.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL11.GL_RGBA, data.getWidth(), data.getHeight(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, data.getImage());
|
|
}
|
|
|
|
GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
|
|
GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
|
|
vaos.add(texID);
|
|
return texID;
|
|
}
|
|
|
|
private static void bindIndicesBuffer(int[] indices) {
|
|
int vboID = GL15.glGenBuffers();
|
|
vbos.add(vboID);
|
|
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboID);
|
|
IntBuffer buffer = storeDataInIntBuffer(indices);
|
|
GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
|
|
}
|
|
|
|
public static RawModel loadToVAO(float[] positions, int dimensions) {
|
|
int vaoID = createVAO();
|
|
storeDataInAttributeList(0, dimensions, positions);
|
|
unbindVAO();
|
|
return new RawModel(vaoID, positions.length / dimensions);
|
|
}
|
|
|
|
private static IntBuffer storeDataInIntBuffer(int[] data) {
|
|
IntBuffer buffer = BufferUtils.createIntBuffer(data.length);
|
|
buffer.put(data);
|
|
buffer.flip();
|
|
return buffer;
|
|
}
|
|
|
|
private static int createVAO() {
|
|
int vaoID = GL30.glGenVertexArrays();
|
|
vaos.add(vaoID);
|
|
GL30.glBindVertexArray(vaoID);
|
|
return vaoID;
|
|
}
|
|
|
|
public static int createEmptyVbo(int floatCount) {
|
|
int vbo = GL15.glGenBuffers();
|
|
vbos.add(vbo);
|
|
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
|
|
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, floatCount * 4, GL15.GL_STREAM_DRAW);
|
|
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
|
|
return vbo;
|
|
}
|
|
|
|
public static void updateVbo(int vbo, float[] data, FloatBuffer buffer) {
|
|
buffer.clear();
|
|
buffer.put(data);
|
|
buffer.flip();
|
|
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
|
|
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer.capacity() * 4, GL15.GL_STREAM_DRAW);
|
|
GL15.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0, buffer);
|
|
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
|
|
}
|
|
|
|
public static void addInstancedAttribute(int vao, int vbo, int att, int dataSize, int instancedDataLength, int offset) {
|
|
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
|
|
GL30.glBindVertexArray(vao);
|
|
GL20.glVertexAttribPointer(att, dataSize, GL11.GL_FLOAT, false, instancedDataLength * 4, offset * 4);
|
|
GL33.glVertexAttribDivisor(att, 1);
|
|
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
|
|
GL30.glBindVertexArray(0);
|
|
}
|
|
|
|
private static void storeDataInAttributeList(int attributeNumber, int coordinateSize, float[] data) {
|
|
int vboID = GL15.glGenBuffers();
|
|
vbos.add(vboID);
|
|
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID);
|
|
FloatBuffer buffer = storeDataInFloatBuffer(data);
|
|
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
|
|
GL20.glVertexAttribPointer(attributeNumber, coordinateSize, GL11.GL_FLOAT, false, 0, 0);
|
|
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
|
|
}
|
|
|
|
private static void unbindVAO() {
|
|
GL30.glBindVertexArray(0);
|
|
}
|
|
|
|
private static FloatBuffer storeDataInFloatBuffer(float[] data) {
|
|
FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length);
|
|
buffer.put(data);
|
|
buffer.flip();
|
|
return buffer;
|
|
}
|
|
|
|
public static void cleanUp() {
|
|
for(int vao:vaos) {
|
|
GL30.glDeleteVertexArrays(vao);
|
|
}
|
|
for(int vbo:vbos) {
|
|
GL15.glDeleteBuffers(vbo);
|
|
}
|
|
}
|
|
|
|
public static int loadToVAO(float[] positions, float[] textureCoords) {
|
|
int vaoID = createVAO();
|
|
storeDataInAttributeList(0, 2, positions);
|
|
storeDataInAttributeList(1, 2, textureCoords);
|
|
unbindVAO();
|
|
return vaoID;
|
|
}
|
|
|
|
public static RawModel loadToVAO(float[] positions, int[] indices, float[] normals, float[] textureCoords) {
|
|
int vaoID = createVAO();
|
|
bindIndicesBuffer(indices);
|
|
storeDataInAttributeList(0, 3, positions);
|
|
storeDataInAttributeList(1, 2, textureCoords);
|
|
storeDataInAttributeList(2, 3, normals);
|
|
unbindVAO();
|
|
return new RawModel(vaoID, indices.length);
|
|
}
|
|
|
|
public static RawModel loadToVAO(float[] positions, int[] indices, float[] normals, float[] tangents, float[] textureCoords) {
|
|
int vaoID = createVAO();
|
|
bindIndicesBuffer(indices);
|
|
storeDataInAttributeList(0, 3, positions);
|
|
storeDataInAttributeList(1, 2, textureCoords);
|
|
storeDataInAttributeList(2, 3, normals);
|
|
storeDataInAttributeList(3, 3, tangents);
|
|
unbindVAO();
|
|
return new RawModel(vaoID, indices.length);
|
|
}
|
|
|
|
public static TerrainTexture loadTerrainTexture(String string) {
|
|
return new TerrainTexture(new ModelTexture("terrain/" + string).getTextureID());
|
|
}
|
|
|
|
public static int loadTexture(String path) {
|
|
int textureID = GL11.glGenTextures();
|
|
Image texture = Image.createImage("/textures/" + path);
|
|
GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);
|
|
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, 10241, 9729.0f);
|
|
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, 10240, 9729.0f);
|
|
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, texture.getWidth(), texture.getHeight(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texture.getImage());
|
|
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
|
|
GL30.glGenerateMipmap(GL11.GL_TEXTURE_2D);
|
|
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR);
|
|
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, -1f);
|
|
if(Window.glContext.GL_EXT_texture_filter_anisotropic) {//TODO: add option to use or disable
|
|
float amount = Math.min(4f, GL11.glGetFloat(EXTTextureFilterAnisotropic.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT));
|
|
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, amount);
|
|
}else
|
|
System.out.println("anisotropic not supported!");
|
|
return textureID;
|
|
}
|
|
|
|
public static int loadTextureDirectly(String path) {
|
|
int textureID = GL11.glGenTextures();
|
|
Image texture = Image.createImage(path);
|
|
GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);
|
|
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, 10241, 9729.0f);
|
|
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, 10240, 9729.0f);
|
|
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, texture.getWidth(), texture.getHeight(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texture.getImage());
|
|
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
|
|
GL30.glGenerateMipmap(GL11.GL_TEXTURE_2D);
|
|
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR);
|
|
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, -1f);
|
|
if(Window.glContext.GL_EXT_texture_filter_anisotropic) {//TODO: add option to use or disable
|
|
float amount = Math.min(4f, GL11.glGetFloat(EXTTextureFilterAnisotropic.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT));
|
|
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, amount);
|
|
}else
|
|
System.out.println("anisotropic not supported!");
|
|
return textureID;
|
|
}
|
|
|
|
public static int loadFontAtlas(String path) {
|
|
int textureID = GL11.glGenTextures();
|
|
Image texture = Image.createImage("/fonts/" + path);
|
|
GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);
|
|
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, 10241, 9729.0f);
|
|
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, 10240, 9729.0f);
|
|
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, texture.getWidth(), texture.getHeight(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texture.getImage());
|
|
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
|
|
GL30.glGenerateMipmap(GL11.GL_TEXTURE_2D);
|
|
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR);
|
|
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, -0f);
|
|
return textureID;
|
|
}
|
|
|
|
|
|
}
|