More Reworks
This commit is contained in:
		
							parent
							
								
									84e84d6b26
								
							
						
					
					
						commit
						7cedfaf9bd
					
				| @ -83,7 +83,7 @@ public class ApplicationExecutor | |||||||
| 		boolean end = timer.update(); | 		boolean end = timer.update(); | ||||||
| 		stamp.stop(); | 		stamp.stop(); | ||||||
| 		AllocationTracker.INSTANCE.update(); | 		AllocationTracker.INSTANCE.update(); | ||||||
| 		GLStateTracker.onFrameEnded(); | 		GLStateTracker.instance().onFrameEnded(); | ||||||
| 		gpu().next("Window").start("V-Sync"); | 		gpu().next("Window").start("V-Sync"); | ||||||
| 		window.finishFrame(); | 		window.finishFrame(); | ||||||
| 		if(window.isCPULimited()) sync.sync(fps.getTargetTicks()); | 		if(window.isCPULimited()) sync.sync(fps.getTargetTicks()); | ||||||
| @ -126,6 +126,7 @@ public class ApplicationExecutor | |||||||
| 		builder.append(fps.getTicks()).append(":").append(ups.getTicks()); | 		builder.append(fps.getTicks()).append(":").append(ups.getTicks()); | ||||||
| 		owner.addExtraTickRates(T -> builder.append(":").append(T)); | 		owner.addExtraTickRates(T -> builder.append(":").append(T)); | ||||||
| 		builder.append(",").append(getMemoryUsage()); | 		builder.append(",").append(getMemoryUsage()); | ||||||
|  | 		builder.append(",").append("OffHeap: "+(AllocationTracker.INSTANCE.getOffHeapMemory() >> 20)+"MB"); | ||||||
| 		builder.append(",").append("CPU-A: "+IOUtils.convertBytes(AllocationTracker.INSTANCE.getCPUAllocatedBytes())); | 		builder.append(",").append("CPU-A: "+IOUtils.convertBytes(AllocationTracker.INSTANCE.getCPUAllocatedBytes())); | ||||||
| 		builder.append(",").append("GPU-A: "+IOUtils.convertBytes(AllocationTracker.INSTANCE.getGPUAllocatedBytes())); | 		builder.append(",").append("GPU-A: "+IOUtils.convertBytes(AllocationTracker.INSTANCE.getGPUAllocatedBytes())); | ||||||
| 		builder.append(",").append(TextUtil.convertTime(timer.getUsage(), "Client:", FORMATTER)); | 		builder.append(",").append(TextUtil.convertTime(timer.getUsage(), "Client:", FORMATTER)); | ||||||
|  | |||||||
| @ -1071,7 +1071,7 @@ public abstract class GuiComponent extends FlagHolder | |||||||
| 		int bottom = y + height; | 		int bottom = y + height; | ||||||
| 		Window window = owner.getWindow(); | 		Window window = owner.getWindow(); | ||||||
| 		Vec2d vec = owner.getUIManager().res.getScaleVec(); | 		Vec2d vec = owner.getUIManager().res.getScaleVec(); | ||||||
| 		GLStateTracker.TESTER.enableScissors((int)(x * vec.x()), (int)(window.getHeight() - bottom * vec.y()), (int)(width * vec.x()), (int)(height * vec.y())); | 		GLStateTracker.instance().scissors.enableScissors((int)(x * vec.x()), (int)(window.getHeight() - bottom * vec.y()), (int)(width * vec.x()), (int)(height * vec.y())); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	protected final boolean isInScissors(Plane box) | 	protected final boolean isInScissors(Plane box) | ||||||
| @ -1094,13 +1094,13 @@ public abstract class GuiComponent extends FlagHolder | |||||||
| 		int bottom = y + height; | 		int bottom = y + height; | ||||||
| 		Window window = owner.getWindow(); | 		Window window = owner.getWindow(); | ||||||
| 		Vec2d vec = owner.getUIManager().res.getScaleVec(); | 		Vec2d vec = owner.getUIManager().res.getScaleVec(); | ||||||
| 		return GLStateTracker.TESTER.isInScissors((int)(x * vec.x()), (int)(window.getHeight() - bottom * vec.y()), (int)(width * vec.x()), (int)(height * vec.y())); | 		return GLStateTracker.instance().scissors.isInScissors((int)(x * vec.x()), (int)(window.getHeight() - bottom * vec.y()), (int)(width * vec.x()), (int)(height * vec.y())); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	public final void disableScissors() | 	public final void disableScissors() | ||||||
| 	{ | 	{ | ||||||
| 		getRenderer().flush(); | 		getRenderer().flush(); | ||||||
| 		GLStateTracker.TESTER.disableScissors(); | 		GLStateTracker.instance().scissors.disableScissors(); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	class KeyBindAction implements IKeyComponent | 	class KeyBindAction implements IKeyComponent | ||||||
|  | |||||||
| @ -158,19 +158,21 @@ public abstract class GuiManager implements IWindowListener | |||||||
| 	protected Vec2i start() | 	protected Vec2i start() | ||||||
| 	{ | 	{ | ||||||
| 		GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); | 		GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); | ||||||
| 		GLStateTracker.DEBTH_TEST.disable(); | 		GLStateTracker instance = GLStateTracker.instance(); | ||||||
| 		GLStateTracker.CULL_FACE.disable(); | 		instance.debth_test.disable(); | ||||||
| 		GLStateTracker.BLEND.setFunction(GLBlendFactor.SRC_ALPHA, GLBlendFactor.ONE_MINUS_SRC_ALPHA).enable(); | 		instance.cull_face.disable(); | ||||||
|  | 		instance.blend.setFunction(GLBlendFactor.SRC_ALPHA, GLBlendFactor.ONE_MINUS_SRC_ALPHA).enable(); | ||||||
| 		renderer.beginFrame(); | 		renderer.beginFrame(); | ||||||
| 		return res.getScaledMouse(); | 		return res.getScaledMouse(); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	protected void stop() | 	protected void stop() | ||||||
| 	{ | 	{ | ||||||
| 		GLStateTracker.DEBTH_TEST.enable(); | 		GLStateTracker instance = GLStateTracker.instance(); | ||||||
|  | 		instance.debth_test.enable(); | ||||||
| 		renderer.endFrame(); | 		renderer.endFrame(); | ||||||
| 		GLStateTracker.BLEND.disable(); | 		instance.blend.disable(); | ||||||
| 		GLStateTracker.CULL_FACE.disable(); | 		instance.cull_face.disable(); | ||||||
| 		ShaderTracker.INSTANCE.stopShader(); | 		ShaderTracker.INSTANCE.stopShader(); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
|  | |||||||
| @ -79,9 +79,9 @@ public class PieComponent extends GuiComponent | |||||||
| 		float centerX = getBox().getCenterX(); | 		float centerX = getBox().getCenterX(); | ||||||
| 		float centerY = getBox().getCenterY(); | 		float centerY = getBox().getCenterY(); | ||||||
| 		getRenderer().setBrightness(getActiveBrightness()).translate(centerX, centerY).flush(); | 		getRenderer().setBrightness(getActiveBrightness()).translate(centerX, centerY).flush(); | ||||||
| 		GLStateTracker.DEBTH_TEST.enable(); | 		GLStateTracker.instance().debth_test.enable(); | ||||||
| 		getRenderer().drawBuffers(buffer, 0F, 0F).flush(); | 		getRenderer().drawBuffers(buffer, 0F, 0F).flush(); | ||||||
| 		GLStateTracker.DEBTH_TEST.disable(); | 		GLStateTracker.instance().debth_test.disable(); | ||||||
| 		getRenderer().translate(-centerX, -centerY).setBrightness(1F); | 		getRenderer().translate(-centerX, -centerY).setBrightness(1F); | ||||||
| 		return true; | 		return true; | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -121,12 +121,12 @@ public class Window | |||||||
| 		for(int i = 0,m=callbacks.size();i<m;i++) { | 		for(int i = 0,m=callbacks.size();i<m;i++) { | ||||||
| 			callbacks.get(i).reload(windowId); | 			callbacks.get(i).reload(windowId); | ||||||
| 		} | 		} | ||||||
| 		GLStateTracker.reapplyState(); | 		GLStateTracker.instance().reapplyState(); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	protected void updateViewPort() { | 	protected void updateViewPort() { | ||||||
| 		flags.clearFlag(FLAG_WINDOW_CHANGE); | 		flags.clearFlag(FLAG_WINDOW_CHANGE); | ||||||
| 		GLStateTracker.VIEW_PORT.setDefault(0, 0, width, height); | 		GLStateTracker.instance().viewPort.setDefault(0, 0, width, height); | ||||||
| 		createProjectionMatrix(); | 		createProjectionMatrix(); | ||||||
| 		ui_frame.updateScale(); | 		ui_frame.updateScale(); | ||||||
| 		for(int i = 0,m=listeners.size();i<m;i++) { | 		for(int i = 0,m=listeners.size();i<m;i++) { | ||||||
|  | |||||||
| @ -24,7 +24,7 @@ public class IndirectArrayBuffer extends VertexBuffer implements Iterable<DrawAr | |||||||
| 		for(int i = 0;i<size;i++) { | 		for(int i = 0;i<size;i++) { | ||||||
| 			commands.add(new DrawArraysIndirectCommand()); | 			commands.add(new DrawArraysIndirectCommand()); | ||||||
| 		} | 		} | ||||||
| 		bind().allocate(size * 16).unbind(); | 		allocate(size * 16); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	public int commands() { | 	public int commands() { | ||||||
|  | |||||||
| @ -8,7 +8,7 @@ import java.nio.ShortBuffer; | |||||||
| import java.util.List; | import java.util.List; | ||||||
| 
 | 
 | ||||||
| import org.lwjgl.opengl.GL15; | import org.lwjgl.opengl.GL15; | ||||||
| import org.lwjgl.opengl.GL32; | import org.lwjgl.opengl.GL45; | ||||||
| import org.lwjgl.system.MemoryUtil; | import org.lwjgl.system.MemoryUtil; | ||||||
| 
 | 
 | ||||||
| import speiger.src.collections.ints.misc.pairs.IntObjectPair; | import speiger.src.collections.ints.misc.pairs.IntObjectPair; | ||||||
| @ -24,7 +24,7 @@ public class VertexBuffer { | |||||||
| 	protected int size; | 	protected int size; | ||||||
| 	 | 	 | ||||||
| 	public VertexBuffer(IGLBuffer type) { | 	public VertexBuffer(IGLBuffer type) { | ||||||
| 		this(type, GL15.glGenBuffers()); | 		this(type, GL45.glCreateBuffers()); | ||||||
| 		AllocationTracker.INSTANCE.track(this); | 		AllocationTracker.INSTANCE.track(this); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| @ -66,26 +66,26 @@ public class VertexBuffer { | |||||||
| 	 | 	 | ||||||
| 	public VertexBuffer allocate(int totalBytes) { | 	public VertexBuffer allocate(int totalBytes) { | ||||||
| 		this.size = totalBytes; | 		this.size = totalBytes; | ||||||
| 		GL15.glBufferData(type.glValue(), totalBytes, state.glValue()); | 		GL45.glNamedBufferData(id, 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.glValue(), totalBytes, pointer, state.glValue()); | 		GL45.nglNamedBufferData(id, 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.glValue(), offset, totalBytes, pointer); | 		GL45.nglNamedBufferSubData(id, 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.glValue(), offset, totalBytes, pointer); | 		GL45.nglGetNamedBufferSubData(id, 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.glValue(), GL15.GL_WRITE_ONLY).position(offset).put(data); | 		GL45.glMapNamedBuffer(id, GL15.GL_WRITE_ONLY).position(offset).put(data); | ||||||
| 		GL15.glUnmapBuffer(type.glValue()); | 		GL45.glUnmapNamedBuffer(id); | ||||||
| 		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.glValue(), GL15.GL_WRITE_ONLY).position(offset).asShortBuffer().put(data); | 		GL45.glMapNamedBuffer(id, GL15.GL_WRITE_ONLY).position(offset).asShortBuffer().put(data); | ||||||
| 		GL15.glUnmapBuffer(type.glValue()); | 		GL45.glUnmapNamedBuffer(id); | ||||||
| 		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.glValue(), GL15.GL_WRITE_ONLY).position(offset).asIntBuffer().put(data); | 		GL45.glMapNamedBuffer(id, GL15.GL_WRITE_ONLY).position(offset).asIntBuffer().put(data); | ||||||
| 		GL15.glUnmapBuffer(type.glValue()); | 		GL45.glUnmapNamedBuffer(id); | ||||||
| 		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.glValue(), GL15.GL_WRITE_ONLY).position(offset).asFloatBuffer().put(data); | 		GL45.glMapNamedBuffer(id, GL15.GL_WRITE_ONLY).position(offset).asFloatBuffer().put(data); | ||||||
| 		GL15.glUnmapBuffer(type.glValue()); | 		GL45.glUnmapNamedBuffer(id); | ||||||
| 		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.glValue(), GL15.GL_WRITE_ONLY); | 			ByteBuffer buffer = GL45.glMapNamedBuffer(id, 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.glValue())) GameLog.info("Memory Corruption?"); | 			if(!GL45.glUnmapNamedBuffer(id)) 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.glValue(), GL15.GL_READ_ONLY); | 		ByteBuffer buffer = GL45.glMapNamedBuffer(id, 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.glValue()); | 		GL45.glUnmapNamedBuffer(id); | ||||||
| 		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.glValue(), GL15.GL_READ_WRITE); | 		ByteBuffer buffer = GL45.glMapNamedBuffer(id, 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.glValue()); | 		GL45.glUnmapNamedBuffer(id); | ||||||
| 		AllocationTracker.INSTANCE.addGPUBytes(size); | 		AllocationTracker.INSTANCE.addGPUBytes(size); | ||||||
| 		set(MemoryUtil.memAddress(newBuff), newSize); | 		set(MemoryUtil.memAddress(newBuff), newSize); | ||||||
| 		MemoryUtil.memFree(newBuff); | 		MemoryUtil.memFree(newBuff); | ||||||
| @ -218,7 +218,7 @@ public class VertexBuffer { | |||||||
| 	public VertexBuffer shift(int source, int dest, int length) { | 	public VertexBuffer shift(int source, int dest, int length) { | ||||||
| 		if(source < 0 || source + length >= size) throw new ArrayIndexOutOfBoundsException(); | 		if(source < 0 || source + length >= size) throw new ArrayIndexOutOfBoundsException(); | ||||||
| 		if(dest < 0 || dest + length >= size) throw new ArrayIndexOutOfBoundsException(); | 		if(dest < 0 || dest + length >= size) throw new ArrayIndexOutOfBoundsException(); | ||||||
| 		GL32.glCopyBufferSubData(id, id, source, dest, length); | 		GL45.glCopyNamedBufferSubData(id, id, source, dest, length); | ||||||
| 		AllocationTracker.INSTANCE.addGPUBytes(length*2); | 		AllocationTracker.INSTANCE.addGPUBytes(length*2); | ||||||
| 		return this; | 		return this; | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -164,7 +164,7 @@ public class FrameBuffer | |||||||
| 	public FrameBuffer bind() | 	public FrameBuffer bind() | ||||||
| 	{ | 	{ | ||||||
| 		GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, id); | 		GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, id); | ||||||
| 		GLStateTracker.VIEW_PORT.push(0, 0, width, height); | 		GLStateTracker.instance().viewPort.push(0, 0, width, height); | ||||||
| 		return this; | 		return this; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| @ -183,7 +183,7 @@ public class FrameBuffer | |||||||
| 	public FrameBuffer unbind() | 	public FrameBuffer unbind() | ||||||
| 	{ | 	{ | ||||||
| 		GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); | 		GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); | ||||||
| 		GLStateTracker.VIEW_PORT.pop(); | 		GLStateTracker.instance().viewPort.pop(); | ||||||
| 		return this; | 		return this; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ public class Shader<T extends ShaderProgram> implements Supplier<T> { | |||||||
| 	 | 	 | ||||||
| 	public static <T extends ShaderProgram> Shader<T> createAndRegister(Function<IAssetProvider, T> provider) { | 	public static <T extends ShaderProgram> Shader<T> createAndRegister(Function<IAssetProvider, T> provider) { | ||||||
| 		Shader<T> shader = new Shader<>(provider); | 		Shader<T> shader = new Shader<>(provider); | ||||||
| 		GLStateTracker.SHADERS.register(shader); | 		GLStateTracker.instance().shaders.register(shader); | ||||||
| 		return shader; | 		return shader; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| @ -42,7 +42,7 @@ public class Shader<T extends ShaderProgram> implements Supplier<T> { | |||||||
| 	 | 	 | ||||||
| 	public void removeProgram() { | 	public void removeProgram() { | ||||||
| 		remove(); | 		remove(); | ||||||
| 		GLStateTracker.SHADERS.remove(this); | 		GLStateTracker.instance().shaders.remove(this); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	@Override | 	@Override | ||||||
|  | |||||||
| @ -26,12 +26,12 @@ public abstract class ShaderProgram { | |||||||
| 	private int id; | 	private int id; | ||||||
| 	 | 	 | ||||||
| 	public boolean isValid() { return id != 0; } | 	public boolean isValid() { return id != 0; } | ||||||
| 	public boolean isActive() { return GLStateTracker.SHADERS.isShaderActive(this); } | 	public boolean isActive() { return GLStateTracker.instance().shaders.isShaderActive(this); } | ||||||
| 	public int id() { return id; } | 	public int id() { return id; } | ||||||
| 	public UniformManager getUniforms() { return uniforms; } | 	public UniformManager getUniforms() { return uniforms; } | ||||||
| 	 | 	 | ||||||
| 	public void bind() { | 	public void bind() { | ||||||
| 		GLStateTracker.SHADERS.bind(this); | 		GLStateTracker.instance().shaders.bind(this); | ||||||
| 		uniforms.bind(); | 		uniforms.bind(); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
|  | |||||||
| @ -46,7 +46,7 @@ public abstract class Uniform implements IUniform { | |||||||
| 	protected void update() { | 	protected void update() { | ||||||
| 		positions.forEach(this::processChanges); | 		positions.forEach(this::processChanges); | ||||||
| 		if(this instanceof IAutoUniform auto) { | 		if(this instanceof IAutoUniform auto) { | ||||||
| 			int id = GLStateTracker.SHADERS.getActiveShader(); | 			int id = GLStateTracker.instance().shaders.getActiveShader(); | ||||||
| 			if(contains(id)) auto.bind(id); | 			if(contains(id)) auto.bind(id); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -29,11 +29,11 @@ public class UniformManager { | |||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	public <T extends IUniform> T addGlobalUniform(String name) { | 	public <T extends IUniform> T addGlobalUniform(String name) { | ||||||
| 		return addUniform(GLStateTracker.UNIFORMS.get(name)); | 		return addUniform(GLStateTracker.instance().uniforms.get(name)); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	public <T extends IUniform> T addGlobalUniform(String name, T defaultValue) { | 	public <T extends IUniform> T addGlobalUniform(String name, T defaultValue) { | ||||||
| 		return addUniform(GLStateTracker.UNIFORMS.getOrDefault(name, defaultValue)); | 		return addUniform(GLStateTracker.instance().uniforms.getOrDefault(name, defaultValue)); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	public BoolUniform addBool(String name, boolean defaultValue) {  | 	public BoolUniform addBool(String name, boolean defaultValue) {  | ||||||
|  | |||||||
| @ -32,6 +32,6 @@ public class TextureUniform extends Uniform implements IAutoUniform { | |||||||
| 	 | 	 | ||||||
| 	@Override | 	@Override | ||||||
| 	public void bind(int programId) { | 	public void bind(int programId) { | ||||||
| 		GLStateTracker.TEXTURES.bind(unit, value); | 		GLStateTracker.instance().textures.bind(unit, value); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | |||||||
| @ -2,7 +2,6 @@ package speiger.src.coreengine.rendering.shaderOld.uniforms; | |||||||
| 
 | 
 | ||||||
| import org.lwjgl.opengl.GL30; | import org.lwjgl.opengl.GL30; | ||||||
| import org.lwjgl.opengl.GL31; | import org.lwjgl.opengl.GL31; | ||||||
| import org.lwjgl.opengl.GL46; |  | ||||||
| 
 | 
 | ||||||
| import speiger.src.coreengine.rendering.models.buffers.UniformBuffer; | import speiger.src.coreengine.rendering.models.buffers.UniformBuffer; | ||||||
| import speiger.src.coreengine.rendering.shaderOld.ShaderProgram; | import speiger.src.coreengine.rendering.shaderOld.ShaderProgram; | ||||||
|  | |||||||
| @ -8,14 +8,10 @@ public class DrawArraysIndirectCommand implements IndirectCommand { | |||||||
|     int first; |     int first; | ||||||
|     int baseInstance; |     int baseInstance; | ||||||
|      |      | ||||||
|     public DrawArraysIndirectCommand() { |     public DrawArraysIndirectCommand() {} | ||||||
| 	} |  | ||||||
|      |      | ||||||
| 	public DrawArraysIndirectCommand(int count, int primCount, int first, int baseInstance) { | 	public DrawArraysIndirectCommand(int count, int primCount, int first, int baseInstance) { | ||||||
| 		this.count = count; | 		set(count, primCount, first, baseInstance); | ||||||
| 		this.primCount = primCount; |  | ||||||
| 		this.first = first; |  | ||||||
| 		this.baseInstance = baseInstance; |  | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	@Override | 	@Override | ||||||
| @ -38,6 +34,14 @@ public class DrawArraysIndirectCommand implements IndirectCommand { | |||||||
| 	public int getFirst() { return first; } | 	public int getFirst() { return first; } | ||||||
| 	public int getBaseInstance() { return baseInstance; } | 	public int getBaseInstance() { return baseInstance; } | ||||||
| 	 | 	 | ||||||
|  | 	public DrawArraysIndirectCommand set(int count, int primCount, int first, int baseInstance) { | ||||||
|  | 		this.count = count; | ||||||
|  | 		this.primCount = primCount; | ||||||
|  | 		this.first = first; | ||||||
|  | 		this.baseInstance = baseInstance; | ||||||
|  | 		return this; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
| 	public DrawArraysIndirectCommand setCount(int count) { | 	public DrawArraysIndirectCommand setCount(int count) { | ||||||
| 		this.count = count;  | 		this.count = count;  | ||||||
| 		return this; | 		return this; | ||||||
|  | |||||||
| @ -13,11 +13,7 @@ public class DrawElementsIndirectCommand implements IndirectCommand { | |||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	public DrawElementsIndirectCommand(int count, int primCount, int firstIndex, int baseVertex, int baseInstance) { | 	public DrawElementsIndirectCommand(int count, int primCount, int firstIndex, int baseVertex, int baseInstance) { | ||||||
| 		this.count = count; | 		set(count, primCount, firstIndex, baseVertex, baseInstance); | ||||||
| 		this.primCount = primCount; |  | ||||||
| 		this.firstIndex = firstIndex; |  | ||||||
| 		this.baseVertex = baseVertex; |  | ||||||
| 		this.baseInstance = baseInstance; |  | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	@Override | 	@Override | ||||||
| @ -42,6 +38,15 @@ public class DrawElementsIndirectCommand implements IndirectCommand { | |||||||
| 	public int getBaseVertex() { return baseVertex; } | 	public int getBaseVertex() { return baseVertex; } | ||||||
| 	public int getBaseInstance() { return baseInstance; } | 	public int getBaseInstance() { return baseInstance; } | ||||||
| 	 | 	 | ||||||
|  | 	public DrawElementsIndirectCommand set(int count, int primCount, int firstIndex, int baseVertex, int baseInstance) { | ||||||
|  | 		this.count = count; | ||||||
|  | 		this.primCount = primCount; | ||||||
|  | 		this.firstIndex = firstIndex; | ||||||
|  | 		this.baseVertex = baseVertex; | ||||||
|  | 		this.baseInstance = baseInstance; | ||||||
|  | 		return this; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
| 	public DrawElementsIndirectCommand setCount(int count) { | 	public DrawElementsIndirectCommand setCount(int count) { | ||||||
| 		this.count = count; | 		this.count = count; | ||||||
| 		return this; | 		return this; | ||||||
|  | |||||||
| @ -1,8 +1,6 @@ | |||||||
| package speiger.src.coreengine.rendering.textures.base; | package speiger.src.coreengine.rendering.textures.base; | ||||||
| 
 | 
 | ||||||
| import org.lwjgl.opengl.GL11; | import speiger.src.coreengine.rendering.utils.GLFunctions; | ||||||
| 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.IGLValue; | import speiger.src.coreengine.rendering.utils.values.IGLValue; | ||||||
| import speiger.src.coreengine.rendering.utils.values.textures.GLTextureType; | import speiger.src.coreengine.rendering.utils.values.textures.GLTextureType; | ||||||
| @ -20,7 +18,7 @@ public abstract class BaseTexture implements ITexture { | |||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	protected void createTexture() { | 	protected void createTexture() { | ||||||
| 		this.id = GL46.glCreateTextures(textureType().glValue()); | 		this.id = GLFunctions.createTexture(textureType()); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	protected IGLValue textureType() { | 	protected IGLValue textureType() { | ||||||
| @ -29,12 +27,12 @@ public abstract class BaseTexture implements ITexture { | |||||||
| 	 | 	 | ||||||
| 	protected void removeTexture() { | 	protected void removeTexture() { | ||||||
| 		if(id == 0) return; | 		if(id == 0) return; | ||||||
| 		GL11.glDeleteTextures(id); | 		GLFunctions.deleteTextures(id); | ||||||
| 		id = 0; | 		id = 0; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	protected void track() { | 	protected void track() { | ||||||
| 		GLStateTracker.TEXTURE_TRACKER.registerTexture(this); | 		GLStateTracker.instance().texture_tracker.registerTexture(this); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	@Override | 	@Override | ||||||
| @ -44,14 +42,14 @@ public abstract class BaseTexture implements ITexture { | |||||||
| 	 | 	 | ||||||
| 	@Override | 	@Override | ||||||
| 	public void bind(int unit) { | 	public void bind(int unit) { | ||||||
| 		GLStateTracker.TEXTURES.bind(unit, id); | 		GLStateTracker.instance().textures.bind(unit, id); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	@Override | 	@Override | ||||||
| 	public void delete(boolean untrack) { | 	public void delete(boolean untrack) { | ||||||
| 		removeTexture(); | 		removeTexture(); | ||||||
| 		if(untrack) { | 		if(untrack) { | ||||||
| 			GLStateTracker.TEXTURE_TRACKER.deleteTexture(this); | 			GLStateTracker.instance().texture_tracker.deleteTexture(this); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | |||||||
| @ -10,6 +10,7 @@ import speiger.src.coreengine.assets.base.IAssetProvider; | |||||||
| import speiger.src.coreengine.math.BitUtil; | import speiger.src.coreengine.math.BitUtil; | ||||||
| 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.GLStateTracker; | ||||||
| import speiger.src.coreengine.rendering.utils.values.GLDataType; | 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.GLTextureFormat; | ||||||
| 
 | 
 | ||||||
| @ -24,6 +25,7 @@ public class DynamicTexture extends BaseTexture implements IDynamicTexture { | |||||||
| 		this.metadata = metadata; | 		this.metadata = metadata; | ||||||
| 		this.width = width; | 		this.width = width; | ||||||
| 		this.height = height; | 		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); | 		data = MemoryUtil.nmemAllocChecked(4L * width * height); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| @ -60,28 +62,56 @@ public class DynamicTexture extends BaseTexture implements IDynamicTexture { | |||||||
| 			dirtySections.clear(); | 			dirtySections.clear(); | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
|  | 		GLStateTracker.instance().unpack_row_length.set(width()); | ||||||
| 		Thread thread = Thread.currentThread(); | 		Thread thread = Thread.currentThread(); | ||||||
| 		long tempBuffer = MemoryUtil.nmemAllocChecked(1024); |  | ||||||
| 		for(IntIterator iter = dirtySections.iterator();iter.hasNext() && !thread.isInterrupted();iter.remove()) { | 		for(IntIterator iter = dirtySections.iterator();iter.hasNext() && !thread.isInterrupted();iter.remove()) { | ||||||
| 			int key = iter.nextInt(); | 			int key = iter.nextInt(); | ||||||
| 			int x = BitUtil.toFirstShort(key) * 16; | 			uploadPixels(BitUtil.toFirstShort(key) * 16, BitUtil.toSecondShort(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); | 		GLStateTracker.instance().unpack_row_length.setDefault(); | ||||||
|  | 		GLStateTracker.instance().unpack_skip_pixel.setDefault(); | ||||||
|  | 		GLStateTracker.instance().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 long offset(int x, int y) { | 	protected long offset(int x, int y) { | ||||||
| 		return ((y * width()) + x) * 4L; | 		return ((y * width()) + x) << 2; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	protected void ensureValid(int index) { | ||||||
|  | 		ensureValid(index % width, index / width); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	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+"]"); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	@Override | ||||||
|  | 	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); | ||||||
|  | 		} | ||||||
|  | 		if(id() == 0) return; | ||||||
|  | 		for(int i = x>>4,m=width>>4;i<m;i++) { | ||||||
|  | 			for(int j = y>>4,n=height>>4;j<n;j++) { | ||||||
|  | 				dirtySections.add(BitUtil.toInt(i, j)); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	@Override | 	@Override | ||||||
| 	public void dirty(int x, int y) { | 	public void dirty(int x, int y) { | ||||||
| 		if(id() == 0) return; | 		if(id() == 0) return; | ||||||
| 		dirtySections.add(BitUtil.toInt(x >> 4, y >> 4)); | 		dirtySections.add(BitUtil.toInt(x >> 4, y >> 4)); | ||||||
|  | 		ensureValid(x, y); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	@Override | 	@Override | ||||||
| @ -116,26 +146,31 @@ public class DynamicTexture extends BaseTexture implements IDynamicTexture { | |||||||
| 	 | 	 | ||||||
| 	@Override | 	@Override | ||||||
| 	public int get(int index) { | 	public int get(int index) { | ||||||
|  | 		ensureValid(index); | ||||||
| 		return Integer.rotateRight(MemoryUtil.memGetInt(index * 4L), 8); | 		return Integer.rotateRight(MemoryUtil.memGetInt(index * 4L), 8); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	@Override | 	@Override | ||||||
| 	public int getR(int index) { | 	public int getR(int index) { | ||||||
|  | 		ensureValid(index); | ||||||
| 		return MemoryUtil.memGetByte(index * 4L); | 		return MemoryUtil.memGetByte(index * 4L); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	@Override | 	@Override | ||||||
| 	public int getG(int index) { | 	public int getG(int index) { | ||||||
|  | 		ensureValid(index); | ||||||
| 		return MemoryUtil.memGetByte(index * 4L + 1L); | 		return MemoryUtil.memGetByte(index * 4L + 1L); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	@Override | 	@Override | ||||||
| 	public int getB(int index) { | 	public int getB(int index) { | ||||||
|  | 		ensureValid(index); | ||||||
| 		return MemoryUtil.memGetByte(index * 4L + 2L); | 		return MemoryUtil.memGetByte(index * 4L + 2L); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	@Override | 	@Override | ||||||
| 	public int getA(int index) { | 	public int getA(int index) { | ||||||
|  | 		ensureValid(index); | ||||||
| 		return MemoryUtil.memGetByte(index * 4L + 3L); | 		return MemoryUtil.memGetByte(index * 4L + 3L); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @ -27,6 +27,9 @@ public interface IDynamicTexture extends ITexture { | |||||||
| 	public void setA(int index, int alpha); | 	public void setA(int index, int alpha); | ||||||
| 	public default void setA(int x, int y, int alpha) { setA((y * width()) + x, alpha); } | 	public default void setA(int x, int y, int alpha) { setA((y * width()) + x, alpha); } | ||||||
| 	 | 	 | ||||||
|  | 	public void fill(int x, int y, int width, int height, int data); | ||||||
|  | 	public default void fill(int x, int y, int width, int height, int red, int green, int blue, int alpha) { fill(x, y, width, height, ((alpha & 0xFF) << 24) | ((red & 0xFF) << 16) | ((green & 0xFF) << 8) | (blue & 0xFF)); } | ||||||
|  | 	 | ||||||
| 	public int get(int index); | 	public int get(int index); | ||||||
| 	public default int get(int x, int y) { return get((y * width()) + x); } | 	public default int get(int x, int y) { return get((y * width()) + x); } | ||||||
| 	 | 	 | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ import speiger.src.coreengine.utils.io.GameLog.LogLevel; | |||||||
| public class TextureManager implements IReloadableResource | public class TextureManager implements IReloadableResource | ||||||
| { | { | ||||||
| 	public static final TextureManager INSTANCE = new TextureManager(); | 	public static final TextureManager INSTANCE = new TextureManager(); | ||||||
| 	public static final GLState TEXTURE = GLStateTracker.addState(new GLState(GL11.GL_TEXTURE_2D, false)); | 	public static final GLState TEXTURE = GLStateTracker.instance().addState(new GLState(GL11.GL_TEXTURE_2D, false)); | ||||||
| 	AssetManager manager; | 	AssetManager manager; | ||||||
| 	ResourceReloader reloader = new ResourceReloader(); | 	ResourceReloader reloader = new ResourceReloader(); | ||||||
| 	int[] textureBanks = new int[GL13.GL_TEXTURE31 - GL13.GL_TEXTURE0]; | 	int[] textureBanks = new int[GL13.GL_TEXTURE31 - GL13.GL_TEXTURE0]; | ||||||
|  | |||||||
| @ -1,5 +1,8 @@ | |||||||
| package speiger.src.coreengine.rendering.utils; | package speiger.src.coreengine.rendering.utils; | ||||||
| 
 | 
 | ||||||
|  | import java.lang.management.ManagementFactory; | ||||||
|  | import java.lang.management.MemoryMXBean; | ||||||
|  | 
 | ||||||
| import speiger.src.collections.ints.maps.interfaces.Int2ObjectMap; | import speiger.src.collections.ints.maps.interfaces.Int2ObjectMap; | ||||||
| import speiger.src.coreengine.rendering.models.buffers.VertexBuffer; | import speiger.src.coreengine.rendering.models.buffers.VertexBuffer; | ||||||
| import speiger.src.coreengine.utils.counters.averager.Averager; | import speiger.src.coreengine.utils.counters.averager.Averager; | ||||||
| @ -13,6 +16,7 @@ public class AllocationTracker { | |||||||
| 	Averager cpuAllocation = new Averager(20); | 	Averager cpuAllocation = new Averager(20); | ||||||
| 	Averager gpuAllocation = new Averager(20); | 	Averager gpuAllocation = new Averager(20); | ||||||
| 	Int2ObjectMap<VertexBuffer> allocatedBuffers = Int2ObjectMap.builder().linkedMap(); | 	Int2ObjectMap<VertexBuffer> allocatedBuffers = Int2ObjectMap.builder().linkedMap(); | ||||||
|  | 	MemoryMXBean offHeap = ManagementFactory.getMemoryMXBean(); | ||||||
| 	 | 	 | ||||||
| 	public void update() { | 	public void update() { | ||||||
| 		long newTime = System.currentTimeMillis(); | 		long newTime = System.currentTimeMillis(); | ||||||
| @ -46,6 +50,10 @@ public class AllocationTracker { | |||||||
| 		lastMemory = memory; | 		lastMemory = memory; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
|  | 	public long getOffHeapMemory() { | ||||||
|  | 		return offHeap.getNonHeapMemoryUsage().getUsed(); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
| 	private long getMemory() { | 	private long getMemory() { | ||||||
| 		Runtime runtime = Runtime.getRuntime(); | 		Runtime runtime = Runtime.getRuntime(); | ||||||
| 		return runtime.totalMemory() - runtime.freeMemory(); | 		return runtime.totalMemory() - runtime.freeMemory(); | ||||||
|  | |||||||
| @ -0,0 +1,21 @@ | |||||||
|  | package speiger.src.coreengine.rendering.utils; | ||||||
|  | 
 | ||||||
|  | import org.lwjgl.opengl.GL11; | ||||||
|  | import org.lwjgl.opengl.GL45; | ||||||
|  | 
 | ||||||
|  | import speiger.src.coreengine.rendering.utils.values.IGLValue; | ||||||
|  | 
 | ||||||
|  | public class GLFunctions { | ||||||
|  | 	 | ||||||
|  | 	public static int createTexture(IGLValue value) { | ||||||
|  | 		return GL45.glCreateTextures(value.glValue()); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	public static void deleteTextures(int... id) { | ||||||
|  | 		GL11.glDeleteTextures(id); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	public static void pixelStoreI(int mode, int value) { | ||||||
|  | 		GL11.glPixelStorei(mode, value); | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -19,50 +19,62 @@ import speiger.src.coreengine.rendering.utils.states.GLProvoking; | |||||||
| import speiger.src.coreengine.rendering.utils.states.GLState; | import speiger.src.coreengine.rendering.utils.states.GLState; | ||||||
| import speiger.src.coreengine.rendering.utils.states.GLWireFrame; | import speiger.src.coreengine.rendering.utils.states.GLWireFrame; | ||||||
| import speiger.src.coreengine.rendering.utils.states.IGLState; | import speiger.src.coreengine.rendering.utils.states.IGLState; | ||||||
|  | import speiger.src.coreengine.rendering.utils.states.PixelState; | ||||||
| import speiger.src.coreengine.rendering.utils.states.TextureState; | import speiger.src.coreengine.rendering.utils.states.TextureState; | ||||||
| import speiger.src.coreengine.rendering.utils.values.GLCullType; | import speiger.src.coreengine.rendering.utils.values.GLCullType; | ||||||
| import speiger.src.coreengine.utils.counters.averager.Counter; | import speiger.src.coreengine.utils.counters.averager.Counter; | ||||||
| 
 | 
 | ||||||
| public class GLStateTracker { | public class GLStateTracker { | ||||||
| 	static final ObjectList<IGLState> ALL_STATES = new ObjectArrayList<>(); | 	private static final ThreadLocal<GLStateTracker> TRACKER = ThreadLocal.withInitial(GLStateTracker::new); | ||||||
|  | 	final ObjectList<IGLState> all_states = new ObjectArrayList<>(); | ||||||
| 	//GPU States | 	//GPU States | ||||||
| 	public static final GLState MULTI_SAMPLING = addState(new GLState(GL13.GL_MULTISAMPLE)); | 	public final GLState multisampling = addState(new GLState(GL13.GL_MULTISAMPLE)); | ||||||
| 	public static final GLWireFrame WIRE_FRAME = addState(new GLWireFrame(GLCullType.BOTH)); | 	public final GLWireFrame wireframe = addState(new GLWireFrame(GLCullType.BOTH)); | ||||||
| 	public static final GLState PROVOKING_VERTEX = addState(new GLProvoking()); | 	public final GLState provoking_vertex = addState(new GLProvoking()); | ||||||
| 	public static final GLState DEBTH_TEST = addState(new GLState(GL11.GL_DEPTH_TEST)); | 	public final GLState debth_test = addState(new GLState(GL11.GL_DEPTH_TEST)); | ||||||
| 	public static final CullState CULL_FACE = addState(new CullState(GLCullType.BACK)); | 	public final CullState cull_face = addState(new CullState(GLCullType.BACK)); | ||||||
| 	public static final BlendState BLEND = addState(new BlendState()); | 	public final BlendState blend = addState(new BlendState()); | ||||||
| 	public static final GLState[] CLIP_PLANE0 = addStates(new GLState(GL11.GL_CLIP_PLANE0), new GLState(GL11.GL_CLIP_PLANE1), new GLState(GL11.GL_CLIP_PLANE2), new GLState(GL11.GL_CLIP_PLANE3), new GLState(GL11.GL_CLIP_PLANE4), new GLState(GL11.GL_CLIP_PLANE5)); | 	public final GLState[] clip_planes = addStates(new GLState(GL11.GL_CLIP_PLANE0), new GLState(GL11.GL_CLIP_PLANE1), new GLState(GL11.GL_CLIP_PLANE2), new GLState(GL11.GL_CLIP_PLANE3), new GLState(GL11.GL_CLIP_PLANE4), new GLState(GL11.GL_CLIP_PLANE5)); | ||||||
| 	public static final FloatState POINT_SIZE = addState(new FloatState(1F, GL11::glPointSize)); | 	public final FloatState point_size = addState(new FloatState(1F, GL11::glPointSize)); | ||||||
| 	public static final FloatState LINE_SIZE = addState(new FloatState(1F, GL11::glLineWidth)); | 	public final FloatState line_size = addState(new FloatState(1F, GL11::glLineWidth)); | ||||||
| 	public static final ScissorsManager TESTER = new ScissorsManager(100); | 	public final ScissorsManager scissors = new ScissorsManager(100); | ||||||
| 	public static final Counter[] COUNTERS = Counter.createCounters(4); | 	public final Counter[] counters = Counter.createCounters(4); | ||||||
| 	public static final TextureState TEXTURES = addState(new TextureState()); | 	public final TextureState textures = addState(new TextureState()); | ||||||
| 	public static final ViewPortStack VIEW_PORT = new ViewPortStack(); | 	public final ViewPortStack viewPort = new ViewPortStack(); | ||||||
|  | 	 | ||||||
|  | 	//Texture States | ||||||
|  | 	public final PixelState unpack_alignment = new PixelState(GL11.GL_UNPACK_ALIGNMENT, 4); | ||||||
|  | 	public final PixelState unpack_skip_pixel = new PixelState(GL11.GL_UNPACK_SKIP_PIXELS, 0); | ||||||
|  | 	public final PixelState unpack_skip_rows = new PixelState(GL11.GL_UNPACK_SKIP_ROWS, 0); | ||||||
|  | 	public final PixelState unpack_row_length = new PixelState(GL11.GL_UNPACK_ROW_LENGTH, 0); | ||||||
| 	 | 	 | ||||||
| 	//Trackers | 	//Trackers | ||||||
| 	public static final ShaderTracker SHADERS = new ShaderTracker(); | 	public final ShaderTracker shaders = new ShaderTracker(); | ||||||
| 	public static final TextureTracker TEXTURE_TRACKER = new TextureTracker(); | 	public final TextureTracker texture_tracker = new TextureTracker(); | ||||||
| 	public static final GlobalUniforms UNIFORMS = new GlobalUniforms(); | 	public final GlobalUniforms uniforms = new GlobalUniforms(); | ||||||
| 	 | 	 | ||||||
| 	public static <T extends IGLState> T addState(T state) { | 	public static GLStateTracker instance() { | ||||||
| 		ALL_STATES.add(state); | 		return TRACKER.get(); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	public <T extends IGLState> T addState(T state) { | ||||||
|  | 		all_states.add(state); | ||||||
| 		return state; | 		return state; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	@SafeVarargs | 	@SuppressWarnings("unchecked") | ||||||
| 	public static <T extends IGLState> T[] addStates(T... states) { | 	public <T extends IGLState> T[] addStates(T... states) { | ||||||
| 		ALL_STATES.addAll(states); | 		all_states.addAll(states); | ||||||
| 		return states; | 		return states; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	public static void reapplyState() { | 	public void reapplyState() { | ||||||
| 		ALL_STATES.forEach(IGLState::reapply); | 		all_states.forEach(IGLState::reapply); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	public static void onFrameEnded() { | 	public void onFrameEnded() { | ||||||
| 		for(int i = 0,m = COUNTERS.length;i < m;i++) { | 		for(int i = 0,m = counters.length;i < m;i++) { | ||||||
| 			COUNTERS[i].onFinished(); | 			counters[i].onFinished(); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| @ -106,29 +118,29 @@ public class GLStateTracker { | |||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	static void addVerties(int mode, int count) { | 	static void addVerties(int mode, int count) { | ||||||
| 		COUNTERS[0].add(count); | //		counters[0].add(count); | ||||||
| 		switch(mode) { | //		switch(mode) { | ||||||
| 			case GL11.GL_POINTS: | //			case GL11.GL_POINTS: | ||||||
| 				COUNTERS[1].add(count); | //				counters[1].add(count); | ||||||
| 				break; | //				break; | ||||||
| 			case GL11.GL_LINES: | //			case GL11.GL_LINES: | ||||||
| 				COUNTERS[2].add(count / 2); | //				counters[2].add(count / 2); | ||||||
| 				break; | //				break; | ||||||
| 			case GL11.GL_LINE_LOOP: | //			case GL11.GL_LINE_LOOP: | ||||||
| 				COUNTERS[2].add((count + 2) / 2); | //				counters[2].add((count + 2) / 2); | ||||||
| 				break; | //				break; | ||||||
| 			case GL11.GL_LINE_STRIP: | //			case GL11.GL_LINE_STRIP: | ||||||
| 				COUNTERS[2].add(count - 1); | //				counters[2].add(count - 1); | ||||||
| 				break; | //				break; | ||||||
| 			case GL11.GL_TRIANGLES: | //			case GL11.GL_TRIANGLES: | ||||||
| 				COUNTERS[3].add(count / 3); | //				counters[3].add(count / 3); | ||||||
| 				break; | //				break; | ||||||
| 			case GL11.GL_TRIANGLE_STRIP: | //			case GL11.GL_TRIANGLE_STRIP: | ||||||
| 				COUNTERS[3].add(count - 2); | //				counters[3].add(count - 2); | ||||||
| 				break; | //				break; | ||||||
| 			case GL11.GL_TRIANGLE_FAN: | //			case GL11.GL_TRIANGLE_FAN: | ||||||
| 				COUNTERS[3].add(count - 2); | //				counters[3].add(count - 2); | ||||||
| 				break; | //				break; | ||||||
| 		} | //		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | |||||||
| @ -0,0 +1,41 @@ | |||||||
|  | package speiger.src.coreengine.rendering.utils.states; | ||||||
|  | 
 | ||||||
|  | import speiger.src.coreengine.rendering.utils.GLFunctions; | ||||||
|  | 
 | ||||||
|  | public class PixelState implements IGLState { | ||||||
|  | 	final int id; | ||||||
|  | 	final int defaultValue; | ||||||
|  | 	int value; | ||||||
|  | 	 | ||||||
|  | 	public PixelState(int id, int defaultValue) { | ||||||
|  | 		this.id = id; | ||||||
|  | 		this.defaultValue = defaultValue; | ||||||
|  | 		this.value = defaultValue; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	public PixelState set(int value) { | ||||||
|  | 		if(this.value != value) { | ||||||
|  | 			this.value = value; | ||||||
|  | 			setValue(value); | ||||||
|  | 		} | ||||||
|  | 		return this; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	protected void setValue(int value) { | ||||||
|  | 		GLFunctions.pixelStoreI(id, value); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	public int get() { | ||||||
|  | 		return value; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	@Override | ||||||
|  | 	public void setDefault() { | ||||||
|  | 		set(defaultValue); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	@Override | ||||||
|  | 	public void reapply() { | ||||||
|  | 		setValue(value); | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -20,6 +20,7 @@ public class CollectionUtils { | |||||||
| 		return result; | 		return result; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
|  | 	@SuppressWarnings("unchecked") | ||||||
| 	public static <T> Set<T>[] createSets(int size, boolean linked) { | 	public static <T> Set<T>[] createSets(int size, boolean linked) { | ||||||
| 		Set<T>[] sets = new Set[size]; | 		Set<T>[] sets = new Set[size]; | ||||||
| 		for(int i = 0;i < size;i++) { | 		for(int i = 0;i < size;i++) { | ||||||
| @ -28,6 +29,7 @@ public class CollectionUtils { | |||||||
| 		return sets; | 		return sets; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
|  | 	@SuppressWarnings("unchecked") | ||||||
| 	public static <T> ObjectList<T>[] createList(int size) { | 	public static <T> ObjectList<T>[] createList(int size) { | ||||||
| 		ObjectList<T>[] list = new ObjectList[size]; | 		ObjectList<T>[] list = new ObjectList[size]; | ||||||
| 		for(int i = 0;i < size;i++) { | 		for(int i = 0;i < size;i++) { | ||||||
| @ -36,6 +38,7 @@ public class CollectionUtils { | |||||||
| 		return list; | 		return list; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
|  | 	@SuppressWarnings("unchecked") | ||||||
| 	public static <T> Int2ObjectMap<T>[] createInt2ObjectMap(int size, boolean linked) { | 	public static <T> Int2ObjectMap<T>[] createInt2ObjectMap(int size, boolean linked) { | ||||||
| 		Int2ObjectMap<T>[] maps = new Int2ObjectMap[size]; | 		Int2ObjectMap<T>[] maps = new Int2ObjectMap[size]; | ||||||
| 		for(int i = 0;i < size;i++) { | 		for(int i = 0;i < size;i++) { | ||||||
|  | |||||||
| @ -19,7 +19,7 @@ public class Averager { | |||||||
| 	 | 	 | ||||||
| 	public void addEntry(long time) { | 	public void addEntry(long time) { | ||||||
| 		totalValue += time; | 		totalValue += time; | ||||||
| 		if(values.size() >= totalCount) { totalValue -= values.dequeue(); } | 		if(values.size() >= totalCount) totalValue -= values.dequeue(); | ||||||
| 		values.enqueue(time); | 		values.enqueue(time); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
|  | |||||||
| @ -3,22 +3,20 @@ package speiger.src.coreengine.utils.eventbus; | |||||||
| import java.lang.invoke.MethodHandle; | import java.lang.invoke.MethodHandle; | ||||||
| import java.lang.invoke.MethodHandles; | import java.lang.invoke.MethodHandles; | ||||||
| import java.lang.invoke.MethodHandles.Lookup; | import java.lang.invoke.MethodHandles.Lookup; | ||||||
| import java.lang.reflect.Field; |  | ||||||
| import java.lang.reflect.Method; |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.function.Consumer; | import java.util.function.Consumer; | ||||||
|  | import java.util.function.Function; | ||||||
| 
 | 
 | ||||||
| import speiger.src.collections.objects.lists.ObjectArrayList; | import speiger.src.collections.objects.lists.ObjectArrayList; | ||||||
| import speiger.src.collections.objects.maps.impl.hash.Object2ObjectOpenHashMap; | import speiger.src.collections.objects.maps.impl.concurrent.Object2ObjectConcurrentOpenHashMap; | ||||||
| import speiger.src.collections.objects.maps.interfaces.Object2ObjectMap; | import speiger.src.collections.objects.maps.interfaces.Object2ObjectMap; | ||||||
| import speiger.src.collections.objects.utils.ObjectLists; | import speiger.src.collections.objects.utils.ObjectLists; | ||||||
| import speiger.src.collections.objects.utils.maps.Object2ObjectMaps; |  | ||||||
| 
 | 
 | ||||||
| public class EventBus | public class EventBus | ||||||
| { | { | ||||||
| 	private static final Lookup LOOKUP = MethodHandles.lookup(); | 	private static final Lookup LOOKUP = MethodHandles.lookup(); | ||||||
| 	Object2ObjectMap<Class<? extends Event>, Listeners> listeners = Object2ObjectMaps.synchronize(new Object2ObjectOpenHashMap<>()); | 	Object2ObjectMap<Class<? extends Event>, Listeners> listeners = new Object2ObjectConcurrentOpenHashMap<>(); | ||||||
| 	Object2ObjectMap<Object, List<EventListener>> instances = Object2ObjectMaps.synchronize(new Object2ObjectOpenHashMap<>()); | 	Object2ObjectMap<Object, List<EventListener>> instances = new Object2ObjectConcurrentOpenHashMap<>(); | ||||||
| 	 | 	 | ||||||
| 	public <T extends Event> void register(Class<T> event, Consumer<T> listener) { | 	public <T extends Event> void register(Class<T> event, Consumer<T> listener) { | ||||||
| 		register(event, EventPriority.MEDIUM, listener); | 		register(event, EventPriority.MEDIUM, listener); | ||||||
| @ -39,7 +37,7 @@ public class EventBus | |||||||
| 		final List<EventListener> list = new ObjectArrayList<>(); | 		final List<EventListener> list = new ObjectArrayList<>(); | ||||||
| 		try { | 		try { | ||||||
| 			register(obj.getClass().getDeclaredAnnotation(SubscribeEvent.class), obj, list); | 			register(obj.getClass().getDeclaredAnnotation(SubscribeEvent.class), obj, list); | ||||||
| 			findMethods(obj.getClass(), superClasses, t -> { | 			find(obj.getClass(), superClasses, Class::getDeclaredMethods, t -> { | ||||||
| 				try { | 				try { | ||||||
| 					t.setAccessible(true); | 					t.setAccessible(true); | ||||||
| 					SubscribeEvent data = t.getAnnotation(SubscribeEvent.class); | 					SubscribeEvent data = t.getAnnotation(SubscribeEvent.class); | ||||||
| @ -50,7 +48,7 @@ public class EventBus | |||||||
| 				} | 				} | ||||||
| 				catch(Exception e) { e.printStackTrace(); } | 				catch(Exception e) { e.printStackTrace(); } | ||||||
| 			}); | 			}); | ||||||
| 			findFields(obj.getClass(), superClasses, t -> { | 			find(obj.getClass(), superClasses, Class::getDeclaredFields, t -> { | ||||||
| 				try { | 				try { | ||||||
| 					t.setAccessible(true); | 					t.setAccessible(true); | ||||||
| 					register(t.getAnnotation(SubscribeEvent.class), t.get(obj), list);						 | 					register(t.getAnnotation(SubscribeEvent.class), t.get(obj), list);						 | ||||||
| @ -69,20 +67,13 @@ public class EventBus | |||||||
| 		listeners.add(new EventListener(data.value(), cast(obj))); | 		listeners.add(new EventListener(data.value(), cast(obj))); | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	private void findFields(Class<?> clz, boolean superClasses, Consumer<Field> fields) { | 	private <T> void find(Class<?> clz, boolean superClasses, Function<Class<?>, T[]> mapper, Consumer<T> result) { | ||||||
| 		do { | 		do { | ||||||
| 			for(Field field : clz.getDeclaredFields()) fields.accept(field); | 			for(T value : mapper.apply(clz)) result.accept(value); | ||||||
| 			clz = clz.getSuperclass(); | 			clz = clz.getSuperclass(); | ||||||
| 		} | 		} | ||||||
| 		while(clz != Object.class && superClasses); | 		while(clz != Object.class && superClasses); | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	private void findMethods(Class<?> clz, boolean superClasses, Consumer<Method> methods) { |  | ||||||
| 		do { |  | ||||||
| 			for(Method field : clz.getDeclaredMethods()) methods.accept(field); |  | ||||||
| 			clz = clz.getSuperclass(); |  | ||||||
| 		} |  | ||||||
| 		while(clz != Object.class && superClasses); |  | ||||||
| 	} | 	} | ||||||
| 		 | 		 | ||||||
| 	public void unregister(Object obj) { | 	public void unregister(Object obj) { | ||||||
|  | |||||||
| @ -23,6 +23,7 @@ public class DataTagIOBuilder | |||||||
| 		return builder; | 		return builder; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
|  | 	@SuppressWarnings("unchecked") | ||||||
| 	public <T> DataTagIOBuilder add(Class<T> type, Object obj) | 	public <T> DataTagIOBuilder add(Class<T> type, Object obj) | ||||||
| 	{ | 	{ | ||||||
| 		IDataSerializer<T> serializer = obj instanceof IDataSerializer ? (IDataSerializer<T>)obj : null; | 		IDataSerializer<T> serializer = obj instanceof IDataSerializer ? (IDataSerializer<T>)obj : null; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user