Got things running
This commit is contained in:
@@ -3,8 +3,8 @@ package speiger.src.coreengine;
|
||||
import java.util.List;
|
||||
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
import org.lwjgl.opengl.GL;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
import org.lwjgl.opengl.GL15;
|
||||
|
||||
import speiger.src.coreengine.assets.AssetLocation;
|
||||
import speiger.src.coreengine.assets.AssetManager;
|
||||
@@ -16,10 +16,17 @@ import speiger.src.coreengine.rendering.input.devices.Keyboard;
|
||||
import speiger.src.coreengine.rendering.input.devices.Mouse;
|
||||
import speiger.src.coreengine.rendering.input.window.Window;
|
||||
import speiger.src.coreengine.rendering.input.window.WindowManager;
|
||||
import speiger.src.coreengine.rendering.models.buffers.BufferAttribute;
|
||||
import speiger.src.coreengine.rendering.models.buffers.VertexArray;
|
||||
import speiger.src.coreengine.rendering.shader.Shader;
|
||||
import speiger.src.coreengine.rendering.shader.SimpleShader;
|
||||
import speiger.src.coreengine.rendering.shader.uniform.base.TextureUniform;
|
||||
import speiger.src.coreengine.rendering.tesselation.buffer.VertexBuilder;
|
||||
import speiger.src.coreengine.rendering.tesselation.format.VertexTypes;
|
||||
import speiger.src.coreengine.rendering.textures.custom.DynamicTexture;
|
||||
import speiger.src.coreengine.rendering.utils.GLStateTracker;
|
||||
import speiger.src.coreengine.rendering.utils.values.GLDataType;
|
||||
import speiger.src.coreengine.rendering.utils.values.GLMode;
|
||||
import speiger.src.coreengine.utils.eventbus.EventBus;
|
||||
import speiger.src.coreengine.utils.helpers.IOUtils;
|
||||
|
||||
@@ -46,11 +53,42 @@ public class NewInputTest {
|
||||
Window window = manager.builder().title("Testing Engine").build();
|
||||
shaderTest.register();
|
||||
assets.addListener(GLStateTracker.instance().shaders);
|
||||
assets.addListener(GLStateTracker.TEXTURE_TRACKER);
|
||||
assets.reload(Runnable::run, Runnable::run);
|
||||
|
||||
System.out.println("Testing: "+GL.getCapabilities().OpenGL46);
|
||||
|
||||
DynamicTexture texture = new DynamicTexture(16, 16, DynamicTexture.DEFAULT_PARAMETERS);
|
||||
texture.fill(0, 0, 16, 16, -1);
|
||||
texture.fill(0, 0, 8, 8, 255, 0, 0, 255);
|
||||
texture.fill(8, 0, 8, 8, 0, 255, 0, 255);
|
||||
texture.fill(8, 8, 8, 8, 255, 0, 0, 255);
|
||||
texture.fill(0, 8, 8, 8, 0, 0, 255, 255);
|
||||
texture.process(true);
|
||||
window.visible(true);
|
||||
|
||||
VertexBuilder builder = new VertexBuilder(255);
|
||||
builder.start(GLMode.TRIANGLES, VertexTypes.TESTING);
|
||||
builder.pos(-0.5F, -0.5F, 0).tex(0F, 1F).rgba(-1).endVertex();
|
||||
builder.pos(0.5F, -0.5F, 0).tex(1F, 1F).rgba(-1).endVertex();
|
||||
builder.pos(0.5F, 0.5F, 0).tex(1F, 0F).rgba(-1).endVertex();
|
||||
builder.pos(0.5F, 0.5F, 0).tex(1F, 0F).rgba(-1).endVertex();
|
||||
builder.pos(-0.5F, 0.5F, 0).tex(0F, 0F).rgba(-1).endVertex();
|
||||
builder.pos(-0.5F, -0.5F, 0).tex(0F, 1F).rgba(-1).endVertex();
|
||||
|
||||
TestModel model = new TestModel(builder.getBytes());
|
||||
|
||||
GL11.glClearColor(0.2F, 0.55F, 0.66F, 1F);
|
||||
while(!window.shouldClose()) {
|
||||
GLFW.glfwPollEvents();
|
||||
window.beginFrame();
|
||||
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
|
||||
shaderTest.bind();
|
||||
shaderTest.get().texture.set(texture);
|
||||
model.bindArray();
|
||||
GLStateTracker.drawArrays(GLMode.TRIANGLES.glValue(), 6);
|
||||
|
||||
model.unbindArray();
|
||||
window.handleInput();
|
||||
window.finishFrame();
|
||||
try { Thread.sleep(100); }
|
||||
@@ -66,4 +104,12 @@ public class NewInputTest {
|
||||
super(provider, "testing_shader", AssetLocation.of("shader/testing/vertex.vs"), AssetLocation.of("shader/testing/fragment.fs"), "in_position", "in_tex", "in_color");
|
||||
}
|
||||
}
|
||||
|
||||
public static class TestModel extends VertexArray {
|
||||
public TestModel(byte[] data) {
|
||||
bind();
|
||||
createBuffer(new BufferAttribute(0, 3), new BufferAttribute(1, 2), new BufferAttribute(2, 4, GLDataType.UNSIGNED_BYTE)).set(data).unbind();
|
||||
unbind();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ public class ZipAssetPackage implements IAssetPackage {
|
||||
try(DirectoryStream<Path> dirs = Files.newDirectoryStream(system.getPath("assets"))) {
|
||||
for(Path path : dirs) {
|
||||
String s = path.getFileName().toString();
|
||||
domains.add(s.substring(0, s.length() - 1));
|
||||
domains.add(s.substring(0, s.length()));
|
||||
}
|
||||
}
|
||||
catch(Exception e) {
|
||||
|
||||
@@ -63,7 +63,7 @@ public class Window {
|
||||
flags.setFlag(CPU_FPS_CAP, builder.fpsCap);
|
||||
createDefaultWindowHints();
|
||||
GLFW.glfwWindowHint(GLFW.GLFW_SAMPLES, antialiasing);
|
||||
GLFW.glfwWindowHint(GLFW.GLFW_RESIZABLE, flags.isFlagNotSet(RESIZABLE) ? GLFW.GLFW_TRUE : GLFW.GLFW_FALSE);
|
||||
GLFW.glfwWindowHint(GLFW.GLFW_RESIZABLE, flags.isFlagSet(RESIZABLE) ? GLFW.GLFW_TRUE : GLFW.GLFW_FALSE);
|
||||
GLFW.glfwWindowHint(GLFW.GLFW_DECORATED, flags.isFlagNotSet(FULL_SCREEN) && flags.isFlagSet(BORDERLESS) ? GLFW.GLFW_FALSE : GLFW.GLFW_TRUE);
|
||||
GLFW.glfwWindowHint(GLFW.GLFW_FLOATING, flags.isFlagNotSet(FULL_SCREEN) && flags.isFlagSet(FLOATING) ? GLFW.GLFW_TRUE : GLFW.GLFW_FALSE);
|
||||
GLFW.glfwWindowHint(GLFW.GLFW_MAXIMIZED, flags.isFlagNotSet(FULL_SCREEN) && flags.isFlagSet(MAXIMIZED) ? GLFW.GLFW_TRUE : GLFW.GLFW_FALSE);
|
||||
|
||||
@@ -7,6 +7,7 @@ import java.util.function.IntPredicate;
|
||||
|
||||
import org.lwjgl.opengl.GL20;
|
||||
import org.lwjgl.opengl.GL41;
|
||||
import org.lwjgl.opengl.GL45;
|
||||
import org.lwjgl.opengl.GL46;
|
||||
import org.lwjgl.system.MemoryUtil;
|
||||
|
||||
@@ -30,6 +31,10 @@ public abstract class ShaderProgram {
|
||||
public int id() { return id; }
|
||||
public UniformManager getUniforms() { return uniforms; }
|
||||
|
||||
protected void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void bind() {
|
||||
GLStateTracker.instance().shaders.bind(this);
|
||||
uniforms.bind();
|
||||
@@ -44,6 +49,7 @@ public abstract class ShaderProgram {
|
||||
|
||||
public void validateProgram() {
|
||||
if(id == 0) return;
|
||||
uniforms.validate();
|
||||
GL46.glValidateProgram(id);
|
||||
}
|
||||
|
||||
@@ -60,6 +66,10 @@ public abstract class ShaderProgram {
|
||||
GL20.glDeleteProgram(id);
|
||||
return 0;
|
||||
}
|
||||
String error = GL45.glGetProgramInfoLog(id);
|
||||
if(!error.isBlank()) {
|
||||
System.out.println("Error: "+error);
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,8 +9,7 @@ import speiger.src.coreengine.rendering.utils.values.ShaderType;
|
||||
public abstract class SimpleShader extends ShaderProgram {
|
||||
|
||||
public SimpleShader(IAssetProvider provider, String identifer, AssetLocation vertex, AssetLocation fragment, String...attributes) {
|
||||
//TODO id is never set?
|
||||
loadOrGenerateCache(identifer, provider.getLatestTime(vertex, fragment), id -> {
|
||||
setId(loadOrGenerateCache(identifer, provider.getLatestTime(vertex, fragment), id -> {
|
||||
int vId = loadShader(provider, vertex, ShaderType.VERTEX);
|
||||
if(vId == -1) return false;
|
||||
int fId = loadShader(provider, fragment, ShaderType.FRAGMENT);
|
||||
@@ -26,6 +25,6 @@ public abstract class SimpleShader extends ShaderProgram {
|
||||
GL20.glDeleteShader(vId);
|
||||
GL20.glDeleteShader(fId);
|
||||
return true;
|
||||
});
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,6 +81,12 @@ public class UniformManager {
|
||||
return uniform;
|
||||
}
|
||||
|
||||
public void validate() {
|
||||
for(int i = 0,m=uniforms.size();i<m;i++) {
|
||||
uniforms.get(i).registerShader(owner);
|
||||
}
|
||||
}
|
||||
|
||||
public void bind() {
|
||||
if(autoUniforms.isEmpty()) return;
|
||||
for(int i = 0,m=autoUniforms.size();i<m;i++) {
|
||||
|
||||
@@ -4,6 +4,7 @@ import org.lwjgl.opengl.GL41;
|
||||
|
||||
import speiger.src.coreengine.rendering.shader.uniform.IAutoUniform;
|
||||
import speiger.src.coreengine.rendering.shader.uniform.Uniform;
|
||||
import speiger.src.coreengine.rendering.textures.base.ITexture;
|
||||
import speiger.src.coreengine.rendering.utils.AllocationTracker;
|
||||
import speiger.src.coreengine.rendering.utils.GLStateTracker;
|
||||
|
||||
@@ -16,6 +17,10 @@ public class TextureUniform extends Uniform implements IAutoUniform {
|
||||
this.unit = unit;
|
||||
}
|
||||
|
||||
public TextureUniform set(ITexture texture) {
|
||||
return set(texture.id());
|
||||
}
|
||||
|
||||
public TextureUniform set(int id) {
|
||||
if(this.value != id) {
|
||||
this.value = id;
|
||||
|
||||
@@ -12,4 +12,5 @@ public class VertexTypes {
|
||||
|
||||
public static final VertexFormat POS_RGB_3D = VertexFormat.builder().add(POSITION_3D).add(RGB).build();
|
||||
public static final VertexFormat POS_RGBA_3D = VertexFormat.builder().add(POSITION_3D).add(RGBA).build();
|
||||
public static final VertexFormat TESTING = VertexFormat.builder().add(POSITION_3D).add(TEXTURE).add(RGBA).build();
|
||||
}
|
||||
|
||||
@@ -8,9 +8,7 @@ import speiger.src.coreengine.rendering.utils.values.textures.GLTextureType;
|
||||
public abstract class BaseTexture implements ITexture {
|
||||
protected int id;
|
||||
|
||||
protected BaseTexture() {
|
||||
track();
|
||||
}
|
||||
protected BaseTexture() {}
|
||||
|
||||
protected BaseTexture(int id) {
|
||||
this.id = id;
|
||||
@@ -18,7 +16,8 @@ public abstract class BaseTexture implements ITexture {
|
||||
}
|
||||
|
||||
protected void createTexture() {
|
||||
this.id = GLFunctions.createTexture(textureType());
|
||||
this.id = GLFunctions.createTexture();
|
||||
bind();
|
||||
}
|
||||
|
||||
protected IGLValue textureType() {
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
package speiger.src.coreengine.rendering.textures.base;
|
||||
|
||||
import org.lwjgl.opengl.GL45;
|
||||
|
||||
import speiger.src.collections.longs.lists.LongArrayList;
|
||||
import speiger.src.collections.longs.lists.LongList;
|
||||
import speiger.src.coreengine.math.BitUtil;
|
||||
import speiger.src.coreengine.rendering.utils.GLFunctions;
|
||||
import speiger.src.coreengine.rendering.utils.values.IGLValue;
|
||||
import speiger.src.coreengine.rendering.utils.values.IGLValue.IGLDataType;
|
||||
import speiger.src.coreengine.rendering.utils.values.IGLValue.ITextureFormatType;
|
||||
@@ -20,10 +19,10 @@ public class TextureMetadata {
|
||||
|
||||
private TextureMetadata() {}
|
||||
|
||||
public void applyArguments(int texture) {
|
||||
public void applyArguments(IGLValue textureType) {
|
||||
for(int i = 0,m=arguments.size();i<m;i++) {
|
||||
long value = arguments.getLong(i);
|
||||
GL45.glTextureParameteri(texture, BitUtil.intKey(value), BitUtil.intValue(value));
|
||||
GLFunctions.textureParameter(textureType.glValue(), BitUtil.intKey(value), BitUtil.intValue(value));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+37
-28
@@ -1,6 +1,5 @@
|
||||
package speiger.src.coreengine.rendering.textures.custom;
|
||||
|
||||
import org.lwjgl.opengl.GL45;
|
||||
import org.lwjgl.system.MemoryUtil;
|
||||
|
||||
import speiger.src.collections.ints.collections.IntIterator;
|
||||
@@ -11,11 +10,17 @@ import speiger.src.coreengine.math.BitUtil;
|
||||
import speiger.src.coreengine.math.misc.ColorSpaces;
|
||||
import speiger.src.coreengine.rendering.textures.base.BaseTexture;
|
||||
import speiger.src.coreengine.rendering.textures.base.TextureMetadata;
|
||||
import speiger.src.coreengine.rendering.utils.GLFunctions;
|
||||
import speiger.src.coreengine.rendering.utils.GLStateTracker;
|
||||
import speiger.src.coreengine.rendering.utils.values.GLDataType;
|
||||
import speiger.src.coreengine.rendering.utils.values.textures.GLTextureFormat;
|
||||
import speiger.src.coreengine.rendering.utils.values.textures.GLTextureParameter;
|
||||
import speiger.src.coreengine.rendering.utils.values.textures.GLTextureValue;
|
||||
|
||||
public class DynamicTexture extends BaseTexture implements IDynamicTexture {
|
||||
public static final TextureMetadata DEFAULT_PARAMETERS = TextureMetadata.builder()
|
||||
.arguement(GLTextureParameter.MIN_FILTER, GLTextureValue.NEAREST).arguement(GLTextureParameter.MAG_FILTER, GLTextureValue.NEAREST)
|
||||
.arguement(GLTextureParameter.WRAP_S, GLTextureValue.CLAMP_TO_EDGE).arguement(GLTextureParameter.WRAP_T, GLTextureValue.CLAMP_TO_EDGE).build();
|
||||
IntSet dirtySections = new IntLinkedOpenHashSet();
|
||||
TextureMetadata metadata;
|
||||
int width;
|
||||
@@ -28,14 +33,14 @@ public class DynamicTexture extends BaseTexture implements IDynamicTexture {
|
||||
this.height = height;
|
||||
if(width % 16 != 0 || height % 16 != 0) throw new IllegalArgumentException("Texture must be a power of 16");
|
||||
data = MemoryUtil.nmemAllocChecked(4L * width * height);
|
||||
track();
|
||||
}
|
||||
|
||||
@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);
|
||||
metadata.applyArguments(textureType());
|
||||
GLFunctions.upload2DImage(textureType(), 0, GLTextureFormat.RGBA, width, height, 0, GLTextureFormat.RGBA, GLDataType.UNSIGNED_BYTE, data);
|
||||
dirtySections.clear();
|
||||
}
|
||||
|
||||
@@ -59,30 +64,32 @@ public class DynamicTexture extends BaseTexture implements IDynamicTexture {
|
||||
|
||||
@Override
|
||||
public void process(boolean full) {
|
||||
bind();
|
||||
if(full) {
|
||||
GL45.nglTextureSubImage2D(id, 0, 0, 0, width, height, GLTextureFormat.RGBA.glValue(), GLDataType.UNSIGNED_BYTE.glValue(), data);
|
||||
GLFunctions.upload2DImage(textureType(), 0, GLTextureFormat.RGBA, width, height, 0, GLTextureFormat.RGBA, GLDataType.UNSIGNED_BYTE, data);
|
||||
dirtySections.clear();
|
||||
return;
|
||||
}
|
||||
GLStateTracker.instance().unpack_row_length.set(width());
|
||||
GLStateTracker tracker = GLStateTracker.instance();
|
||||
tracker.unpack_row_length.set(width());
|
||||
Thread thread = Thread.currentThread();
|
||||
for(IntIterator iter = dirtySections.iterator();iter.hasNext() && !thread.isInterrupted();iter.remove()) {
|
||||
int key = iter.nextInt();
|
||||
uploadPixels(BitUtil.shortKey(key) * 16, BitUtil.shortValue(key) * 16);
|
||||
uploadPixels(tracker, BitUtil.shortKey(key) * 16, BitUtil.shortValue(key) * 16);
|
||||
}
|
||||
GLStateTracker.instance().unpack_row_length.setDefault();
|
||||
GLStateTracker.instance().unpack_skip_pixel.setDefault();
|
||||
GLStateTracker.instance().unpack_skip_rows.setDefault();
|
||||
tracker.unpack_row_length.setDefault();
|
||||
tracker.unpack_skip_pixel.setDefault();
|
||||
tracker.unpack_skip_rows.setDefault();
|
||||
}
|
||||
|
||||
protected void uploadPixels(int x, int y) {
|
||||
GLStateTracker.instance().unpack_skip_pixel.set(x);
|
||||
GLStateTracker.instance().unpack_skip_rows.set(y);
|
||||
GL45.nglTextureSubImage2D(id, 0, x, y, 16, 16, GLTextureFormat.RGBA.glValue(), GLDataType.UNSIGNED_BYTE.glValue(), data);
|
||||
protected void uploadPixels(GLStateTracker tracker, int x, int y) {
|
||||
tracker.unpack_skip_pixel.set(x);
|
||||
tracker.unpack_skip_rows.set(y);
|
||||
GLFunctions.upload2DSubImage(textureType(), 0, x, y, 16, 16, GLTextureFormat.RGBA, GLDataType.UNSIGNED_BYTE, data);
|
||||
}
|
||||
|
||||
protected long offset(int x, int y) {
|
||||
return ((y * width()) + x) << 2;
|
||||
return ((y * width()) + x) << 2L;
|
||||
}
|
||||
|
||||
protected void ensureValid(int index) {
|
||||
@@ -91,7 +98,7 @@ public class DynamicTexture extends BaseTexture implements IDynamicTexture {
|
||||
|
||||
protected void ensureValid(int x, int y) {
|
||||
if(x < 0 || y < 0) throw new ArrayIndexOutOfBoundsException("Index out of bounds: X=["+x+"], Y=["+y+"]");
|
||||
if(x >= width || y >= height) throw new ArrayIndexOutOfBoundsException("Index out of bounds: X=["+x+"], Y=["+y+"], width=["+width+"], height=["+height+"]");
|
||||
if(x > width || y > height) throw new ArrayIndexOutOfBoundsException("Index out of bounds: X=["+x+"], Y=["+y+"], width=["+width+"], height=["+height+"]");
|
||||
if(data == 0L) throw new IllegalStateException("Texture Data isn't bound");
|
||||
}
|
||||
|
||||
@@ -99,8 +106,10 @@ public class DynamicTexture extends BaseTexture implements IDynamicTexture {
|
||||
public void fill(int x, int y, int width, int height, int data) {
|
||||
ensureValid(x, y);
|
||||
ensureValid(x+width, y+height);
|
||||
for(int yOff = 0;yOff<height;yOff++) {
|
||||
MemoryUtil.memSet(offset(x, y+yOff), data, width * 4L);
|
||||
for(int xOff = 0;xOff<width;xOff++) {
|
||||
for(int yOff = 0;yOff<height;yOff++) {
|
||||
MemoryUtil.memPutInt(this.data + offset(x+xOff, y+yOff), data);
|
||||
}
|
||||
}
|
||||
if(id() == 0) return;
|
||||
for(int i = x>>4,m=width>>4;i<m;i++) {
|
||||
@@ -120,65 +129,65 @@ public class DynamicTexture extends BaseTexture implements IDynamicTexture {
|
||||
@Override
|
||||
public void set(int index, int data) {
|
||||
ensureValid(index);
|
||||
MemoryUtil.memPutInt(index * 4L, data);
|
||||
MemoryUtil.memPutInt(this.data + index * 4L, data);
|
||||
dirty(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setR(int index, int red) {
|
||||
ensureValid(index);
|
||||
MemoryUtil.memPutByte(index * 4L, (byte)(red & 0xFF));
|
||||
MemoryUtil.memPutByte(data + index * 4L, (byte)(red & 0xFF));
|
||||
dirty(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setG(int index, int green) {
|
||||
ensureValid(index);
|
||||
MemoryUtil.memPutByte(index * 4L + 1L, (byte)(green & 0xFF));
|
||||
MemoryUtil.memPutByte(data + index * 4L + 1L, (byte)(green & 0xFF));
|
||||
dirty(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setB(int index, int blue) {
|
||||
ensureValid(index);
|
||||
MemoryUtil.memPutByte(index * 4L + 2L, (byte)(blue & 0xFF));
|
||||
MemoryUtil.memPutByte(data + index * 4L + 2L, (byte)(blue & 0xFF));
|
||||
dirty(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setA(int index, int alpha) {
|
||||
ensureValid(index);
|
||||
MemoryUtil.memPutByte(index * 4L + 3L, (byte)(alpha & 0xFF));
|
||||
MemoryUtil.memPutByte(data + index * 4L + 3L, (byte)(alpha & 0xFF));
|
||||
dirty(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int get(int index) {
|
||||
ensureValid(index);
|
||||
return MemoryUtil.memGetInt(index * 4L);
|
||||
return MemoryUtil.memGetInt(data + index * 4L);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getR(int index) {
|
||||
ensureValid(index);
|
||||
return MemoryUtil.memGetByte(index * 4L);
|
||||
return MemoryUtil.memGetByte(data + index * 4L);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getG(int index) {
|
||||
ensureValid(index);
|
||||
return MemoryUtil.memGetByte(index * 4L + 1L);
|
||||
return MemoryUtil.memGetByte(data + index * 4L + 1L);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getB(int index) {
|
||||
ensureValid(index);
|
||||
return MemoryUtil.memGetByte(index * 4L + 2L);
|
||||
return MemoryUtil.memGetByte(data + index * 4L + 2L);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getA(int index) {
|
||||
ensureValid(index);
|
||||
return MemoryUtil.memGetByte(index * 4L + 3L);
|
||||
return MemoryUtil.memGetByte(data + index * 4L + 3L);
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,12 @@
|
||||
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;
|
||||
import speiger.src.coreengine.rendering.utils.GLFunctions;
|
||||
|
||||
public class DirectTexture extends BaseTexture {
|
||||
int width;
|
||||
@@ -19,6 +19,7 @@ public class DirectTexture extends BaseTexture {
|
||||
this.height = height;
|
||||
this.imageData = imageData;
|
||||
this.metadata = metadata;
|
||||
track();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -47,9 +48,8 @@ public class DirectTexture extends BaseTexture {
|
||||
|
||||
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);
|
||||
metadata.applyArguments(textureType());
|
||||
GLFunctions.upload2DImage(textureType(), 0, metadata, width, height, 0, imageData);
|
||||
if(metadata.generateMipMappings()) GLFunctions.generateMipMaps(textureType());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ package speiger.src.coreengine.rendering.textures.simple;
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import org.lwjgl.opengl.GL45;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
import org.lwjgl.stb.STBImage;
|
||||
import org.lwjgl.system.MemoryUtil;
|
||||
|
||||
@@ -13,10 +13,17 @@ 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.TextureMetadata;
|
||||
import speiger.src.coreengine.rendering.utils.GLFunctions;
|
||||
import speiger.src.coreengine.rendering.utils.values.GLDataType;
|
||||
import speiger.src.coreengine.rendering.utils.values.textures.GLTextureFormat;
|
||||
import speiger.src.coreengine.rendering.utils.values.textures.GLTextureParameter;
|
||||
import speiger.src.coreengine.rendering.utils.values.textures.GLTextureValue;
|
||||
|
||||
public class SimpleTexture extends BaseTexture {
|
||||
public static final TextureMetadata DEFAULT_DATA = TextureMetadata.builder()
|
||||
.externalFormat(GLTextureFormat.RGBA).internalFormat(GLTextureFormat.RGBA).dataFormat(GLDataType.UNSIGNED_BYTE).mipmapping(false)
|
||||
.arguement(GLTextureParameter.MIN_FILTER, GLTextureValue.NEAREST).arguement(GLTextureParameter.MAG_FILTER, GLTextureValue.NEAREST)
|
||||
.arguement(GLTextureParameter.WRAP_S, GLTextureValue.CLAMP_TO_EDGE).arguement(GLTextureParameter.WRAP_T, GLTextureValue.CLAMP_TO_EDGE).build();
|
||||
AssetLocation location;
|
||||
TextureMetadata metadata;
|
||||
int width;
|
||||
@@ -25,12 +32,13 @@ public class SimpleTexture extends BaseTexture {
|
||||
public SimpleTexture(AssetLocation location, TextureMetadata metadata) {
|
||||
this.location = location;
|
||||
this.metadata = metadata;
|
||||
track();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load(IAssetProvider provider) {
|
||||
long address = 0L;
|
||||
int channel = GLTextureFormat.stbComponents(metadata.getExternalFormat());
|
||||
int channel = GLTextureFormat.stbComponents(GL11.GL_RGBA);
|
||||
try(IAsset asset = provider.getAsset(location)) {
|
||||
ByteBuffer buffer = asset.custom(NativeMemoryParser.INSTANCE);
|
||||
int[] width = new int[1];
|
||||
@@ -50,10 +58,9 @@ public class SimpleTexture extends BaseTexture {
|
||||
}
|
||||
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);
|
||||
metadata.applyArguments(textureType());
|
||||
GLFunctions.upload2DImage(textureType(), 0, metadata, width, height, 0, address);
|
||||
if(metadata.generateMipMappings()) GLFunctions.generateMipMaps(textureType());
|
||||
STBImage.nstbi_image_free(address);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,20 +1,63 @@
|
||||
package speiger.src.coreengine.rendering.utils;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
import org.lwjgl.opengl.GL45;
|
||||
import org.lwjgl.opengl.GL15;
|
||||
import org.lwjgl.opengl.GL30;
|
||||
|
||||
import speiger.src.coreengine.rendering.textures.base.TextureMetadata;
|
||||
import speiger.src.coreengine.rendering.utils.values.IGLValue;
|
||||
import speiger.src.coreengine.rendering.utils.values.IGLValue.IGLDataType;
|
||||
import speiger.src.coreengine.rendering.utils.values.IGLValue.ITextureFormatType;
|
||||
import speiger.src.coreengine.rendering.utils.values.IGLValue.ITextureParameter;
|
||||
|
||||
public class GLFunctions {
|
||||
|
||||
public static int createTexture(IGLValue value) {
|
||||
return GL45.glCreateTextures(value.glValue());
|
||||
public static int createTexture() {
|
||||
return GL11.glGenTextures();
|
||||
}
|
||||
|
||||
public static void deleteTextures(int... id) {
|
||||
GL11.glDeleteTextures(id);
|
||||
}
|
||||
|
||||
public static void textureParameter(IGLValue type, ITextureParameter parameter, IGLValue value) {
|
||||
textureParameter(type, parameter, value.glValue());
|
||||
}
|
||||
|
||||
public static void textureParameter(IGLValue type, ITextureParameter parameter, int value) {
|
||||
if(!parameter.isValid(value)) throw new IllegalArgumentException("Value ["+value+"] isn't supported for GL Function ["+parameter.glValue()+"], only int functions are supported with this");
|
||||
textureParameter(type.glValue(), parameter.glValue(), value);
|
||||
}
|
||||
|
||||
public static void textureParameter(int type, int parameter, int value) {
|
||||
GL15.glTexParameteri(type, parameter, value);
|
||||
}
|
||||
|
||||
public static void upload2DImage(IGLValue target, int mipmaps, TextureMetadata metadata, int width, int height, int border, long pixels) {
|
||||
upload2DImage(target.glValue(), mipmaps, metadata.getInternalFormat(), width, width, border, metadata.getExternalFormat(), metadata.getDataFormat(), pixels);
|
||||
}
|
||||
|
||||
public static void upload2DImage(IGLValue target, int mipmaps, ITextureFormatType internalFormat, int width, int height, int border, ITextureFormatType externalFormat, IGLDataType data, long pixels) {
|
||||
upload2DImage(target.glValue(), mipmaps, internalFormat.glValue(), width, height, border, externalFormat.glValue(), data.glValue(), pixels);
|
||||
}
|
||||
|
||||
public static void upload2DImage(int target, int mipmaps, int internalFormat, int width, int height, int border, int externalFormat, int dataFormat, long pixels) {
|
||||
GL11.glTexImage2D(target, mipmaps, internalFormat, width, height, border, externalFormat, dataFormat, pixels);
|
||||
}
|
||||
|
||||
public static void upload2DSubImage(IGLValue target, int level, int xoffset, int yoffset, int width, int height, ITextureFormatType format, IGLDataType type, long pixels) {
|
||||
upload2DSubImage(target.glValue(), level, xoffset, yoffset, width, height, format.glValue(), type.glValue(), pixels);
|
||||
}
|
||||
|
||||
public static void upload2DSubImage(int target, int level, int xOffset, int yOffset, int width, int height, int format, int type, long pixels) {
|
||||
GL15.nglTexSubImage2D(target, level, xOffset, yOffset, width, height, format, type, pixels);
|
||||
|
||||
}
|
||||
|
||||
public static void generateMipMaps(IGLValue type) {
|
||||
GL30.glGenerateMipmap(type.glValue());
|
||||
}
|
||||
|
||||
public static void pixelStoreI(int mode, int value) {
|
||||
GL11.glPixelStorei(mode, value);
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ public class TextureState implements IGLState {
|
||||
public TextureState bind(int unit, int texture) {
|
||||
if(textures[unit] != texture) {
|
||||
this.textures[unit] = texture;
|
||||
GL45.glBindTextureUnit(GL20.GL_TEXTURE0 + unit, texture);
|
||||
GL45.glBindTextureUnit(unit, texture);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
-2
@@ -6,7 +6,6 @@ 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;
|
||||
|
||||
@@ -31,7 +30,6 @@ public enum GLTextureType implements IGLValue {
|
||||
|
||||
@Override
|
||||
public int glValue() {
|
||||
GL46.glBindTexture(glValue, glValue);
|
||||
return glValue;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,8 +29,7 @@ public class IOUtils
|
||||
|
||||
public static Path getBaseLocation() {
|
||||
try {
|
||||
Path path = Paths.get(IOUtils.class.getProtectionDomain().getCodeSource().getLocation().toURI());
|
||||
if(!path.toString().endsWith(".jar")) return path;
|
||||
return Paths.get(IOUtils.class.getProtectionDomain().getCodeSource().getLocation().toURI());
|
||||
}
|
||||
catch(Exception e) { e.printStackTrace(); }
|
||||
return Paths.get(".");
|
||||
|
||||
Reference in New Issue
Block a user