234 lines
8.6 KiB
Java
234 lines
8.6 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;
|
|
}
|
|
}
|