More work on texture ports
This commit is contained in:
parent
23859f9017
commit
84e84d6b26
|
@ -55,6 +55,7 @@ dependencies {
|
||||||
implementation "org.lwjgl:lwjgl-opengl"
|
implementation "org.lwjgl:lwjgl-opengl"
|
||||||
implementation "org.lwjgl:lwjgl-stb"
|
implementation "org.lwjgl:lwjgl-stb"
|
||||||
implementation "org.lwjgl:lwjgl-nfd"
|
implementation "org.lwjgl:lwjgl-nfd"
|
||||||
|
implementation "org.lwjgl:lwjgl-nanovg"
|
||||||
implementation "org.lwjgl:lwjgl::$lwjglNatives"
|
implementation "org.lwjgl:lwjgl::$lwjglNatives"
|
||||||
implementation "org.lwjgl:lwjgl-glfw::$lwjglNatives"
|
implementation "org.lwjgl:lwjgl-glfw::$lwjglNatives"
|
||||||
implementation "org.lwjgl:lwjgl-jemalloc::$lwjglNatives"
|
implementation "org.lwjgl:lwjgl-jemalloc::$lwjglNatives"
|
||||||
|
@ -62,6 +63,7 @@ dependencies {
|
||||||
implementation "org.lwjgl:lwjgl-opengl::$lwjglNatives"
|
implementation "org.lwjgl:lwjgl-opengl::$lwjglNatives"
|
||||||
implementation "org.lwjgl:lwjgl-stb::$lwjglNatives"
|
implementation "org.lwjgl:lwjgl-stb::$lwjglNatives"
|
||||||
implementation "org.lwjgl:lwjgl-nfd::$lwjglNatives"
|
implementation "org.lwjgl:lwjgl-nfd::$lwjglNatives"
|
||||||
|
implementation "org.lwjgl:lwjgl-nanovg::$lwjglNatives"
|
||||||
|
|
||||||
//Gson
|
//Gson
|
||||||
implementation 'com.google.code.gson:gson:2.8.6'
|
implementation 'com.google.code.gson:gson:2.8.6'
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package speiger.src.coreengine.rendering.texturesOld.base;
|
package speiger.src.coreengine.assets.parsers;
|
||||||
|
|
||||||
import java.io.Closeable;
|
import java.io.Closeable;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -13,6 +13,7 @@ import speiger.src.coreengine.assets.base.IAssetParser;
|
||||||
|
|
||||||
public class NativeMemoryParser implements IAssetParser<ByteBuffer> {
|
public class NativeMemoryParser implements IAssetParser<ByteBuffer> {
|
||||||
public static final IAssetParser<ByteBuffer> INSTANCE = new NativeMemoryParser();
|
public static final IAssetParser<ByteBuffer> INSTANCE = new NativeMemoryParser();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ByteBuffer parseAsset(Path path, Consumer<Closeable> autoCloser) throws IOException {
|
public ByteBuffer parseAsset(Path path, Consumer<Closeable> autoCloser) throws IOException {
|
||||||
byte[] data = Files.readAllBytes(path);
|
byte[] data = Files.readAllBytes(path);
|
|
@ -36,8 +36,8 @@ import speiger.src.collections.objects.misc.pairs.ObjectObjectPair;
|
||||||
import speiger.src.coreengine.assets.AssetLocation;
|
import speiger.src.coreengine.assets.AssetLocation;
|
||||||
import speiger.src.coreengine.math.vector.ints.Vec2i;
|
import speiger.src.coreengine.math.vector.ints.Vec2i;
|
||||||
import speiger.src.coreengine.rendering.gui.renderer.IFontRenderer.CharInstance;
|
import speiger.src.coreengine.rendering.gui.renderer.IFontRenderer.CharInstance;
|
||||||
import speiger.src.coreengine.rendering.texturesOld.atlas.AtlasStitcher;
|
import speiger.src.coreengine.rendering.textures.custom.AtlasStitcher;
|
||||||
import speiger.src.coreengine.rendering.texturesOld.atlas.AtlasStitcher.Entry;
|
import speiger.src.coreengine.rendering.textures.custom.AtlasStitcher.Entry;
|
||||||
import speiger.src.coreengine.rendering.texturesOld.custom.TextureAtlas;
|
import speiger.src.coreengine.rendering.texturesOld.custom.TextureAtlas;
|
||||||
import speiger.src.coreengine.rendering.texturesOld.custom.TextureAtlas.AtlasEntry;
|
import speiger.src.coreengine.rendering.texturesOld.custom.TextureAtlas.AtlasEntry;
|
||||||
import speiger.src.coreengine.rendering.texturesOld.custom.TextureAtlas.Builder;
|
import speiger.src.coreengine.rendering.texturesOld.custom.TextureAtlas.Builder;
|
||||||
|
|
|
@ -37,7 +37,7 @@ public record BufferAttribute(int index, int size, GLDataType type, boolean norm
|
||||||
public void unbind() { GL20.glDisableVertexAttribArray(index); }
|
public void unbind() { GL20.glDisableVertexAttribArray(index); }
|
||||||
|
|
||||||
public void applyAttribute(int stride, int offset) {
|
public void applyAttribute(int stride, int offset) {
|
||||||
GL20.glVertexAttribPointer(index, size, type.glMode(), normal, stride, offset);
|
GL20.glVertexAttribPointer(index, size, type.glValue(), normal, stride, offset);
|
||||||
if(instancedAmount > 0) GL33.glVertexAttribDivisor(index, instancedAmount);
|
if(instancedAmount > 0) GL33.glVertexAttribDivisor(index, instancedAmount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,37 +55,37 @@ public class VertexBuffer {
|
||||||
}
|
}
|
||||||
|
|
||||||
public VertexBuffer bind() {
|
public VertexBuffer bind() {
|
||||||
GL15.glBindBuffer(type.glMode(), id);
|
GL15.glBindBuffer(type.glValue(), id);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VertexBuffer unbind() {
|
public VertexBuffer unbind() {
|
||||||
GL15.glBindBuffer(type.glMode(), 0);
|
GL15.glBindBuffer(type.glValue(), 0);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VertexBuffer allocate(int totalBytes) {
|
public VertexBuffer allocate(int totalBytes) {
|
||||||
this.size = totalBytes;
|
this.size = totalBytes;
|
||||||
GL15.glBufferData(type.glMode(), totalBytes, state.glMode());
|
GL15.glBufferData(type.glValue(), totalBytes, state.glValue());
|
||||||
AllocationTracker.INSTANCE.addGPUBytes(totalBytes);
|
AllocationTracker.INSTANCE.addGPUBytes(totalBytes);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VertexBuffer set(long pointer, int totalBytes) {
|
public VertexBuffer set(long pointer, int totalBytes) {
|
||||||
this.size = totalBytes;
|
this.size = totalBytes;
|
||||||
GL15.nglBufferData(type.glMode(), totalBytes, pointer, state.glMode());
|
GL15.nglBufferData(type.glValue(), totalBytes, pointer, state.glValue());
|
||||||
AllocationTracker.INSTANCE.addGPUBytes(totalBytes);
|
AllocationTracker.INSTANCE.addGPUBytes(totalBytes);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VertexBuffer fill(long pointer, int totalBytes, int offset) {
|
public VertexBuffer fill(long pointer, int totalBytes, int offset) {
|
||||||
GL15.nglBufferSubData(type.glMode(), offset, totalBytes, pointer);
|
GL15.nglBufferSubData(type.glValue(), offset, totalBytes, pointer);
|
||||||
AllocationTracker.INSTANCE.addGPUBytes(totalBytes);
|
AllocationTracker.INSTANCE.addGPUBytes(totalBytes);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VertexBuffer read(long pointer, int totalBytes, int offset) {
|
public VertexBuffer read(long pointer, int totalBytes, int offset) {
|
||||||
GL15.nglGetBufferSubData(type.glMode(), offset, totalBytes, pointer);
|
GL15.nglGetBufferSubData(type.glValue(), offset, totalBytes, pointer);
|
||||||
AllocationTracker.INSTANCE.addGPUBytes(totalBytes);
|
AllocationTracker.INSTANCE.addGPUBytes(totalBytes);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -139,29 +139,29 @@ public class VertexBuffer {
|
||||||
}
|
}
|
||||||
|
|
||||||
public VertexBuffer fill(int offset, byte[] data) {
|
public VertexBuffer fill(int offset, byte[] data) {
|
||||||
GL15.glMapBuffer(type.glMode(), GL15.GL_WRITE_ONLY).position(offset).put(data);
|
GL15.glMapBuffer(type.glValue(), GL15.GL_WRITE_ONLY).position(offset).put(data);
|
||||||
GL15.glUnmapBuffer(type.glMode());
|
GL15.glUnmapBuffer(type.glValue());
|
||||||
AllocationTracker.INSTANCE.addGPUBytes(data.length);
|
AllocationTracker.INSTANCE.addGPUBytes(data.length);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VertexBuffer fill(int offset, short[] data) {
|
public VertexBuffer fill(int offset, short[] data) {
|
||||||
GL15.glMapBuffer(type.glMode(), GL15.GL_WRITE_ONLY).position(offset).asShortBuffer().put(data);
|
GL15.glMapBuffer(type.glValue(), GL15.GL_WRITE_ONLY).position(offset).asShortBuffer().put(data);
|
||||||
GL15.glUnmapBuffer(type.glMode());
|
GL15.glUnmapBuffer(type.glValue());
|
||||||
AllocationTracker.INSTANCE.addGPUBytes(data.length * 2L);
|
AllocationTracker.INSTANCE.addGPUBytes(data.length * 2L);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VertexBuffer fill(int offset, int[] data) {
|
public VertexBuffer fill(int offset, int[] data) {
|
||||||
GL15.glMapBuffer(type.glMode(), GL15.GL_WRITE_ONLY).position(offset).asIntBuffer().put(data);
|
GL15.glMapBuffer(type.glValue(), GL15.GL_WRITE_ONLY).position(offset).asIntBuffer().put(data);
|
||||||
GL15.glUnmapBuffer(type.glMode());
|
GL15.glUnmapBuffer(type.glValue());
|
||||||
AllocationTracker.INSTANCE.addGPUBytes(data.length * 4L);
|
AllocationTracker.INSTANCE.addGPUBytes(data.length * 4L);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VertexBuffer fill(int offset, float[] data) {
|
public VertexBuffer fill(int offset, float[] data) {
|
||||||
GL15.glMapBuffer(type.glMode(), GL15.GL_WRITE_ONLY).position(offset).asFloatBuffer().put(data);
|
GL15.glMapBuffer(type.glValue(), GL15.GL_WRITE_ONLY).position(offset).asFloatBuffer().put(data);
|
||||||
GL15.glUnmapBuffer(type.glMode());
|
GL15.glUnmapBuffer(type.glValue());
|
||||||
AllocationTracker.INSTANCE.addGPUBytes(data.length * 4L);
|
AllocationTracker.INSTANCE.addGPUBytes(data.length * 4L);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -173,7 +173,7 @@ public class VertexBuffer {
|
||||||
public VertexBuffer fill(int offset, List<IntObjectPair<byte[]>> data) {
|
public VertexBuffer fill(int offset, List<IntObjectPair<byte[]>> data) {
|
||||||
if(data.size() > 0) {
|
if(data.size() > 0) {
|
||||||
long totalInjected = 0;
|
long totalInjected = 0;
|
||||||
ByteBuffer buffer = GL15.glMapBuffer(type.glMode(), GL15.GL_WRITE_ONLY);
|
ByteBuffer buffer = GL15.glMapBuffer(type.glValue(), GL15.GL_WRITE_ONLY);
|
||||||
for(int i = 0,m = data.size();i < m;i++) {
|
for(int i = 0,m = data.size();i < m;i++) {
|
||||||
IntObjectPair<byte[]> entry = data.get(i);
|
IntObjectPair<byte[]> entry = data.get(i);
|
||||||
buffer.position(entry.getIntKey() + offset);
|
buffer.position(entry.getIntKey() + offset);
|
||||||
|
@ -181,7 +181,7 @@ public class VertexBuffer {
|
||||||
totalInjected += entry.getValue().length;
|
totalInjected += entry.getValue().length;
|
||||||
}
|
}
|
||||||
buffer.flip();
|
buffer.flip();
|
||||||
if(!GL15.glUnmapBuffer(type.glMode())) GameLog.info("Memory Corruption?");
|
if(!GL15.glUnmapBuffer(type.glValue())) GameLog.info("Memory Corruption?");
|
||||||
AllocationTracker.INSTANCE.addGPUBytes(totalInjected);
|
AllocationTracker.INSTANCE.addGPUBytes(totalInjected);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
|
@ -189,12 +189,12 @@ public class VertexBuffer {
|
||||||
|
|
||||||
public VertexBuffer grow(int newSize) {
|
public VertexBuffer grow(int newSize) {
|
||||||
if(size >= newSize) throw new IllegalArgumentException("New Size ["+newSize+"] is smaller then the buffer ["+size+"]");
|
if(size >= newSize) throw new IllegalArgumentException("New Size ["+newSize+"] is smaller then the buffer ["+size+"]");
|
||||||
ByteBuffer buffer = GL15.glMapBuffer(type.glMode(), GL15.GL_READ_ONLY);
|
ByteBuffer buffer = GL15.glMapBuffer(type.glValue(), GL15.GL_READ_ONLY);
|
||||||
if(size != buffer.remaining()) throw new IllegalStateException("Grow Function found inconsisten data: Found=["+buffer.remaining()+"], Expected=["+size+"]");
|
if(size != buffer.remaining()) throw new IllegalStateException("Grow Function found inconsisten data: Found=["+buffer.remaining()+"], Expected=["+size+"]");
|
||||||
ByteBuffer newBuff = MemoryUtil.memAlloc(newSize);
|
ByteBuffer newBuff = MemoryUtil.memAlloc(newSize);
|
||||||
MemoryUtil.memCopy(MemoryUtil.memAddress(buffer), MemoryUtil.memAddress(newBuff), size);
|
MemoryUtil.memCopy(MemoryUtil.memAddress(buffer), MemoryUtil.memAddress(newBuff), size);
|
||||||
newBuff.position(newSize).flip();
|
newBuff.position(newSize).flip();
|
||||||
GL15.glUnmapBuffer(type.glMode());
|
GL15.glUnmapBuffer(type.glValue());
|
||||||
AllocationTracker.INSTANCE.addGPUBytes(size);
|
AllocationTracker.INSTANCE.addGPUBytes(size);
|
||||||
set(MemoryUtil.memAddress(newBuff), newSize);
|
set(MemoryUtil.memAddress(newBuff), newSize);
|
||||||
MemoryUtil.memFree(newBuff);
|
MemoryUtil.memFree(newBuff);
|
||||||
|
@ -203,12 +203,12 @@ public class VertexBuffer {
|
||||||
|
|
||||||
public VertexBuffer shrink(int newSize) {
|
public VertexBuffer shrink(int newSize) {
|
||||||
if(size <= newSize) throw new IllegalArgumentException("New Size ["+newSize+"] is bigger then the buffer ["+size+"]");
|
if(size <= newSize) throw new IllegalArgumentException("New Size ["+newSize+"] is bigger then the buffer ["+size+"]");
|
||||||
ByteBuffer buffer = GL15.glMapBuffer(type.glMode(), GL15.GL_READ_WRITE);
|
ByteBuffer buffer = GL15.glMapBuffer(type.glValue(), GL15.GL_READ_WRITE);
|
||||||
if(size != buffer.remaining()) throw new IllegalStateException("Grow Function found inconsisten data: Found=["+buffer.remaining()+"], Expected=["+size+"]");
|
if(size != buffer.remaining()) throw new IllegalStateException("Grow Function found inconsisten data: Found=["+buffer.remaining()+"], Expected=["+size+"]");
|
||||||
ByteBuffer newBuff = MemoryUtil.memAlloc(newSize);
|
ByteBuffer newBuff = MemoryUtil.memAlloc(newSize);
|
||||||
MemoryUtil.memCopy(MemoryUtil.memAddress(buffer), MemoryUtil.memAddress(newBuff), newSize);
|
MemoryUtil.memCopy(MemoryUtil.memAddress(buffer), MemoryUtil.memAddress(newBuff), newSize);
|
||||||
newBuff.position(newSize).flip();
|
newBuff.position(newSize).flip();
|
||||||
GL15.glUnmapBuffer(type.glMode());
|
GL15.glUnmapBuffer(type.glValue());
|
||||||
AllocationTracker.INSTANCE.addGPUBytes(size);
|
AllocationTracker.INSTANCE.addGPUBytes(size);
|
||||||
set(MemoryUtil.memAddress(newBuff), newSize);
|
set(MemoryUtil.memAddress(newBuff), newSize);
|
||||||
MemoryUtil.memFree(newBuff);
|
MemoryUtil.memFree(newBuff);
|
||||||
|
|
|
@ -96,7 +96,7 @@ public abstract class ShaderProgram {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
int shaderID = GL20.glCreateShader(type.glMode());
|
int shaderID = GL20.glCreateShader(type.glValue());
|
||||||
GL20.glShaderSource(shaderID, builder);
|
GL20.glShaderSource(shaderID, builder);
|
||||||
GL20.glCompileShader(shaderID);
|
GL20.glCompileShader(shaderID);
|
||||||
if(GL20.glGetShaderi(shaderID, GL20.GL_COMPILE_STATUS) == 0) {
|
if(GL20.glGetShaderi(shaderID, GL20.GL_COMPILE_STATUS) == 0) {
|
||||||
|
|
|
@ -1,15 +1,17 @@
|
||||||
package speiger.src.coreengine.rendering.textures.base;
|
package speiger.src.coreengine.rendering.textures.base;
|
||||||
|
|
||||||
import org.lwjgl.opengl.GL11;
|
import org.lwjgl.opengl.GL11;
|
||||||
|
import org.lwjgl.opengl.GL46;
|
||||||
|
|
||||||
import speiger.src.coreengine.rendering.utils.GLStateTracker;
|
import speiger.src.coreengine.rendering.utils.GLStateTracker;
|
||||||
import speiger.src.coreengine.rendering.utils.values.textures.GLTextureFormat;
|
import speiger.src.coreengine.rendering.utils.values.IGLValue;
|
||||||
|
import speiger.src.coreengine.rendering.utils.values.textures.GLTextureType;
|
||||||
|
|
||||||
public abstract class BaseTexture implements ITexture {
|
public abstract class BaseTexture implements ITexture {
|
||||||
protected int id;
|
protected int id;
|
||||||
|
|
||||||
protected BaseTexture() {
|
protected BaseTexture() {
|
||||||
this(GL11.glGenTextures());
|
track();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected BaseTexture(int id) {
|
protected BaseTexture(int id) {
|
||||||
|
@ -17,8 +19,18 @@ public abstract class BaseTexture implements ITexture {
|
||||||
track();
|
track();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected int textureType() {
|
protected void createTexture() {
|
||||||
return -1;
|
this.id = GL46.glCreateTextures(textureType().glValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected IGLValue textureType() {
|
||||||
|
return GLTextureType.TEXTURE_2D;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void removeTexture() {
|
||||||
|
if(id == 0) return;
|
||||||
|
GL11.glDeleteTextures(id);
|
||||||
|
id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void track() {
|
protected void track() {
|
||||||
|
@ -36,8 +48,10 @@ public abstract class BaseTexture implements ITexture {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void delete() {
|
public void delete(boolean untrack) {
|
||||||
GL11.glDeleteTextures(id);
|
removeTexture();
|
||||||
|
if(untrack) {
|
||||||
GLStateTracker.TEXTURE_TRACKER.deleteTexture(this);
|
GLStateTracker.TEXTURE_TRACKER.deleteTexture(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,11 +1,23 @@
|
||||||
package speiger.src.coreengine.rendering.textures.base;
|
package speiger.src.coreengine.rendering.textures.base;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
import org.lwjgl.system.MemoryUtil;
|
||||||
|
|
||||||
|
import speiger.src.coreengine.assets.AssetLocation;
|
||||||
|
import speiger.src.coreengine.assets.base.IAssetProvider;
|
||||||
|
import speiger.src.coreengine.rendering.textures.simple.DirectTexture;
|
||||||
|
import speiger.src.coreengine.rendering.textures.simple.SimpleTexture;
|
||||||
|
import speiger.src.coreengine.rendering.textures.simple.WrappedTexture;
|
||||||
|
|
||||||
public interface ITexture {
|
public interface ITexture {
|
||||||
public int id();
|
public int id();
|
||||||
public default void bind() { bind(0); }
|
public default void bind() { bind(0); }
|
||||||
public void bind(int unit);
|
public void bind(int unit);
|
||||||
public void reload();
|
public void load(IAssetProvider provider);
|
||||||
public void delete();
|
public default void reset() { delete(false); }
|
||||||
|
public default void delete() { delete(true); }
|
||||||
|
public void delete(boolean untrack);
|
||||||
|
|
||||||
public int width();
|
public int width();
|
||||||
public int height();
|
public int height();
|
||||||
|
@ -14,4 +26,24 @@ public interface ITexture {
|
||||||
public default float minV() { return 0F; }
|
public default float minV() { return 0F; }
|
||||||
public default float maxU() { return 1F; }
|
public default float maxU() { return 1F; }
|
||||||
public default float maxV() { return 1F; }
|
public default float maxV() { return 1F; }
|
||||||
|
|
||||||
|
public static ITexture direct(int width, int height, ByteBuffer buffer, TextureMetadata metadata) {
|
||||||
|
return direct(width, height, MemoryUtil.memAddress(buffer), metadata);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ITexture direct(int width, int height, long data, TextureMetadata metadata) {
|
||||||
|
return new DirectTexture(width, height, data, metadata);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ITexture simple(AssetLocation location, TextureMetadata metadata) {
|
||||||
|
return new SimpleTexture(location, metadata);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ITexture wrap(ITexture texture) {
|
||||||
|
return texture instanceof WrappedTexture ? texture : wrap(texture.id());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ITexture wrap(int id) {
|
||||||
|
return new WrappedTexture(id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,8 @@ public class TextureMetadata {
|
||||||
int internalFormat;
|
int internalFormat;
|
||||||
int externalFormat;
|
int externalFormat;
|
||||||
int dataFormat;
|
int dataFormat;
|
||||||
|
boolean isSTBData = true;
|
||||||
|
boolean mipmapping = true;
|
||||||
LongList arguments = new LongArrayList();
|
LongList arguments = new LongArrayList();
|
||||||
|
|
||||||
private TextureMetadata() {}
|
private TextureMetadata() {}
|
||||||
|
@ -32,6 +34,8 @@ public class TextureMetadata {
|
||||||
public int getInternalFormat() { return internalFormat; }
|
public int getInternalFormat() { return internalFormat; }
|
||||||
public int getExternalFormat() { return externalFormat; }
|
public int getExternalFormat() { return externalFormat; }
|
||||||
public int getDataFormat() { return dataFormat; }
|
public int getDataFormat() { return dataFormat; }
|
||||||
|
public boolean isSTBData() { return isSTBData; }
|
||||||
|
public boolean generateMipMappings() { return mipmapping; }
|
||||||
public Builder copy() { return new Builder(this); }
|
public Builder copy() { return new Builder(this); }
|
||||||
public static Builder builder() { return new Builder(); }
|
public static Builder builder() { return new Builder(); }
|
||||||
|
|
||||||
|
@ -44,12 +48,14 @@ public class TextureMetadata {
|
||||||
metadata.internalFormat = data.internalFormat;
|
metadata.internalFormat = data.internalFormat;
|
||||||
metadata.externalFormat = data.externalFormat;
|
metadata.externalFormat = data.externalFormat;
|
||||||
metadata.dataFormat = data.dataFormat;
|
metadata.dataFormat = data.dataFormat;
|
||||||
|
metadata.isSTBData = data.isSTBData;
|
||||||
|
metadata.mipmapping = data.mipmapping;
|
||||||
metadata.arguments.addAll(data.arguments);
|
metadata.arguments.addAll(data.arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder internalFormat(ITextureFormatType type) {
|
public Builder internalFormat(ITextureFormatType type) {
|
||||||
if(!type.internal()) throw new IllegalArgumentException("The GL_Type ["+type.glMode()+"] isn't supported in the internal format");
|
if(!type.internal()) throw new IllegalArgumentException("The GL_Type ["+type.glValue()+"] isn't supported in the internal format");
|
||||||
return internalFormat(type.glMode());
|
return internalFormat(type.glValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder internalFormat(int glValue) {
|
public Builder internalFormat(int glValue) {
|
||||||
|
@ -58,7 +64,7 @@ public class TextureMetadata {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder externalFormat(ITextureFormatType type) {
|
public Builder externalFormat(ITextureFormatType type) {
|
||||||
return externalFormat(type.glMode());
|
return externalFormat(type.glValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder externalFormat(int glValue) {
|
public Builder externalFormat(int glValue) {
|
||||||
|
@ -67,7 +73,7 @@ public class TextureMetadata {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder dataFormat(IGLDataType type) {
|
public Builder dataFormat(IGLDataType type) {
|
||||||
return dataFormat(type.glMode());
|
return dataFormat(type.glValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder dataFormat(int glValue) {
|
public Builder dataFormat(int glValue) {
|
||||||
|
@ -75,8 +81,18 @@ public class TextureMetadata {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder stbData(boolean value) {
|
||||||
|
metadata.isSTBData = value;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder mipmapping(boolean value) {
|
||||||
|
metadata.mipmapping = value;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public Builder removeArgument(ITextureParameter id) {
|
public Builder removeArgument(ITextureParameter id) {
|
||||||
return removeArgument(id.glMode());
|
return removeArgument(id.glValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder removeArgument(int id) {
|
public Builder removeArgument(int id) {
|
||||||
|
@ -90,12 +106,12 @@ public class TextureMetadata {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder arguement(ITextureParameter parameter, IGLValue value) {
|
public Builder arguement(ITextureParameter parameter, IGLValue value) {
|
||||||
return argument(parameter, value.glMode());
|
return argument(parameter, value.glValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder argument(ITextureParameter parameter, int value) {
|
public Builder argument(ITextureParameter parameter, int value) {
|
||||||
if(!parameter.isValid(value)) throw new IllegalArgumentException("Value ["+value+"] isn't supported for GL Function ["+parameter.glMode()+"], only int functions are supported with this");
|
if(!parameter.isValid(value)) throw new IllegalArgumentException("Value ["+value+"] isn't supported for GL Function ["+parameter.glValue()+"], only int functions are supported with this");
|
||||||
return argument(parameter.glMode(), value);
|
return argument(parameter.glValue(), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder argument(int id, int value) {
|
public Builder argument(int id, int value) {
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
package speiger.src.coreengine.rendering.textures.base;
|
package speiger.src.coreengine.rendering.textures.base;
|
||||||
|
|
||||||
import java.util.function.Predicate;
|
|
||||||
|
|
||||||
import speiger.src.collections.objects.lists.ObjectArrayList;
|
import speiger.src.collections.objects.lists.ObjectArrayList;
|
||||||
import speiger.src.collections.objects.lists.ObjectList;
|
import speiger.src.collections.objects.lists.ObjectList;
|
||||||
import speiger.src.collections.objects.sets.ObjectLinkedOpenHashSet;
|
import speiger.src.collections.objects.sets.ObjectLinkedOpenHashSet;
|
||||||
|
@ -26,6 +24,7 @@ public class TextureTracker implements ISimpleRealodableAsset, IManagedAsset {
|
||||||
public void register(ITexture texture, boolean reloadable) {
|
public void register(ITexture texture, boolean reloadable) {
|
||||||
textures.add(texture);
|
textures.add(texture);
|
||||||
if(reloadable) this.reloadable.add(texture);
|
if(reloadable) this.reloadable.add(texture);
|
||||||
|
texture.load(provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void deleteTexture(ITexture texture) {
|
public void deleteTexture(ITexture texture) {
|
||||||
|
@ -35,18 +34,22 @@ public class TextureTracker implements ISimpleRealodableAsset, IManagedAsset {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAssetsReloaded(IAssetProvider provider) {
|
public void onAssetsReloaded(IAssetProvider provider) {
|
||||||
textures.filter(Predicate.not(reloadable::contains)).forEach(ITexture::delete);
|
textures.forEach(ITexture::reset);
|
||||||
textures.clear();
|
textures.clear();
|
||||||
reloadable.peek(ITexture::reload).forEach(textures::add);
|
reloadable.peek(this::load).forEach(textures::add);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void destroy() {
|
public void destroy() {
|
||||||
textures.forEach(ITexture::delete);
|
textures.forEach(ITexture::reset);
|
||||||
textures.clear();
|
textures.clear();
|
||||||
reloadable.clear();
|
reloadable.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void load(ITexture texture) {
|
||||||
|
texture.load(provider);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName() { return "Texture Tracker"; }
|
public String getName() { return "Texture Tracker"; }
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package speiger.src.coreengine.rendering.texturesOld.atlas;
|
package speiger.src.coreengine.rendering.textures.custom;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -6,9 +6,11 @@ import speiger.src.collections.objects.lists.ObjectArrayList;
|
||||||
import speiger.src.collections.objects.utils.ObjectIterables;
|
import speiger.src.collections.objects.utils.ObjectIterables;
|
||||||
import speiger.src.collections.utils.HashUtil;
|
import speiger.src.collections.utils.HashUtil;
|
||||||
import speiger.src.coreengine.assets.AssetLocation;
|
import speiger.src.coreengine.assets.AssetLocation;
|
||||||
import speiger.src.coreengine.rendering.texturesOld.atlas.AtlasStitcher.Entry;
|
import speiger.src.coreengine.rendering.textures.custom.AtlasStitcher.Entry;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inspired by: <a href=https://github.com/lukaszdk/texture-atlas-generator/blob/master/AtlasGenerator.java>AtlasGenerator</a>
|
||||||
|
*/
|
||||||
public class AtlasStitcher<T extends Entry> {
|
public class AtlasStitcher<T extends Entry> {
|
||||||
|
|
||||||
final int maxWidth;
|
final int maxWidth;
|
||||||
|
@ -27,17 +29,20 @@ public class AtlasStitcher<T extends Entry> {
|
||||||
public AtlasStitcher(int maxWidth, int maxHeight) {
|
public AtlasStitcher(int maxWidth, int maxHeight) {
|
||||||
this.maxWidth = maxWidth;
|
this.maxWidth = maxWidth;
|
||||||
this.maxHeight = maxHeight;
|
this.maxHeight = maxHeight;
|
||||||
if(maxWidth < 16 || maxHeight < 16) throw new IndexOutOfBoundsException("Minimum Size has to be 16x16 pixels");
|
if(maxWidth < 256 || maxHeight < 256) throw new IndexOutOfBoundsException("Minimum Size has to be 256x256 pixels");
|
||||||
}
|
}
|
||||||
|
|
||||||
public int width() { return width; }
|
public int width() { return width; }
|
||||||
public int height() { return height; }
|
public int height() { return height; }
|
||||||
public boolean isValid() { return valid; }
|
public boolean isValid() { return valid; }
|
||||||
|
|
||||||
public void add(T entry) { add(new Record<T>(entry)); }
|
public void add(T entry) { add(new Record<>(entry)); }
|
||||||
|
public void addAll(Iterable<? extends T> iterables) { ObjectIterables.map(iterables, Record<T>::new).forEach(this::add); }
|
||||||
public void addAll(Iterable<? extends T> iterables) {
|
@SuppressWarnings("unchecked")
|
||||||
ObjectIterables.map(iterables, Record<T>::new).forEach(this::add);
|
public void addAll(T...entries) {
|
||||||
|
for(T entry : entries) {
|
||||||
|
add(new Record<>(entry));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void add(Record<T> entry) {
|
private void add(Record<T> entry) {
|
|
@ -0,0 +1,141 @@
|
||||||
|
package speiger.src.coreengine.rendering.textures.custom;
|
||||||
|
|
||||||
|
import org.lwjgl.opengl.GL45;
|
||||||
|
import org.lwjgl.system.MemoryUtil;
|
||||||
|
|
||||||
|
import speiger.src.collections.ints.collections.IntIterator;
|
||||||
|
import speiger.src.collections.ints.sets.IntLinkedOpenHashSet;
|
||||||
|
import speiger.src.collections.ints.sets.IntSet;
|
||||||
|
import speiger.src.coreengine.assets.base.IAssetProvider;
|
||||||
|
import speiger.src.coreengine.math.BitUtil;
|
||||||
|
import speiger.src.coreengine.rendering.textures.base.BaseTexture;
|
||||||
|
import speiger.src.coreengine.rendering.textures.base.TextureMetadata;
|
||||||
|
import speiger.src.coreengine.rendering.utils.values.GLDataType;
|
||||||
|
import speiger.src.coreengine.rendering.utils.values.textures.GLTextureFormat;
|
||||||
|
|
||||||
|
public class DynamicTexture extends BaseTexture implements IDynamicTexture {
|
||||||
|
IntSet dirtySections = new IntLinkedOpenHashSet();
|
||||||
|
TextureMetadata metadata;
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
long data;
|
||||||
|
|
||||||
|
public DynamicTexture(int width, int height, TextureMetadata metadata) {
|
||||||
|
this.metadata = metadata;
|
||||||
|
this.width = width;
|
||||||
|
this.height = height;
|
||||||
|
data = MemoryUtil.nmemAllocChecked(4L * width * height);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void load(IAssetProvider provider) {
|
||||||
|
createTexture();
|
||||||
|
metadata.applyArguments(id);
|
||||||
|
GL45.glTextureStorage2D(id, 1, GLTextureFormat.RGBA.glValue(), width, height);
|
||||||
|
GL45.nglTextureSubImage2D(id, 0, 0, 0, width, height, GLTextureFormat.RGBA.glValue(), GLDataType.UNSIGNED_BYTE.glValue(), data);
|
||||||
|
dirtySections.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void delete(boolean untrack) {
|
||||||
|
super.delete(untrack);
|
||||||
|
if(untrack && data != 0L) {
|
||||||
|
MemoryUtil.nmemFree(data);
|
||||||
|
data = 0L;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int width() { return width; }
|
||||||
|
@Override
|
||||||
|
public int height() { return height; }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isDirty() { return !dirtySections.isEmpty(); }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void process(boolean full) {
|
||||||
|
if(full) {
|
||||||
|
GL45.nglTextureSubImage2D(id, 0, 0, 0, width, height, GLTextureFormat.RGBA.glValue(), GLDataType.UNSIGNED_BYTE.glValue(), data);
|
||||||
|
dirtySections.clear();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Thread thread = Thread.currentThread();
|
||||||
|
long tempBuffer = MemoryUtil.nmemAllocChecked(1024);
|
||||||
|
for(IntIterator iter = dirtySections.iterator();iter.hasNext() && !thread.isInterrupted();iter.remove()) {
|
||||||
|
int key = iter.nextInt();
|
||||||
|
int x = BitUtil.toFirstShort(key) * 16;
|
||||||
|
int y = BitUtil.toSecondShort(key) * 16;
|
||||||
|
for(int i = 0;i<16;i++) {
|
||||||
|
MemoryUtil.memCopy(data + offset(x, y+i), tempBuffer+i*64, 64);//TODO implement a better solution here, i don't like it
|
||||||
|
}
|
||||||
|
GL45.nglTextureSubImage2D(id, 0, x, y, 16, 16, GLTextureFormat.RGBA.glValue(), GLDataType.UNSIGNED_BYTE.glValue(), tempBuffer);
|
||||||
|
}
|
||||||
|
MemoryUtil.nmemFree(tempBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long offset(int x, int y) {
|
||||||
|
return ((y * width()) + x) * 4L;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dirty(int x, int y) {
|
||||||
|
if(id() == 0) return;
|
||||||
|
dirtySections.add(BitUtil.toInt(x >> 4, y >> 4));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void set(int index, int data) {
|
||||||
|
MemoryUtil.memPutInt(index * 4L, Integer.rotateLeft(data, 8));
|
||||||
|
dirty(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setR(int index, int red) {
|
||||||
|
MemoryUtil.memPutByte(index * 4L, (byte)(red & 0xFF));
|
||||||
|
dirty(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setG(int index, int green) {
|
||||||
|
MemoryUtil.memPutByte(index * 4L + 1L, (byte)(green & 0xFF));
|
||||||
|
dirty(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setB(int index, int blue) {
|
||||||
|
MemoryUtil.memPutByte(index * 4L + 2L, (byte)(blue & 0xFF));
|
||||||
|
dirty(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setA(int index, int alpha) {
|
||||||
|
MemoryUtil.memPutByte(index * 4L + 3L, (byte)(alpha & 0xFF));
|
||||||
|
dirty(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int get(int index) {
|
||||||
|
return Integer.rotateRight(MemoryUtil.memGetInt(index * 4L), 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getR(int index) {
|
||||||
|
return MemoryUtil.memGetByte(index * 4L);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getG(int index) {
|
||||||
|
return MemoryUtil.memGetByte(index * 4L + 1L);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getB(int index) {
|
||||||
|
return MemoryUtil.memGetByte(index * 4L + 2L);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getA(int index) {
|
||||||
|
return MemoryUtil.memGetByte(index * 4L + 3L);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package speiger.src.coreengine.rendering.textures.custom;
|
||||||
|
|
||||||
|
import speiger.src.coreengine.rendering.textures.base.ITexture;
|
||||||
|
|
||||||
|
public interface IDynamicTexture extends ITexture {
|
||||||
|
public boolean isDirty();
|
||||||
|
public void process(boolean full);
|
||||||
|
|
||||||
|
public default void dirty(int index) { dirty(index % width(), index / width()); }
|
||||||
|
public void dirty(int x, int y);
|
||||||
|
|
||||||
|
public void set(int index, int data);
|
||||||
|
public default void set(int x, int y, int data) { set((y * width()) + x, data); }
|
||||||
|
|
||||||
|
public default void set(int index, int red, int green, int blue, int alpha) { set(index, ((alpha & 0xFF) << 24) | ((red & 0xFF) << 16) | ((green & 0xFF) << 8) | (blue & 0xFF)); }
|
||||||
|
public default void set(int x, int y, int red, int green, int blue, int alpha) { set((y * width()) + x, ((alpha & 0xFF) << 24) | ((red & 0xFF) << 16) | ((green & 0xFF) << 8) | (blue & 0xFF)); }
|
||||||
|
|
||||||
|
public void setR(int index, int red);
|
||||||
|
public default void setR(int x, int y, int red) { setR((y * width()) + x, red); }
|
||||||
|
|
||||||
|
public void setG(int index, int green);
|
||||||
|
public default void setG(int x, int y, int green) { setG((y * width()) + x, green); }
|
||||||
|
|
||||||
|
public void setB(int index, int blue);
|
||||||
|
public default void setB(int x, int y, int blue) { setB((y * width()) + x, blue); }
|
||||||
|
|
||||||
|
public void setA(int index, int alpha);
|
||||||
|
public default void setA(int x, int y, int alpha) { setA((y * width()) + x, alpha); }
|
||||||
|
|
||||||
|
public int get(int index);
|
||||||
|
public default int get(int x, int y) { return get((y * width()) + x); }
|
||||||
|
|
||||||
|
public int getR(int index);
|
||||||
|
public default int getR(int x, int y) { return getR((y * width()) + x); }
|
||||||
|
public int getG(int index);
|
||||||
|
public default int getG(int x, int y) { return getG((y * width()) + x); }
|
||||||
|
public int getB(int index);
|
||||||
|
public default int getB(int x, int y) { return getB((y * width()) + x); }
|
||||||
|
public int getA(int index);
|
||||||
|
public default int getA(int x, int y) { return getA((y * width()) + x); }
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
package speiger.src.coreengine.rendering.textures.simple;
|
||||||
|
|
||||||
|
import org.lwjgl.opengl.GL45;
|
||||||
|
import org.lwjgl.stb.STBImage;
|
||||||
|
import org.lwjgl.system.MemoryUtil;
|
||||||
|
|
||||||
|
import speiger.src.coreengine.assets.base.IAssetProvider;
|
||||||
|
import speiger.src.coreengine.rendering.textures.base.BaseTexture;
|
||||||
|
import speiger.src.coreengine.rendering.textures.base.TextureMetadata;
|
||||||
|
|
||||||
|
public class DirectTexture extends BaseTexture {
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
long imageData;
|
||||||
|
TextureMetadata metadata;
|
||||||
|
|
||||||
|
public DirectTexture(int width, int height, long imageData, TextureMetadata metadata) {
|
||||||
|
this.width = width;
|
||||||
|
this.height = height;
|
||||||
|
this.imageData = imageData;
|
||||||
|
this.metadata = metadata;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void load(IAssetProvider provider) {
|
||||||
|
loadTexture();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void delete(boolean untrack) {
|
||||||
|
super.delete(untrack);
|
||||||
|
if(imageData == 0L || !untrack) return;
|
||||||
|
if(metadata.isSTBData()) {
|
||||||
|
STBImage.nstbi_image_free(imageData);
|
||||||
|
imageData = 0L;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
MemoryUtil.nmemFree(imageData);
|
||||||
|
imageData = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int width() { return width; }
|
||||||
|
@Override
|
||||||
|
public int height() { return width; }
|
||||||
|
|
||||||
|
private void loadTexture() {
|
||||||
|
createTexture();
|
||||||
|
metadata.applyArguments(id);
|
||||||
|
GL45.glTextureStorage2D(id, 1, metadata.getInternalFormat(), width, height);
|
||||||
|
GL45.glTextureSubImage2D(id, 0, 0, 0, width, height, metadata.getExternalFormat(), metadata.getDataFormat(), imageData);
|
||||||
|
if(metadata.generateMipMappings()) GL45.glGenerateTextureMipmap(id);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,43 +1,69 @@
|
||||||
package speiger.src.coreengine.rendering.textures.simple;
|
package speiger.src.coreengine.rendering.textures.simple;
|
||||||
|
|
||||||
import org.lwjgl.stb.STBImage;
|
import java.io.IOException;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
import org.lwjgl.opengl.GL45;
|
||||||
|
import org.lwjgl.stb.STBImage;
|
||||||
|
import org.lwjgl.system.MemoryUtil;
|
||||||
|
|
||||||
|
import speiger.src.coreengine.assets.AssetLocation;
|
||||||
|
import speiger.src.coreengine.assets.base.IAsset;
|
||||||
|
import speiger.src.coreengine.assets.base.IAssetProvider;
|
||||||
|
import speiger.src.coreengine.assets.parsers.NativeMemoryParser;
|
||||||
import speiger.src.coreengine.rendering.textures.base.BaseTexture;
|
import speiger.src.coreengine.rendering.textures.base.BaseTexture;
|
||||||
import speiger.src.coreengine.rendering.textures.base.TextureMetadata;
|
import speiger.src.coreengine.rendering.textures.base.TextureMetadata;
|
||||||
|
import speiger.src.coreengine.rendering.utils.values.GLDataType;
|
||||||
|
import speiger.src.coreengine.rendering.utils.values.textures.GLTextureFormat;
|
||||||
|
|
||||||
public class SimpleTexture extends BaseTexture {
|
public class SimpleTexture extends BaseTexture {
|
||||||
|
AssetLocation location;
|
||||||
|
TextureMetadata metadata;
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
long imageData;
|
|
||||||
TextureMetadata metadata;
|
|
||||||
|
|
||||||
public SimpleTexture(int width, int height, long imageData, TextureMetadata metadata) {
|
public SimpleTexture(AssetLocation location, TextureMetadata metadata) {
|
||||||
this.width = width;
|
this.location = location;
|
||||||
this.height = height;
|
|
||||||
this.imageData = imageData;
|
|
||||||
this.metadata = metadata;
|
this.metadata = metadata;
|
||||||
loadTexture();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void reload() {
|
public void load(IAssetProvider provider) {
|
||||||
|
long address = 0L;
|
||||||
|
int channel = GLTextureFormat.toComponents(metadata.getExternalFormat());
|
||||||
|
try(IAsset asset = provider.getAsset(location)) {
|
||||||
|
ByteBuffer buffer = asset.custom(NativeMemoryParser.INSTANCE);
|
||||||
|
int[] width = new int[1];
|
||||||
|
int[] height = new int[1];
|
||||||
|
int[] fileChannels = new int[1];
|
||||||
|
address = STBImage.nstbi_load_from_memory(MemoryUtil.memAddress(buffer), buffer.remaining(), width, height, fileChannels, channel);
|
||||||
|
MemoryUtil.memFree(buffer);
|
||||||
|
if(address == 0) {
|
||||||
|
throw new IllegalArgumentException("Couldn't load texture ["+location+"]");
|
||||||
|
}
|
||||||
|
this.width = width[0];
|
||||||
|
this.height = height[0];
|
||||||
|
if(channel == 0) channel = fileChannels[0];
|
||||||
|
}
|
||||||
|
catch(IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
if(address == 0L) return;
|
||||||
|
createTexture();
|
||||||
|
metadata.applyArguments(id);
|
||||||
|
GL45.glTextureStorage2D(id, 1, metadata.getInternalFormat(), width, height);
|
||||||
|
GL45.nglTextureSubImage2D(id, 0, 0, 0, width, height, GLTextureFormat.bySTB(channel).glValue(), GLDataType.UNSIGNED_BYTE.glValue(), address);
|
||||||
|
if(metadata.generateMipMappings()) GL45.glGenerateTextureMipmap(id);
|
||||||
|
STBImage.nstbi_image_free(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void delete() {
|
public int width() {
|
||||||
super.delete();
|
return width;
|
||||||
if(imageData == 0L) return;
|
|
||||||
STBImage.nstbi_image_free(imageData);
|
|
||||||
imageData = 0L;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int width() { return width; }
|
public int height() {
|
||||||
@Override
|
return height;
|
||||||
public int height() { return width; }
|
|
||||||
|
|
||||||
private void loadTexture() {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
package speiger.src.coreengine.rendering.textures.simple;
|
||||||
|
|
||||||
|
import speiger.src.coreengine.assets.base.IAssetProvider;
|
||||||
|
import speiger.src.coreengine.rendering.textures.base.BaseTexture;
|
||||||
|
import speiger.src.coreengine.rendering.textures.base.ITexture;
|
||||||
|
|
||||||
|
public class WrappedTexture extends BaseTexture {
|
||||||
|
public WrappedTexture(ITexture texture) {
|
||||||
|
this(texture.id());
|
||||||
|
}
|
||||||
|
|
||||||
|
public WrappedTexture(int id) {
|
||||||
|
super(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void load(IAssetProvider provider) {}
|
||||||
|
@Override
|
||||||
|
protected void track() {}
|
||||||
|
@Override
|
||||||
|
public void delete(boolean untrack) {}
|
||||||
|
@Override
|
||||||
|
public int width() { return 0; }
|
||||||
|
@Override
|
||||||
|
public int height() { return 0; }
|
||||||
|
}
|
|
@ -7,7 +7,6 @@ import java.util.concurrent.locks.Lock;
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
import org.lwjgl.opengl.GL11;
|
import org.lwjgl.opengl.GL11;
|
||||||
import org.lwjgl.opengl.GL46;
|
|
||||||
import org.lwjgl.system.MemoryStack;
|
import org.lwjgl.system.MemoryStack;
|
||||||
import org.lwjgl.system.MemoryUtil;
|
import org.lwjgl.system.MemoryUtil;
|
||||||
|
|
||||||
|
|
|
@ -11,8 +11,8 @@ import org.lwjgl.system.MemoryUtil;
|
||||||
|
|
||||||
import speiger.src.coreengine.assets.AssetLocation;
|
import speiger.src.coreengine.assets.AssetLocation;
|
||||||
import speiger.src.coreengine.assets.base.IAsset;
|
import speiger.src.coreengine.assets.base.IAsset;
|
||||||
|
import speiger.src.coreengine.assets.parsers.NativeMemoryParser;
|
||||||
import speiger.src.coreengine.rendering.texturesOld.base.AbstractTexture;
|
import speiger.src.coreengine.rendering.texturesOld.base.AbstractTexture;
|
||||||
import speiger.src.coreengine.rendering.texturesOld.base.NativeMemoryParser;
|
|
||||||
import speiger.src.coreengine.rendering.texturesOld.base.TextureManager;
|
import speiger.src.coreengine.rendering.texturesOld.base.TextureManager;
|
||||||
|
|
||||||
public class STBTexture extends AbstractTexture
|
public class STBTexture extends AbstractTexture
|
||||||
|
|
|
@ -9,10 +9,10 @@ import speiger.src.coreengine.rendering.utils.values.IGLValue.ISourceFactor;
|
||||||
|
|
||||||
public class BlendState extends GLState
|
public class BlendState extends GLState
|
||||||
{
|
{
|
||||||
int srcRGB = GLBlendFactor.ONE.glMode();
|
int srcRGB = GLBlendFactor.ONE.glValue();
|
||||||
int destRGB = GLBlendFactor.ZERO.glMode();
|
int destRGB = GLBlendFactor.ZERO.glValue();
|
||||||
int srcAlpha = GLBlendFactor.ONE.glMode();
|
int srcAlpha = GLBlendFactor.ONE.glValue();
|
||||||
int destAlpha = GLBlendFactor.ZERO.glMode();
|
int destAlpha = GLBlendFactor.ZERO.glValue();
|
||||||
|
|
||||||
public BlendState() {
|
public BlendState() {
|
||||||
super(GL11.GL_BLEND);
|
super(GL11.GL_BLEND);
|
||||||
|
@ -37,12 +37,12 @@ public class BlendState extends GLState
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlendState setFunction(ISourceFactor srcRGB, ISourceFactor srcAlpha, IDestinationFactor destRGB, IDestinationFactor destAlpha) {
|
public BlendState setFunction(ISourceFactor srcRGB, ISourceFactor srcAlpha, IDestinationFactor destRGB, IDestinationFactor destAlpha) {
|
||||||
setFunction(srcRGB.glMode(), srcAlpha.glMode(), destRGB.glMode(), destAlpha.glMode());
|
setFunction(srcRGB.glValue(), srcAlpha.glValue(), destRGB.glValue(), destAlpha.glValue());
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlendState setFunction(ISourceFactor src, IDestinationFactor dest) {
|
public BlendState setFunction(ISourceFactor src, IDestinationFactor dest) {
|
||||||
setFunction(src.glMode(), dest.glMode());
|
setFunction(src.glValue(), dest.glValue());
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ public class CullState extends GLState {
|
||||||
enable();
|
enable();
|
||||||
if(this.state != state) {
|
if(this.state != state) {
|
||||||
this.state = state;
|
this.state = state;
|
||||||
GL11.glCullFace(state.glMode());
|
GL11.glCullFace(state.glValue());
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ public class CullState extends GLState {
|
||||||
@Override
|
@Override
|
||||||
public void reapply() {
|
public void reapply() {
|
||||||
super.reapply();
|
super.reapply();
|
||||||
GL11.glCullFace(state.glMode());
|
GL11.glCullFace(state.glValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -18,7 +18,7 @@ public class GLWireFrame implements IGLState
|
||||||
public GLWireFrame set(GLPoligonMode state) {
|
public GLWireFrame set(GLPoligonMode state) {
|
||||||
if(this.state != state) {
|
if(this.state != state) {
|
||||||
this.state = state;
|
this.state = state;
|
||||||
GL11.glPolygonMode(id.glMode(), state.glMode());
|
GL11.glPolygonMode(id.glValue(), state.glValue());
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,6 @@ public class GLWireFrame implements IGLState
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void reapply() {
|
public void reapply() {
|
||||||
GL11.glPolygonMode(id.glMode(), state.glMode());
|
GL11.glPolygonMode(id.glValue(), state.glValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -20,7 +20,7 @@ public enum BufferState implements IGLValue {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int glMode() {
|
public int glValue() {
|
||||||
return glValue;
|
return glValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ public enum GLAlphaFunction implements IGLValue {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int glMode() {
|
public int glValue() {
|
||||||
return glValue;
|
return glValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,5 +29,5 @@ public enum GLBlendFactor implements ISourceFactor, IDestinationFactor {
|
||||||
this.glMode = glMode;
|
this.glMode = glMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int glMode() { return glMode; }
|
public int glValue() { return glMode; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,5 +32,5 @@ public enum GLBuffer implements IGLBuffer {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int glMode() { return glMode; }
|
public int glValue() { return glMode; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ public enum GLCullType implements IGLValue {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int glMode() {
|
public int glValue() {
|
||||||
return glValue;
|
return glValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ import speiger.src.collections.ints.maps.interfaces.Int2ObjectMap;
|
||||||
import speiger.src.collections.objects.maps.impl.hash.Object2ObjectOpenHashMap;
|
import speiger.src.collections.objects.maps.impl.hash.Object2ObjectOpenHashMap;
|
||||||
import speiger.src.coreengine.rendering.utils.values.IGLValue.IGLDataType;
|
import speiger.src.coreengine.rendering.utils.values.IGLValue.IGLDataType;
|
||||||
|
|
||||||
public record GLDataType(String name, int glMode, int byteSize, GLDataType.DataType type, boolean supportsIBO, boolean isCompound) implements IGLDataType {
|
public record GLDataType(String name, int glValue, int byteSize, GLDataType.DataType type, boolean supportsIBO, boolean isCompound) implements IGLDataType {
|
||||||
static final Int2ObjectMap<GLDataType> ID_TO_TYPE = new Int2ObjectOpenHashMap<>();
|
static final Int2ObjectMap<GLDataType> ID_TO_TYPE = new Int2ObjectOpenHashMap<>();
|
||||||
static final Map<String, GLDataType> NAME_TO_TYPE = new Object2ObjectOpenHashMap<>();
|
static final Map<String, GLDataType> NAME_TO_TYPE = new Object2ObjectOpenHashMap<>();
|
||||||
|
|
||||||
|
@ -42,16 +42,16 @@ public record GLDataType(String name, int glMode, int byteSize, GLDataType.DataT
|
||||||
public static final GLDataType UNSIGNED_INT_10F_11F_11F_REV = new GLDataType("u_int_10_11_11_rev", GL30.GL_UNSIGNED_INT_10F_11F_11F_REV, 4, DataType.INT);
|
public static final GLDataType UNSIGNED_INT_10F_11F_11F_REV = new GLDataType("u_int_10_11_11_rev", GL30.GL_UNSIGNED_INT_10F_11F_11F_REV, 4, DataType.INT);
|
||||||
public static final GLDataType UNSIGNED_INT_5_9_9_9_REV = new GLDataType("u_int_5_9_9_9_rev", GL30.GL_UNSIGNED_INT_5_9_9_9_REV, 4, DataType.INT);
|
public static final GLDataType UNSIGNED_INT_5_9_9_9_REV = new GLDataType("u_int_5_9_9_9_rev", GL30.GL_UNSIGNED_INT_5_9_9_9_REV, 4, DataType.INT);
|
||||||
|
|
||||||
public GLDataType(String name, int glMode, int byteSize, DataType type, boolean isCompound) {
|
public GLDataType(String name, int glValue, int byteSize, DataType type, boolean isCompound) {
|
||||||
this(name, glMode, byteSize, type, false, isCompound);
|
this(name, glValue, byteSize, type, false, isCompound);
|
||||||
}
|
}
|
||||||
|
|
||||||
public GLDataType(String name, int glMode, int byteSize, DataType type) {
|
public GLDataType(String name, int glValue, int byteSize, DataType type) {
|
||||||
this(name, glMode, byteSize, type, false, false);
|
this(name, glValue, byteSize, type, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public GLDataType {
|
public GLDataType {
|
||||||
ID_TO_TYPE.put(glMode, this);
|
ID_TO_TYPE.put(glValue, this);
|
||||||
NAME_TO_TYPE.put(name, this);
|
NAME_TO_TYPE.put(name, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ public enum GLMode implements IGLMode {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int glMode() { return glMode; }
|
public int glValue() { return glMode; }
|
||||||
@Override
|
@Override
|
||||||
public int primitiveLength() { return length; }
|
public int primitiveLength() { return length; }
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -14,7 +14,7 @@ public enum GLPoligonMode implements IGLValue {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int glMode() {
|
public int glValue() {
|
||||||
return glValue;
|
return glValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package speiger.src.coreengine.rendering.utils.values;
|
package speiger.src.coreengine.rendering.utils.values;
|
||||||
|
|
||||||
public interface IGLValue {
|
public interface IGLValue {
|
||||||
public int glMode();
|
public int glValue();
|
||||||
|
|
||||||
public static interface IGLBuffer extends IGLValue {}
|
public static interface IGLBuffer extends IGLValue {}
|
||||||
public static interface ISourceFactor extends IGLValue {}
|
public static interface ISourceFactor extends IGLValue {}
|
||||||
|
|
|
@ -20,5 +20,5 @@ public enum ShaderType implements IShaderType {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int glMode() { return glMode; }
|
public int glValue() { return glMode; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,9 @@ public enum GLTextureFormat implements ITextureFormatType {
|
||||||
RGB(GL11.GL_RGB, true),
|
RGB(GL11.GL_RGB, true),
|
||||||
RGBA(GL11.GL_RGBA, true),
|
RGBA(GL11.GL_RGBA, true),
|
||||||
DEPTH(GL11.GL_DEPTH_COMPONENT, true),
|
DEPTH(GL11.GL_DEPTH_COMPONENT, true),
|
||||||
DEPTH_STENCIL(GL30.GL_DEPTH_STENCIL, true);
|
DEPTH_STENCIL(GL30.GL_DEPTH_STENCIL, true),
|
||||||
|
LUMINANCE(GL11.GL_LUMINANCE, false),
|
||||||
|
LUMINANCE_ALPHA(GL11.GL_LUMINANCE_ALPHA, false);
|
||||||
|
|
||||||
int glMode;
|
int glMode;
|
||||||
boolean internal;
|
boolean internal;
|
||||||
|
@ -22,7 +24,27 @@ public enum GLTextureFormat implements ITextureFormatType {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int glMode() { return glMode; }
|
public int glValue() { return glMode; }
|
||||||
@Override
|
@Override
|
||||||
public boolean internal() { return internal; }
|
public boolean internal() { return internal; }
|
||||||
|
|
||||||
|
public static int toComponents(int glValue) {
|
||||||
|
return switch(glValue) {
|
||||||
|
case GL11.GL_LUMINANCE -> 1;
|
||||||
|
case GL11.GL_LUMINANCE_ALPHA -> 2;
|
||||||
|
case GL11.GL_RGB -> 3;
|
||||||
|
case GL11.GL_RGBA -> 4;
|
||||||
|
default -> 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static GLTextureFormat bySTB(int components) {
|
||||||
|
return switch(components) {
|
||||||
|
case 1 -> LUMINANCE;
|
||||||
|
case 2 -> LUMINANCE_ALPHA;
|
||||||
|
case 3 -> RGB;
|
||||||
|
case 4 -> RGBA;
|
||||||
|
default -> throw new IllegalArgumentException("Only 1-4 Components are supported");
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ public enum GLTextureParameter implements ITextureParameter {
|
||||||
private GLTextureParameter(int glValue, IGLValue... validValues) {
|
private GLTextureParameter(int glValue, IGLValue... validValues) {
|
||||||
this.glValue = glValue;
|
this.glValue = glValue;
|
||||||
this.validValues = new IntOpenHashSet(validValues.length);
|
this.validValues = new IntOpenHashSet(validValues.length);
|
||||||
for(int i = 0,m=validValues.length;i<m;this.validValues.add(validValues[i++].glMode()));
|
for(int i = 0,m=validValues.length;i<m;this.validValues.add(validValues[i++].glValue()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private GLTextureParameter(int glValue, boolean any) {
|
private GLTextureParameter(int glValue, boolean any) {
|
||||||
|
@ -49,7 +49,7 @@ public enum GLTextureParameter implements ITextureParameter {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int glMode() {
|
public int glValue() {
|
||||||
return glValue;
|
return glValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
package speiger.src.coreengine.rendering.utils.values.textures;
|
||||||
|
|
||||||
|
import org.lwjgl.opengl.GL11;
|
||||||
|
import org.lwjgl.opengl.GL12;
|
||||||
|
import org.lwjgl.opengl.GL30;
|
||||||
|
import org.lwjgl.opengl.GL31;
|
||||||
|
import org.lwjgl.opengl.GL32;
|
||||||
|
import org.lwjgl.opengl.GL40;
|
||||||
|
import org.lwjgl.opengl.GL46;
|
||||||
|
|
||||||
|
import speiger.src.coreengine.rendering.utils.values.IGLValue;
|
||||||
|
|
||||||
|
public enum GLTextureType implements IGLValue {
|
||||||
|
TEXTURE_1D(GL11.GL_TEXTURE_1D),
|
||||||
|
TEXTURE_1D_ARRAY(GL30.GL_TEXTURE_1D_ARRAY),
|
||||||
|
TEXTURE_2D(GL11.GL_TEXTURE_2D),
|
||||||
|
TEXTURE_2D_ARRAY(GL30.GL_TEXTURE_2D_ARRAY),
|
||||||
|
TEXTURE_2D_MULTISAMPLE(GL32.GL_TEXTURE_2D_MULTISAMPLE),
|
||||||
|
TEXTURE_2D_MULTISAMPLE_ARRAY(GL32.GL_TEXTURE_2D_MULTISAMPLE_ARRAY),
|
||||||
|
TEXTURE_3D(GL12.GL_TEXTURE_3D),
|
||||||
|
TEXTURE_CUBE_MAP(GL32.GL_TEXTURE_CUBE_MAP),
|
||||||
|
TEXTURE_CUBE_MAP_ARRAY(GL40.GL_TEXTURE_CUBE_MAP_ARRAY),
|
||||||
|
TEXTURE_RECTANGLE(GL31.GL_TEXTURE_RECTANGLE),
|
||||||
|
TEXTURE_BUFFER(GL31.GL_TEXTURE_BUFFER);
|
||||||
|
|
||||||
|
int glValue;
|
||||||
|
|
||||||
|
private GLTextureType(int glValue) {
|
||||||
|
this.glValue = glValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int glValue() {
|
||||||
|
GL46.glBindTexture(glValue, glValue);
|
||||||
|
return glValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -39,7 +39,7 @@ public enum GLTextureValue implements IGLValue {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int glMode() {
|
public int glValue() {
|
||||||
return glValue;
|
return glValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue