diff --git a/.classpath b/.classpath
index f60f002..b8e2565 100644
--- a/.classpath
+++ b/.classpath
@@ -24,6 +24,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build.gradle b/build.gradle
index c5f792e..bd66764 100644
--- a/build.gradle
+++ b/build.gradle
@@ -16,12 +16,31 @@ eclipse {
}
sourceSets {
- graphics {}
+ math {
+ java {}
+ }
+ assets {
+ java {}
+ }
+ graphics {
+ java {}
+ }
+ main {
+ compileClasspath += sourceSets.math.output
+ runtimeClasspath += sourceSets.math.output
+ }
+ graphics {
+ compileClasspath += sourceSets.math.output
+ runtimeClasspath += sourceSets.math.output
+ java {}
+ }
}
configurations {
graphics.extendsFrom implementation
graphics.extendsFrom runtime
+ graphics.extendsFrom mathRuntime
+ implementation.extendsFrom mathRuntime
}
repositories {
@@ -64,6 +83,7 @@ dependencies {
//Primitive Collections
implementation 'de.speiger:Primitive-Collections:1.0.0'
+ mathImplementation 'de.speiger:Primitive-Collections:1.0.0'
}
jar {
diff --git a/src/assets/java/speiger/src/coreengine/assets/api/IAsset.java b/src/assets/java/speiger/src/coreengine/assets/api/IAsset.java
new file mode 100644
index 0000000..f38f8aa
--- /dev/null
+++ b/src/assets/java/speiger/src/coreengine/assets/api/IAsset.java
@@ -0,0 +1,14 @@
+package speiger.src.coreengine.assets.api;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public interface IAsset {
+ public IAssetPackage owner();
+ public ID location();
+
+ public String hash();
+ public InputStream stream() throws IOException;
+
+ public T parse(IAssetParser parser) throws IOException;
+}
diff --git a/src/assets/java/speiger/src/coreengine/assets/api/IAssetPackage.java b/src/assets/java/speiger/src/coreengine/assets/api/IAssetPackage.java
new file mode 100644
index 0000000..42834e5
--- /dev/null
+++ b/src/assets/java/speiger/src/coreengine/assets/api/IAssetPackage.java
@@ -0,0 +1,5 @@
+package speiger.src.coreengine.assets.api;
+
+public interface IAssetPackage {
+
+}
diff --git a/src/assets/java/speiger/src/coreengine/assets/api/IAssetParser.java b/src/assets/java/speiger/src/coreengine/assets/api/IAssetParser.java
new file mode 100644
index 0000000..c57201f
--- /dev/null
+++ b/src/assets/java/speiger/src/coreengine/assets/api/IAssetParser.java
@@ -0,0 +1,8 @@
+package speiger.src.coreengine.assets.api;
+
+import java.io.IOException;
+import java.nio.file.Path;
+
+public interface IAssetParser {
+ public T parse(Path path) throws IOException;
+}
diff --git a/src/assets/java/speiger/src/coreengine/assets/api/IAssetProvider.java b/src/assets/java/speiger/src/coreengine/assets/api/IAssetProvider.java
new file mode 100644
index 0000000..cf0b41e
--- /dev/null
+++ b/src/assets/java/speiger/src/coreengine/assets/api/IAssetProvider.java
@@ -0,0 +1,6 @@
+package speiger.src.coreengine.assets.api;
+
+public interface IAssetProvider {
+ public IAsset get(ID id);
+ public String hash(ID id);
+}
diff --git a/src/assets/java/speiger/src/coreengine/assets/api/ID.java b/src/assets/java/speiger/src/coreengine/assets/api/ID.java
new file mode 100644
index 0000000..88f3f21
--- /dev/null
+++ b/src/assets/java/speiger/src/coreengine/assets/api/ID.java
@@ -0,0 +1,79 @@
+package speiger.src.coreengine.assets.api;
+
+import java.util.Objects;
+
+public record ID(String domain, String path) implements Comparable {
+
+ public ID {
+ Objects.requireNonNull(domain);
+ Objects.requireNonNull(path);
+ if(!isValidDomain(domain)) throw new IllegalArgumentException("Non [a-zA-Z0-9_.-] Character found in domain of location ["+domain+":"+path+"]");
+ if(!isValidPath(path)) throw new IllegalArgumentException("Non [a-zA-Z0-9/_.-] Character found in path of location ["+domain+":"+path+"]");
+ }
+
+ public ID prefix(String prefix) { return of(domain, prefix+"/"+path); }
+ public ID suffix(String suffix) { return of(domain, path+"/"+suffix); }
+ public ID alternate(String alterversion) { return of(domain, path+"."+alterversion); }
+
+ public String fileLocation() { return "assets/"+domain+"/"+path; }
+ public boolean isRoot() { return !path.contains("/"); }
+ public boolean isRootFolder(String folder) { return path.indexOf('/', folder.length()+1) < 0; }
+ public boolean endsWith(String suffix) { return path.endsWith(suffix); }
+
+ @Override
+ public final String toString() {
+ return domain+":"+path;
+ }
+
+ @Override
+ public int compareTo(ID o) {
+ int result = domain.compareToIgnoreCase(o.domain);
+ return result != 0 ? result : path.compareToIgnoreCase(path);
+ }
+
+ public boolean matches(ID id) {
+ return id.domain.equals(domain) && id.path.equals(path);
+ }
+
+ public static ID of(String domain, String path) {
+ return new ID((domain == null || domain.isBlank() ? "base" : domain), path);
+ }
+
+ public static ID of(String location) {
+ Objects.requireNonNull(location);
+ int index = location.indexOf(":");
+ String domain = location.substring(0, index);
+ String path = location.substring(index + 1);
+ if(!isValidDomain(domain)) throw new IllegalArgumentException("Non [a-zA-Z0-9_.-] Character found in domain of location ["+domain+":"+path+"]");
+ if(!isValidPath(path)) throw new IllegalArgumentException("Non [a-zA-Z0-9/_.-] Character found in path of location ["+domain+":"+path+"]");
+ return new ID(domain, path);
+ }
+
+ public static final ID tryOf(String location) {
+ try { return of(location); }
+ catch(Exception e) {}
+ return null;
+ }
+
+ private static boolean isValidDomain(String s) {
+ for(int i = 0,m=s.length();i= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9');
+ }
+}
diff --git a/src/assets/java/speiger/src/coreengine/assets/api/MultiAsset.java b/src/assets/java/speiger/src/coreengine/assets/api/MultiAsset.java
new file mode 100644
index 0000000..5e3ec0c
--- /dev/null
+++ b/src/assets/java/speiger/src/coreengine/assets/api/MultiAsset.java
@@ -0,0 +1,54 @@
+package speiger.src.coreengine.assets.api;
+
+import java.io.IOException;
+import java.util.Objects;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
+import speiger.src.collections.objects.collections.ObjectIterable;
+import speiger.src.collections.objects.collections.ObjectIterator;
+import speiger.src.collections.objects.functions.consumer.ObjectObjectConsumer;
+import speiger.src.collections.objects.lists.ObjectArrayList;
+import speiger.src.collections.objects.lists.ObjectList;
+
+public record MultiAsset(ObjectList assets) implements ObjectIterable {
+
+ public MultiAsset(ObjectList assets) {
+ this.assets = Objects.requireNonNull(assets).unmodifiable();
+ }
+
+ public MultiAsset(IAsset... assets) {
+ this(ObjectArrayList.wrap(assets));
+ }
+
+ public int size() { return assets.size(); }
+ public IAsset get(int index) { return assets.get(index); }
+ @Override
+ public ObjectIterator iterator() { return assets.iterator(); }
+
+ public ObjectIterable map(IAssetParser mapper, Supplier defaultValue) {
+ return assets.map(E -> {
+ try { return E.parse(mapper); }
+ catch(IOException e) {
+ e.printStackTrace();
+ return defaultValue.get();
+ }
+ });
+ }
+
+ @Override
+ public void forEach(Consumer super IAsset> action) {
+ assets.forEach(action);
+ }
+
+ @Override
+ public void forEach(E input, ObjectObjectConsumer action) {
+ assets.forEach(input, action);
+ }
+
+ @Override
+ public void forEachIndexed(IntObjectConsumer action) {
+ assets.forEachIndexed(action);
+ }
+}
diff --git a/src/graphics/java/speiger/src/coreengine/graphics/api/buffer/states/IndeciesType.java b/src/graphics/java/speiger/src/coreengine/graphics/api/buffer/states/IndeciesType.java
new file mode 100644
index 0000000..f65af13
--- /dev/null
+++ b/src/graphics/java/speiger/src/coreengine/graphics/api/buffer/states/IndeciesType.java
@@ -0,0 +1,7 @@
+package speiger.src.coreengine.graphics.api.buffer.states;
+
+public enum IndeciesType {
+ BYTE,
+ SHORT,
+ INT;
+}
diff --git a/src/graphics/java/speiger/src/coreengine/graphics/api/core/GraphicsCommandQueue.java b/src/graphics/java/speiger/src/coreengine/graphics/api/core/GraphicsCommandQueue.java
index 4fd6278..38afb60 100644
--- a/src/graphics/java/speiger/src/coreengine/graphics/api/core/GraphicsCommandQueue.java
+++ b/src/graphics/java/speiger/src/coreengine/graphics/api/core/GraphicsCommandQueue.java
@@ -1,5 +1,7 @@
package speiger.src.coreengine.graphics.api.core;
+import speiger.src.coreengine.graphics.api.shader.RenderPass;
+import speiger.src.coreengine.graphics.api.target.RenderTarget;
import speiger.src.coreengine.graphics.api.texture.Texture;
import speiger.src.coreengine.graphics.api.utils.PushableResource;
import speiger.src.coreengine.math.vector.floats.Vec4f;
@@ -7,11 +9,26 @@ import speiger.src.coreengine.math.vector.floats.Vec4f;
public interface GraphicsCommandQueue {
public static final int CLEAR_COLOR = 1;
public static final int CLEAR_DEPTH = 2;
- public PushableResource pushClearColor(Vec4f color);
- public PushableResource pushClearDepth(double value);
+ public PushableResource putClearColor(Vec4f color);
+ public PushableResource putClearDepth(double value);
+ public PushableResource putRenderTarget(RenderTarget target);
+ public void clearTexture(int clearParam);
+ public void clearTexture(int x, int y, int width, int height, int clearParam);
public void clearTexture(Texture texture, int clearParam);
public void clearTexture(Texture texture, int x, int y, int width, int height, int clearParam);
-
+ public void writeToTexture(Texture target, int x, int y, int width, int height, long source);
+ public void readFromTexture(Texture source, int x, int y, int width, int height, long target);
+ public RenderPass createRenderPass(RenderTarget target, DrawArea area);
+
+ public record DrawArea(int x, int y, int width, int height) {
+ public boolean fits(int x, int y, int width, int height) {
+ return x >= x() && y >= y() && x + width < width() && y + height < height();
+ }
+
+ public boolean fills(int width, int height) {
+ return x == 0 && y == 0 && width == width() && height == height();
+ }
+ }
}
\ No newline at end of file
diff --git a/src/graphics/java/speiger/src/coreengine/graphics/api/core/GraphicsDevice.java b/src/graphics/java/speiger/src/coreengine/graphics/api/core/GraphicsDevice.java
index 6007bb3..708b8c6 100644
--- a/src/graphics/java/speiger/src/coreengine/graphics/api/core/GraphicsDevice.java
+++ b/src/graphics/java/speiger/src/coreengine/graphics/api/core/GraphicsDevice.java
@@ -7,8 +7,10 @@ import speiger.src.coreengine.graphics.api.sampler.Sampler;
import speiger.src.coreengine.graphics.api.sampler.SamplerSettings;
import speiger.src.coreengine.graphics.api.texture.Texture;
import speiger.src.coreengine.graphics.api.texture.TextureSettings;
+import speiger.src.coreengine.rendering.input.window.Window;
public interface GraphicsDevice {
+ public Window getWindow();
public GraphicsSurface createSurface();
public GraphicsCommandQueue getQueue();
public VertexBuffer createBuffer(BufferType type, BufferState state);
diff --git a/src/graphics/java/speiger/src/coreengine/graphics/api/shader/CompiledPipeline.java b/src/graphics/java/speiger/src/coreengine/graphics/api/shader/CompiledPipeline.java
new file mode 100644
index 0000000..98a7a38
--- /dev/null
+++ b/src/graphics/java/speiger/src/coreengine/graphics/api/shader/CompiledPipeline.java
@@ -0,0 +1,5 @@
+package speiger.src.coreengine.graphics.api.shader;
+
+public interface CompiledPipeline {
+
+}
diff --git a/src/graphics/java/speiger/src/coreengine/graphics/api/shader/RenderPass.java b/src/graphics/java/speiger/src/coreengine/graphics/api/shader/RenderPass.java
new file mode 100644
index 0000000..5c6df02
--- /dev/null
+++ b/src/graphics/java/speiger/src/coreengine/graphics/api/shader/RenderPass.java
@@ -0,0 +1,51 @@
+package speiger.src.coreengine.graphics.api.shader;
+
+import speiger.src.coreengine.graphics.api.buffer.VertexBuffer;
+import speiger.src.coreengine.graphics.api.buffer.states.IndeciesType;
+import speiger.src.coreengine.graphics.api.core.GraphicsCommandQueue.DrawArea;
+import speiger.src.coreengine.graphics.api.sampler.Sampler;
+import speiger.src.coreengine.graphics.api.texture.Texture;
+import speiger.src.coreengine.graphics.api.utils.ScissorsManager;
+
+public abstract class RenderPass implements AutoCloseable {
+ protected final DrawArea area;
+ protected final boolean hasColor;
+ protected final boolean hasDepth;
+ protected final ScissorsManager scissors = new ScissorsManager(16);
+
+ public RenderPass(DrawArea area, boolean hasColor, boolean hasDepth) {
+ this.area = area;
+ this.hasColor = hasColor;
+ this.hasDepth = hasDepth;
+ }
+
+ public void pushScissors(int x, int y, int width, int height) {
+ if(area != null && area.fits(x, y, width, height)) {
+ //TODO implement logging
+ return;
+ }
+ scissors.push(x, y, width, height);
+ }
+
+ public void popScissors() {
+ scissors.pop();
+ }
+
+ public abstract void setShader(ShaderPipeline pipeline);
+ public abstract void setTexture(String name, Texture texture, Sampler sampler);
+ public abstract void clearTextures();
+ public abstract void removeTexture(String name);
+ public abstract void setUniform(String name, VertexBuffer buffer);
+ public abstract void setIndecies(VertexBuffer buffer, IndeciesType type);
+ public abstract void clearIndecies();
+ public abstract void setVertexBuffer(int index, VertexBuffer buffer);
+
+ public DrawArea area() { return area; }
+ public boolean hasDepth() { return hasDepth; }
+ public boolean hasColor() { return hasColor; }
+
+ @Override
+ public abstract void close();
+
+
+}
diff --git a/src/graphics/java/speiger/src/coreengine/graphics/api/target/RenderTarget.java b/src/graphics/java/speiger/src/coreengine/graphics/api/target/RenderTarget.java
new file mode 100644
index 0000000..8423348
--- /dev/null
+++ b/src/graphics/java/speiger/src/coreengine/graphics/api/target/RenderTarget.java
@@ -0,0 +1,4 @@
+package speiger.src.coreengine.graphics.api.target;
+
+public sealed interface RenderTarget permits ScreenTarget, TextureTarget {
+}
diff --git a/src/graphics/java/speiger/src/coreengine/graphics/api/target/ScreenTarget.java b/src/graphics/java/speiger/src/coreengine/graphics/api/target/ScreenTarget.java
new file mode 100644
index 0000000..79d2deb
--- /dev/null
+++ b/src/graphics/java/speiger/src/coreengine/graphics/api/target/ScreenTarget.java
@@ -0,0 +1,6 @@
+package speiger.src.coreengine.graphics.api.target;
+
+public final class ScreenTarget implements RenderTarget {
+ public static final ScreenTarget INSTANCE = new ScreenTarget();
+ private ScreenTarget() {}
+}
diff --git a/src/graphics/java/speiger/src/coreengine/graphics/api/target/TextureTarget.java b/src/graphics/java/speiger/src/coreengine/graphics/api/target/TextureTarget.java
new file mode 100644
index 0000000..6edec88
--- /dev/null
+++ b/src/graphics/java/speiger/src/coreengine/graphics/api/target/TextureTarget.java
@@ -0,0 +1,17 @@
+package speiger.src.coreengine.graphics.api.target;
+
+import speiger.src.coreengine.assets.AssetLocation;
+import speiger.src.coreengine.graphics.api.texture.Texture;
+import speiger.src.coreengine.graphics.api.texture.states.TextureType;
+
+public record TextureTarget(AssetLocation id, Texture color, Texture depth) implements RenderTarget {
+ public TextureTarget {
+ if(color == null && depth == null) throw new IllegalArgumentException("At least either texture has to be nonNull");
+ if(color != null && depth != null) {
+ if(color.width() != depth.width()) throw new IllegalArgumentException("Width is not matching");
+ if(color.height() != depth.height()) throw new IllegalArgumentException("Height is not matching");
+ }
+ if(color != null && color.settings().type() != TextureType.TEXTURE_2D) throw new IllegalArgumentException("Color Texture has to be 2D");
+ if(depth != null && depth.settings().type() != TextureType.TEXTURE_2D) throw new IllegalArgumentException("Depth Texture has to be 2D");
+ }
+}
diff --git a/src/graphics/java/speiger/src/coreengine/graphics/api/texture/Texture.java b/src/graphics/java/speiger/src/coreengine/graphics/api/texture/Texture.java
index 8105ae4..863cf6a 100644
--- a/src/graphics/java/speiger/src/coreengine/graphics/api/texture/Texture.java
+++ b/src/graphics/java/speiger/src/coreengine/graphics/api/texture/Texture.java
@@ -6,7 +6,7 @@ public abstract class Texture implements GraphicsResource {
final TextureSettings settings;
int width;
int height;
-
+
public Texture(TextureSettings settings, int width, int height) {
this.settings = settings;
this.width = width;
diff --git a/src/graphics/java/speiger/src/coreengine/graphics/api/utils/ScissorsManager.java b/src/graphics/java/speiger/src/coreengine/graphics/api/utils/ScissorsManager.java
new file mode 100644
index 0000000..df5ee2f
--- /dev/null
+++ b/src/graphics/java/speiger/src/coreengine/graphics/api/utils/ScissorsManager.java
@@ -0,0 +1,52 @@
+package speiger.src.coreengine.graphics.api.utils;
+
+import org.lwjgl.opengl.GL11;
+
+import speiger.src.collections.objects.lists.ObjectArrayList;
+import speiger.src.collections.utils.Stack;
+import speiger.src.coreengine.math.vector.ints.Vec4i;
+
+public class ScissorsManager {
+ Stack stack = new ObjectArrayList<>();
+ int limit;
+
+ public ScissorsManager(int limit) {
+ if(limit <= 0) throw new IllegalStateException("Limit is negative");
+ this.limit = limit;
+ }
+
+ public void push(int x, int y, int width, int height) {
+ if(stack.size() >= limit) {
+ //TODO implement logging
+ return;
+ }
+ if(stack.isEmpty()) {
+ stack.push(Vec4i.of(x, y, x + width, y + height));
+ GL11.glEnable(GL11.GL_SCISSOR_TEST);
+ GL11.glScissor(x, y, width, height);
+ return;
+ }
+ Vec4i top = stack.top();
+ stack.push(Vec4i.of(Math.max(x, top.x()), Math.max(y, top.y()), Math.min(x + width, top.z()), Math.min(y + height, top.w())));
+ }
+
+ public boolean contains(int x, int y, int width, int height) {
+ return stack.isEmpty() || contains(stack.top(), x, y, width, height);
+ }
+
+ protected boolean contains(Vec4i top, int x, int y, int width, int height) {
+ return x >= top.x() && y >= top.y() && x + width < top.z() && y + height < top.w();
+ }
+
+ public void pop() {
+ if(stack.isEmpty()) {
+ //TODO implement logging
+ return;
+ }
+ stack.pop();
+ }
+
+ public void clear() {
+ stack.clear();
+ }
+}
diff --git a/src/graphics/java/speiger/src/coreengine/graphics/opengl/core/GLCommandQueue.java b/src/graphics/java/speiger/src/coreengine/graphics/opengl/core/GLCommandQueue.java
new file mode 100644
index 0000000..5ddb61e
--- /dev/null
+++ b/src/graphics/java/speiger/src/coreengine/graphics/opengl/core/GLCommandQueue.java
@@ -0,0 +1,167 @@
+package speiger.src.coreengine.graphics.opengl.core;
+
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL30;
+import org.lwjgl.opengl.GL45;
+
+import speiger.src.coreengine.assets.AssetLocation;
+import speiger.src.coreengine.graphics.api.core.GraphicsCommandQueue;
+import speiger.src.coreengine.graphics.api.shader.RenderPass;
+import speiger.src.coreengine.graphics.api.target.RenderTarget;
+import speiger.src.coreengine.graphics.api.target.ScreenTarget;
+import speiger.src.coreengine.graphics.api.target.TextureTarget;
+import speiger.src.coreengine.graphics.api.texture.Texture;
+import speiger.src.coreengine.graphics.api.utils.PushableResource;
+import speiger.src.coreengine.graphics.opengl.shader.GLRenderPass;
+import speiger.src.coreengine.graphics.opengl.texture.FrameBufferCache;
+import speiger.src.coreengine.graphics.opengl.texture.GLTexture;
+import speiger.src.coreengine.math.vector.floats.Vec4f;
+import speiger.src.coreengine.rendering.input.window.Window;
+
+public class GLCommandQueue implements GraphicsCommandQueue {
+ private static final int HAS_COLOR = 1;
+ private static final int HAS_DEPTH = 2;
+ private static final int HAS_BOTH = 3;
+ GLGraphicsDevice device;
+ FrameBufferCache fboCache = new FrameBufferCache();
+ GLRenderPass activePass;
+ RenderTarget renderTarget = ScreenTarget.INSTANCE;
+ Vec4f clearColor = Vec4f.mutable(0F, 0F, 0F, 1F);
+ double clearDepth = 0D;
+
+ public GLCommandQueue(GLGraphicsDevice device) {
+ this.device = device;
+ }
+
+ @Override
+ public PushableResource putClearColor(Vec4f color) {
+ return new PushableObject<>(clearColor.copyAsImmutable(), setClearColor(color), () -> clearColor, this::setClearColor);
+ }
+
+ @Override
+ public PushableResource putClearDepth(double value) {
+ return new PushableObject<>(clearDepth, setClearDepth(value), () -> clearDepth, this::setClearDepth);
+ }
+
+ @Override
+ public PushableResource putRenderTarget(RenderTarget target) {
+ return new PushableObject<>(renderTarget, setRenderTarget(target), () -> renderTarget, this::setRenderTarget);
+ }
+
+ private Vec4f setClearColor(Vec4f value) {
+ if(clearColor.equals(value)) return value;
+ clearColor.set(value);
+ GL11.glClearColor(value.x(), value.y(), value.y(), value.w());
+ return value;
+ }
+
+ private double setClearDepth(double value) {
+ if(Double.compare(clearDepth, value) == 0) return value;
+ clearDepth = value;
+ GL11.glClearDepth(value);
+ return value;
+ }
+
+ private RenderTarget setRenderTarget(RenderTarget target) {
+ if(this.renderTarget.equals(target)) return target;
+ this.renderTarget = target;
+ switch(target) {
+ case ScreenTarget _ -> {
+ GL30.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, 0);
+ Window window = device.getWindow();
+ GL11.glViewport(0, 0, window.width(), window.height());
+ break;
+ }
+ case TextureTarget(AssetLocation id, Texture color, Texture depth) -> {
+ int fbo = fboCache.getOrCreateFBO(id);
+ if(color != null) GL45.glNamedFramebufferTexture(fbo, GL30.GL_COLOR_ATTACHMENT0, ((GLTexture)color).id(), 0);
+ if(depth != null) GL45.glNamedFramebufferTexture(fbo, GL30.GL_DEPTH_ATTACHMENT, ((GLTexture)depth).id(), 0);
+ GL30.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, fbo);
+ if(color != null) GL11.glViewport(0, 0, color.width(), color.height());
+ else if(depth != null) GL11.glViewport(0, 0, depth.width(), depth.height());
+ break;
+ }
+ }
+ return target;
+ }
+
+ @Override
+ public void clearTexture(int clearParam) {
+ }
+
+ @Override
+ public void clearTexture(int x, int y, int width, int height, int clearParam) {
+ }
+
+ @Override
+ public void clearTexture(Texture texture, int clearParam) {
+ }
+
+ @Override
+ public void clearTexture(Texture texture, int x, int y, int width, int height, int clearParam) {
+ }
+
+ @Override
+ public void writeToTexture(Texture target, int x, int y, int width, int height, long source) {
+ }
+
+ @Override
+ public void readFromTexture(Texture source, int x, int y, int width, int height, long target) {
+ }
+
+ @Override
+ public RenderPass createRenderPass(RenderTarget target, DrawArea area) {
+ int width = 0;
+ int height = 0;
+ int hasState = 0;
+ int frameBuffer = switch(target) {
+ case ScreenTarget _ -> {
+ Window window = device.getWindow();
+ width = window.width();
+ height = window.height();
+ hasState = HAS_BOTH;
+ yield 0;
+ }
+ case TextureTarget(AssetLocation id, Texture color, Texture depth) -> {
+ int fbo = fboCache.getOrCreateFBO(id);
+ if(color != null) {
+ hasState |= HAS_COLOR;
+ GL45.glNamedFramebufferTexture(fbo, GL30.GL_COLOR_ATTACHMENT0, ((GLTexture)color).id(), 0);
+ }
+ if(depth != null) {
+ hasState |= HAS_DEPTH;
+ GL45.glNamedFramebufferTexture(fbo, GL30.GL_DEPTH_ATTACHMENT, ((GLTexture)depth).id(), 0);
+ }
+ if(color != null) {
+ width = color.width();
+ height = color.height();
+ }
+ else if(depth != null) {
+ width = depth.width();
+ height = depth.height();
+ }
+ yield fbo;
+ }
+ };
+ GL30.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, frameBuffer);
+ GL11.glViewport(0, 0, width, height);
+ boolean scissors = area != null && !area.fills(width, height);
+ if(scissors) {
+ GL11.glEnable(GL11.GL_SCISSOR_TEST);
+ GL11.glScissor(area.x(), area.y(), area.width(), area.height());
+ }
+ return (activePass = new GLRenderPass(this, area, scissors, (hasState & HAS_COLOR) != 0, (hasState & HAS_DEPTH) != 0, frameBuffer));
+ }
+
+ private record PushableObject(T original, T applying, Supplier current, Consumer apply) implements PushableResource {
+ @Override
+ public void close() {
+ if(current.get().equals(applying)) {
+ apply.accept(original);
+ }
+ }
+ }
+}
diff --git a/src/graphics/java/speiger/src/coreengine/graphics/opengl/core/GLGraphicsDevice.java b/src/graphics/java/speiger/src/coreengine/graphics/opengl/core/GLGraphicsDevice.java
index 31a3f36..f7c890b 100644
--- a/src/graphics/java/speiger/src/coreengine/graphics/opengl/core/GLGraphicsDevice.java
+++ b/src/graphics/java/speiger/src/coreengine/graphics/opengl/core/GLGraphicsDevice.java
@@ -9,36 +9,44 @@ import org.lwjgl.opengl.GL33;
import org.lwjgl.opengl.GL43;
import org.lwjgl.opengl.GL45;
+import speiger.src.coreengine.assets.base.IAssetProvider;
import speiger.src.coreengine.graphics.api.buffer.states.BufferState;
import speiger.src.coreengine.graphics.api.buffer.states.BufferType;
-import speiger.src.coreengine.graphics.api.core.GraphicsCommandQueue;
import speiger.src.coreengine.graphics.api.core.GraphicsDevice;
-import speiger.src.coreengine.graphics.api.core.GraphicsSurface;
import speiger.src.coreengine.graphics.api.sampler.SamplerSettings;
+import speiger.src.coreengine.graphics.api.shader.ShaderPipeline;
import speiger.src.coreengine.graphics.api.texture.TextureSettings;
import speiger.src.coreengine.graphics.api.texture.states.SwizzleMask;
import speiger.src.coreengine.graphics.opengl.buffer.GLVertexBuffer;
import speiger.src.coreengine.graphics.opengl.sampler.GLSampler;
+import speiger.src.coreengine.graphics.opengl.shader.ShaderInstance;
import speiger.src.coreengine.graphics.opengl.texture.GLTexture;
import speiger.src.coreengine.graphics.opengl.utils.GLFunctions;
import speiger.src.coreengine.graphics.opengl.utils.GLUtils;
import speiger.src.coreengine.rendering.input.window.Window;
public class GLGraphicsDevice implements GraphicsDevice {
+ GLCommandQueue queue;
Window owner;
public GLGraphicsDevice(Window owner) {
this.owner = owner;
+ this.queue = new GLCommandQueue(this);
}
@Override
- public GraphicsSurface createSurface() {
+ public Window getWindow() {
+ return owner;
+ }
+
+ @Override
+ public GLSurface createSurface() {
return new GLSurface(owner);
}
@Override
- public GraphicsCommandQueue getQueue() {
- return null;
+ public GLCommandQueue getQueue() {
+ return queue;
}
@Override
@@ -76,4 +84,10 @@ public class GLGraphicsDevice implements GraphicsDevice {
public GLSampler createSampler(SamplerSettings settings) {
return new GLSampler(Objects.requireNonNull(settings));
}
+
+ public ShaderInstance createShader(ShaderPipeline line, IAssetProvider provider) {
+
+
+ return null;
+ }
}
diff --git a/src/graphics/java/speiger/src/coreengine/graphics/opengl/shader/GLRenderPass.java b/src/graphics/java/speiger/src/coreengine/graphics/opengl/shader/GLRenderPass.java
new file mode 100644
index 0000000..5d6e053
--- /dev/null
+++ b/src/graphics/java/speiger/src/coreengine/graphics/opengl/shader/GLRenderPass.java
@@ -0,0 +1,100 @@
+package speiger.src.coreengine.graphics.opengl.shader;
+
+import java.util.Map;
+import java.util.Objects;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL45;
+
+import speiger.src.collections.objects.maps.interfaces.Object2ObjectMap;
+import speiger.src.collections.objects.misc.pairs.ObjectObjectPair;
+import speiger.src.coreengine.graphics.api.buffer.VertexBuffer;
+import speiger.src.coreengine.graphics.api.buffer.states.IndeciesType;
+import speiger.src.coreengine.graphics.api.core.GraphicsCommandQueue.DrawArea;
+import speiger.src.coreengine.graphics.api.sampler.Sampler;
+import speiger.src.coreengine.graphics.api.shader.CompiledPipeline;
+import speiger.src.coreengine.graphics.api.shader.RenderPass;
+import speiger.src.coreengine.graphics.api.shader.ShaderPipeline;
+import speiger.src.coreengine.graphics.api.texture.Texture;
+import speiger.src.coreengine.graphics.opengl.core.GLCommandQueue;
+
+public class GLRenderPass extends RenderPass {
+ boolean scissors;
+ GLCommandQueue queue;
+ int fbo;
+ VertexBuffer[] buffers = new VertexBuffer[4];
+ Map> textures = Object2ObjectMap.builder().linkedMap();
+ Map uniforms = Object2ObjectMap.builder().linkedMap();
+ VertexBuffer indecies;
+ IndeciesType indeciesType;
+ ShaderPipeline pipeline;
+ CompiledPipeline compiled;
+
+ public GLRenderPass(GLCommandQueue queue, DrawArea area, boolean scissors, boolean hasColor, boolean hasDepth, int fbo) {
+ super(area, hasColor, hasDepth);
+ this.scissors = scissors;
+ this.queue = queue;
+ this.fbo = fbo;
+ }
+
+ @Override
+ public void setShader(ShaderPipeline pipeline) {
+ this.pipeline = Objects.requireNonNull(pipeline);
+ }
+
+ @Override
+ public void setTexture(String name, Texture texture, Sampler sampler) {
+ Objects.requireNonNull(name, "Sampler Name is needed");
+ Objects.requireNonNull(texture, "Texture is required");
+ Objects.requireNonNull(sampler, "Sampler is required");
+ textures.put(name, ObjectObjectPair.of(texture, sampler));
+ }
+
+ @Override
+ public void clearTextures() {
+ textures.clear();
+ }
+
+ @Override
+ public void removeTexture(String name) {
+ Objects.requireNonNull(name, "Sampler Name is needed");
+ textures.remove(name);
+ }
+
+ @Override
+ public void setUniform(String name, VertexBuffer buffer) {
+ Objects.requireNonNull(name, "Uniform name is needed");
+ Objects.requireNonNull(buffer, "Vertex Buffer is required");
+ uniforms.put(name, buffer);
+ }
+
+ @Override
+ public void setIndecies(VertexBuffer buffer, IndeciesType type) {
+ indecies = Objects.requireNonNull(buffer, "Buffer is required");
+ indeciesType = Objects.requireNonNull(type, "Type is required");
+ }
+
+ @Override
+ public void clearIndecies() {
+ indecies = null;
+ indeciesType = null;
+ }
+
+ @Override
+ public void setVertexBuffer(int index, VertexBuffer buffer) {
+ if(index < 0 || index >= 4) throw new ArrayIndexOutOfBoundsException(index);
+ buffers[index] = buffer;
+ }
+
+ public void applyState() {
+
+ }
+
+ @Override
+ public void close() {
+ if(fbo == -1) return;
+ if(scissors) GL11.glDisable(GL11.GL_SCISSOR_TEST);
+ if(fbo != 0) GL45.glBindFramebuffer(GL45.GL_DRAW_FRAMEBUFFER, 0);
+ fbo = -1;
+ }
+}
diff --git a/src/graphics/java/speiger/src/coreengine/graphics/opengl/shader/ShaderCache.java b/src/graphics/java/speiger/src/coreengine/graphics/opengl/shader/ShaderCache.java
new file mode 100644
index 0000000..4c0d2ee
--- /dev/null
+++ b/src/graphics/java/speiger/src/coreengine/graphics/opengl/shader/ShaderCache.java
@@ -0,0 +1,101 @@
+package speiger.src.coreengine.graphics.opengl.shader;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Map;
+import java.util.Objects;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.internal.Streams;
+import com.google.gson.stream.JsonWriter;
+
+import speiger.src.collections.objects.maps.impl.hash.Object2ObjectOpenHashMap;
+import speiger.src.coreengine.assets.AssetLocation;
+
+public class ShaderCache {
+ public static final ShaderCache INSTANCE = new ShaderCache();
+ Map hashCache;
+ Path cache;
+
+ public void init(Path cache) {
+ this.cache = cache;
+ if(Files.notExists(cache)) {
+ try { Files.createDirectories(cache); }
+ catch(IOException e) {
+ e.printStackTrace();
+ this.cache = null;
+ }
+ }
+ try(BufferedReader reader = Files.newBufferedReader(cache.resolve("cache.json"))) {
+ Map knownCache = new Object2ObjectOpenHashMap<>();
+ for(JsonElement element : JsonParser.parseReader(reader).getAsJsonObject().getAsJsonArray("shaders")) {
+ JsonObject shader = element.getAsJsonObject();
+ knownCache.put(AssetLocation.of(shader.get("id").getAsString()), shader.get("hash").getAsString());
+ }
+ hashCache = knownCache;
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ hashCache = new Object2ObjectOpenHashMap<>();
+ }
+ }
+
+ private void save() {
+ JsonArray array = new JsonArray();
+ hashCache.forEach((K, V) -> {
+ JsonObject obj = new JsonObject();
+ obj.addProperty("id", K.toString());
+ obj.addProperty("hash", V);
+ array.add(obj);
+ });
+ try(JsonWriter writer = new JsonWriter(Files.newBufferedWriter(cache.resolve("cache.json")))) {
+ JsonObject obj = new JsonObject();
+ obj.add("shaders", array);
+ writer.setIndent("\t");
+ Streams.write(obj, writer);
+ }
+ catch(Exception e) { e.printStackTrace(); }
+ }
+
+ public byte[] get(AssetLocation shaderLocation, String fileHash) {
+ String known = hashCache.get(shaderLocation);
+ if(!Objects.equals(known, fileHash)) return null;
+ Path path = toFile(shaderLocation);
+ if(Files.notExists(path)) return null;
+ try { return Files.readAllBytes(path); }
+ catch(Exception e) { e.printStackTrace(); }
+ return null;
+ }
+
+ public void store(AssetLocation shaderLocation, String fileHash, byte[] shader) {
+ Objects.requireNonNull(shaderLocation);
+ Objects.requireNonNull(fileHash);
+ Objects.requireNonNull(shader);
+ hashCache.put(shaderLocation, fileHash);
+ try {
+ Path file = toFile(shaderLocation);
+ if(Files.notExists(file.getParent())) Files.createDirectories(file.getParent());
+ Files.write(file, shader);
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ }
+ save();
+ }
+
+ public void delete(AssetLocation shaderLocation) {
+ if(hashCache.remove(shaderLocation) == null) return;
+ try { Files.deleteIfExists(toFile(shaderLocation)); }
+ catch(Exception e) { e.printStackTrace(); }
+ save();
+ }
+
+ private Path toFile(AssetLocation id) {
+ return cache.resolve(id.domain()).resolve(id.location()+".bin");
+ }
+}
diff --git a/src/graphics/java/speiger/src/coreengine/graphics/opengl/shader/ShaderInstance.java b/src/graphics/java/speiger/src/coreengine/graphics/opengl/shader/ShaderInstance.java
new file mode 100644
index 0000000..23f9dd1
--- /dev/null
+++ b/src/graphics/java/speiger/src/coreengine/graphics/opengl/shader/ShaderInstance.java
@@ -0,0 +1,9 @@
+package speiger.src.coreengine.graphics.opengl.shader;
+
+import java.util.Map;
+
+public record ShaderInstance(int programId, Map uniforms, Map samplers) {
+
+ public record UniformObject(int slot) {}
+ public record SamplerObject(int unit) {}
+}
diff --git a/src/graphics/java/speiger/src/coreengine/graphics/opengl/texture/FrameBufferCache.java b/src/graphics/java/speiger/src/coreengine/graphics/opengl/texture/FrameBufferCache.java
new file mode 100644
index 0000000..e15d84d
--- /dev/null
+++ b/src/graphics/java/speiger/src/coreengine/graphics/opengl/texture/FrameBufferCache.java
@@ -0,0 +1,26 @@
+package speiger.src.coreengine.graphics.opengl.texture;
+
+import org.lwjgl.opengl.GL45;
+
+import speiger.src.collections.objects.maps.impl.hash.Object2IntOpenHashMap;
+import speiger.src.collections.objects.maps.interfaces.Object2IntMap;
+import speiger.src.coreengine.assets.AssetLocation;
+
+public class FrameBufferCache {
+ Object2IntMap fboCache = new Object2IntOpenHashMap<>();
+
+ public int getOrCreateFBO(AssetLocation id) {
+ return fboCache.supplyIntIfAbsent(id, GL45::glCreateFramebuffers);
+ }
+
+ public void deleteFBO(AssetLocation id) {
+ int fbo = fboCache.rem(id);
+ if(fbo == -1) return;
+ GL45.glDeleteFramebuffers(fbo);
+ }
+
+ public void clear() {
+ GL45.glDeleteFramebuffers(fboCache.values().toIntArray());
+ fboCache.clear();
+ }
+}
diff --git a/src/graphics/java/speiger/src/coreengine/graphics/opengl/texture/GLTexture.java b/src/graphics/java/speiger/src/coreengine/graphics/opengl/texture/GLTexture.java
index bdbe199..f7da30c 100644
--- a/src/graphics/java/speiger/src/coreengine/graphics/opengl/texture/GLTexture.java
+++ b/src/graphics/java/speiger/src/coreengine/graphics/opengl/texture/GLTexture.java
@@ -12,6 +12,10 @@ public class GLTexture extends Texture {
this.id = id;
}
+ public int id() {
+ return id;
+ }
+
@Override
public boolean isRemoved() {
return id == 0;
diff --git a/src/main/java/speiger/src/coreengine/NewInputTest.java b/src/main/java/speiger/src/coreengine/NewInputTest.java
index 54c08d9..9ace68e 100644
--- a/src/main/java/speiger/src/coreengine/NewInputTest.java
+++ b/src/main/java/speiger/src/coreengine/NewInputTest.java
@@ -10,7 +10,6 @@ import org.lwjgl.opengl.GL43;
import org.lwjgl.system.Configuration;
import org.lwjgl.util.freetype.FreeType;
-
import speiger.src.collections.objects.lists.ObjectArrayList;
import speiger.src.coreengine.assets.AssetLocation;
import speiger.src.coreengine.assets.AssetManager;
@@ -19,7 +18,6 @@ import speiger.src.coreengine.assets.base.IAssetProvider;
import speiger.src.coreengine.math.vector.matrix.Matrix4f;
import speiger.src.coreengine.rendering.gui.font.Font;
import speiger.src.coreengine.rendering.gui.font.FontManager;
-import speiger.src.coreengine.rendering.gui.font.TextStyle;
import speiger.src.coreengine.rendering.gui.font.glyth.Glyth;
import speiger.src.coreengine.rendering.gui.font.glyth.IGlythSheetInfo;
import speiger.src.coreengine.rendering.gui.font.glyth.MissingGlyth;
@@ -157,11 +155,11 @@ public class NewInputTest {
// });
// String s = "The Quick brown fox Jumps over the Lazy dog";
- float x = 50;
- float y = 50;
- float scale = 1F;
- y /= scale;
- TextStyle style = TextStyle.DEFAULT.size(12).bold(false);
+// float x = 50;
+// float y = 50;
+// float scale = 1F;
+// y /= scale;
+// TextStyle style = TextStyle.DEFAULT.size(12).bold(false);
// font.drawText(style, "Testing My Theory", x, y, -1, buffer, scale, true);
// float offset = font.drawText(style, "The Quick ", 50, y, -1, buffer, scale, false);
// offset += font.drawText(style, "Brown ", 50+offset, y, -1, buffer, scale, false);
@@ -169,7 +167,7 @@ public class NewInputTest {
// offset += font.drawText(style, "Jumps ", 50+offset, y, -1, buffer, scale, false);
// offset += font.drawText(style, "over the Lazy dog", 50+offset, y, -1, buffer, scale, true);
// font.drawText(s, 50, 50, -1, buffer, true);
- GLStateTracker tracker = GLStateTracker.instance();
+// GLStateTracker tracker = GLStateTracker.instance();
GL11.glClearColor(0.2F, 0.55F, 0.66F, 1F);
while(!window.shouldClose()) {
GLFW.glfwPollEvents();
@@ -215,7 +213,7 @@ public class NewInputTest {
GL11.glClearColor(0.4F, 0.55F, 0.36F, 1F);
int size = 512;
int half = size >> 1;
- int base = size >> 3;
+// int base = size >> 3;
DynamicTexture texture = new DynamicTexture(size, size, DynamicTexture.DEFAULT_PARAMETERS);
texture.fill(0, 0, size, size, -1);
diff --git a/src/main/java/speiger/src/coreengine/assets/AssetFilter.java b/src/main/java/speiger/src/coreengine/assets/AssetFilter.java
index 17889d3..ea8dadc 100644
--- a/src/main/java/speiger/src/coreengine/assets/AssetFilter.java
+++ b/src/main/java/speiger/src/coreengine/assets/AssetFilter.java
@@ -1,39 +1,39 @@
-package speiger.src.coreengine.assets;
-
-import java.util.Map;
-
-import speiger.src.coreengine.assets.base.IAsset;
-import speiger.src.coreengine.assets.base.IAssetProvider;
-import speiger.src.coreengine.assets.base.MultiAsset;
-
-public record AssetFilter(String prefix, String extension) {
- public static AssetFilter json(String prefix) {
- return new AssetFilter(prefix, ".json");
- }
-
- public AssetLocation id(AssetLocation file) {
- String location = file.location();
- return AssetLocation.of(file.domain(), location.substring(prefix().length()+1, location.length()-extension().length()));
- }
-
- public AssetLocation file(AssetLocation id) {
- return AssetLocation.of(id.domain(), prefix()+"/"+id.location()+extension());
- }
-
- public Map list(IAssetProvider provider) {
- return provider.listAssets(prefix, T -> T.endsWith(extension));
- }
-
- public Map listRoot(IAssetProvider provider) {
- return provider.listAssets(prefix, T -> T.endsWith(extension) && !T.isInFolder(prefix));
- }
-
- public Map multi(IAssetProvider provider) {
- return provider.listAllAssets(prefix, T -> T.endsWith(extension));
- }
-
- public Map multiRoot(IAssetProvider provider) {
- return provider.listAllAssets(prefix, T -> T.endsWith(extension) && !T.isInFolder(prefix));
- }
-
-}
+package speiger.src.coreengine.assets;
+
+import java.util.Map;
+
+import speiger.src.coreengine.assets.base.IAsset;
+import speiger.src.coreengine.assets.base.IAssetProvider;
+import speiger.src.coreengine.assets.base.MultiAsset;
+
+public record AssetFilter(String prefix, String extension) {
+ public static AssetFilter json(String prefix) {
+ return new AssetFilter(prefix, ".json");
+ }
+
+ public AssetLocation id(AssetLocation file) {
+ String location = file.location();
+ return AssetLocation.of(file.domain(), location.substring(prefix().length()+1, location.length()-extension().length()));
+ }
+
+ public AssetLocation file(AssetLocation id) {
+ return AssetLocation.of(id.domain(), prefix()+"/"+id.location()+extension());
+ }
+
+ public Map list(IAssetProvider provider) {
+ return provider.listAssets(prefix, T -> T.endsWith(extension));
+ }
+
+ public Map listRoot(IAssetProvider provider) {
+ return provider.listAssets(prefix, T -> T.endsWith(extension) && !T.isInFolder(prefix));
+ }
+
+ public Map multi(IAssetProvider provider) {
+ return provider.listAllAssets(prefix, T -> T.endsWith(extension));
+ }
+
+ public Map multiRoot(IAssetProvider provider) {
+ return provider.listAllAssets(prefix, T -> T.endsWith(extension) && !T.isInFolder(prefix));
+ }
+
+}
diff --git a/src/main/java/speiger/src/coreengine/assets/AssetManager.java b/src/main/java/speiger/src/coreengine/assets/AssetManager.java
index 349551e..2cb03aa 100644
--- a/src/main/java/speiger/src/coreengine/assets/AssetManager.java
+++ b/src/main/java/speiger/src/coreengine/assets/AssetManager.java
@@ -1,103 +1,103 @@
-package speiger.src.coreengine.assets;
-
-import java.nio.file.attribute.FileTime;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Executor;
-import java.util.function.Predicate;
-
-import speiger.src.collections.objects.lists.ObjectArrayList;
-import speiger.src.collections.objects.lists.ObjectList;
-import speiger.src.collections.objects.utils.ObjectLists;
-import speiger.src.coreengine.assets.base.IAsset;
-import speiger.src.coreengine.assets.base.IAssetPackage;
-import speiger.src.coreengine.assets.base.IAssetProvider.ICloseableAssetProvider;
-import speiger.src.coreengine.assets.base.IManagedAsset;
-import speiger.src.coreengine.assets.base.IReloadableAsset;
-import speiger.src.coreengine.assets.base.MultiAsset;
-import speiger.src.coreengine.assets.base.PackReloadingTask;
-import speiger.src.coreengine.assets.impl.LayeredAssetProvider;
-
-public class AssetManager implements ICloseableAssetProvider
-{
- ObjectList listeners = new ObjectArrayList<>();
- LayeredAssetProvider provider;
-
- public AssetManager(List packages) {
- provider = new LayeredAssetProvider(packages);
- }
-
- public void addListener(IReloadableAsset listener) {
- listeners.add(listener);
- if(listener instanceof IManagedAsset managed) {
- managed.setProvider(this);
- }
- }
-
- public ObjectList listeners() {
- return ObjectLists.unmodifiable(listeners);
- }
-
- public AssetManager reload(Executor offthread, Executor syncer, List packages) {
- return reloadAssets(packages).reloadSelective(offthread, syncer, listeners);
- }
-
- public AssetManager reload() {
- return reload(Runnable::run, Runnable::run);
- }
-
- public AssetManager reload(Executor offthread, Executor syncer) {
- return reloadSelective(offthread, syncer, listeners);
- }
-
- public AssetManager reloadSelective(List listeners) {
- return reloadSelective(Runnable::run, Runnable::run, listeners);
- }
-
- public AssetManager reloadSelective(Executor offthread, Executor syncer, List listeners) {
- PackReloadingTask.reload(provider, listeners, offthread, syncer).join();
- return this;
- }
-
- public AssetManager reloadAssets(List packages) {
- provider.close();
- provider = new LayeredAssetProvider(packages);
- return this;
- }
-
- @Override
- public void close() {
- provider.close();
- listeners.forEach(IReloadableAsset::destroy);
- }
-
- @Override
- public FileTime getModifiedTime(AssetLocation location) {
- return provider.getModifiedTime(location);
- }
-
- @Override
- public FileTime getLatestTime(AssetLocation... locations) {
- return provider.getLatestTime(locations);
- }
-
- @Override
- public IAsset getAsset(AssetLocation location) {
- return provider.getAsset(location);
- }
-
- @Override
- public MultiAsset getAllAssets(AssetLocation location) {
- return provider.getAllAssets(location);
- }
-
- @Override
- public Map listAssets(String folder, Predicate filter) {
- return provider.listAssets(folder, filter);
- }
-
- @Override
- public Map listAllAssets(String folder, Predicate filter) {
- return provider.listAllAssets(folder, filter);
- }
-}
+package speiger.src.coreengine.assets;
+
+import java.nio.file.attribute.FileTime;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executor;
+import java.util.function.Predicate;
+
+import speiger.src.collections.objects.lists.ObjectArrayList;
+import speiger.src.collections.objects.lists.ObjectList;
+import speiger.src.collections.objects.utils.ObjectLists;
+import speiger.src.coreengine.assets.base.IAsset;
+import speiger.src.coreengine.assets.base.IAssetPackage;
+import speiger.src.coreengine.assets.base.IAssetProvider.ICloseableAssetProvider;
+import speiger.src.coreengine.assets.base.IManagedAsset;
+import speiger.src.coreengine.assets.base.IReloadableAsset;
+import speiger.src.coreengine.assets.base.MultiAsset;
+import speiger.src.coreengine.assets.base.PackReloadingTask;
+import speiger.src.coreengine.assets.impl.LayeredAssetProvider;
+
+public class AssetManager implements ICloseableAssetProvider
+{
+ ObjectList listeners = new ObjectArrayList<>();
+ LayeredAssetProvider provider;
+
+ public AssetManager(List packages) {
+ provider = new LayeredAssetProvider(packages);
+ }
+
+ public void addListener(IReloadableAsset listener) {
+ listeners.add(listener);
+ if(listener instanceof IManagedAsset managed) {
+ managed.setProvider(this);
+ }
+ }
+
+ public ObjectList listeners() {
+ return ObjectLists.unmodifiable(listeners);
+ }
+
+ public AssetManager reload(Executor offthread, Executor syncer, List packages) {
+ return reloadAssets(packages).reloadSelective(offthread, syncer, listeners);
+ }
+
+ public AssetManager reload() {
+ return reload(Runnable::run, Runnable::run);
+ }
+
+ public AssetManager reload(Executor offthread, Executor syncer) {
+ return reloadSelective(offthread, syncer, listeners);
+ }
+
+ public AssetManager reloadSelective(List listeners) {
+ return reloadSelective(Runnable::run, Runnable::run, listeners);
+ }
+
+ public AssetManager reloadSelective(Executor offthread, Executor syncer, List listeners) {
+ PackReloadingTask.reload(provider, listeners, offthread, syncer).join();
+ return this;
+ }
+
+ public AssetManager reloadAssets(List packages) {
+ provider.close();
+ provider = new LayeredAssetProvider(packages);
+ return this;
+ }
+
+ @Override
+ public void close() {
+ provider.close();
+ listeners.forEach(IReloadableAsset::destroy);
+ }
+
+ @Override
+ public FileTime getModifiedTime(AssetLocation location) {
+ return provider.getModifiedTime(location);
+ }
+
+ @Override
+ public FileTime getLatestTime(AssetLocation... locations) {
+ return provider.getLatestTime(locations);
+ }
+
+ @Override
+ public IAsset getAsset(AssetLocation location) {
+ return provider.getAsset(location);
+ }
+
+ @Override
+ public MultiAsset getAllAssets(AssetLocation location) {
+ return provider.getAllAssets(location);
+ }
+
+ @Override
+ public Map listAssets(String folder, Predicate filter) {
+ return provider.listAssets(folder, filter);
+ }
+
+ @Override
+ public Map listAllAssets(String folder, Predicate filter) {
+ return provider.listAllAssets(folder, filter);
+ }
+}
diff --git a/src/main/java/speiger/src/coreengine/assets/base/IAsset.java b/src/main/java/speiger/src/coreengine/assets/base/IAsset.java
index dccc2b4..759700a 100644
--- a/src/main/java/speiger/src/coreengine/assets/base/IAsset.java
+++ b/src/main/java/speiger/src/coreengine/assets/base/IAsset.java
@@ -1,29 +1,29 @@
-package speiger.src.coreengine.assets.base;
-
-import java.awt.image.BufferedImage;
-import java.io.BufferedReader;
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.List;
-
-import com.google.gson.JsonObject;
-
-import speiger.src.coreengine.assets.AssetLocation;
-
-public interface IAsset extends Closeable
-{
- public IAssetPackage owner();
- public AssetLocation location();
- @Override
- public void close();
- public IAsset subAsset(String alternative);
- public InputStream stream() throws IOException;
- public ByteBuffer bytes() throws IOException;
- public BufferedReader reader() throws IOException;
- public List lines() throws IOException;
- public JsonObject json() throws IOException;
- public BufferedImage texture() throws Exception;
- public T custom(IAssetParser parser) throws IOException;
-}
+package speiger.src.coreengine.assets.base;
+
+import java.awt.image.BufferedImage;
+import java.io.BufferedReader;
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.util.List;
+
+import com.google.gson.JsonObject;
+
+import speiger.src.coreengine.assets.AssetLocation;
+
+public interface IAsset extends Closeable
+{
+ public IAssetPackage owner();
+ public AssetLocation location();
+ @Override
+ public void close();
+ public IAsset subAsset(String alternative);
+ public InputStream stream() throws IOException;
+ public ByteBuffer bytes() throws IOException;
+ public BufferedReader reader() throws IOException;
+ public List lines() throws IOException;
+ public JsonObject json() throws IOException;
+ public BufferedImage texture() throws Exception;
+ public T custom(IAssetParser parser) throws IOException;
+}
diff --git a/src/main/java/speiger/src/coreengine/assets/base/IAssetPackage.java b/src/main/java/speiger/src/coreengine/assets/base/IAssetPackage.java
index 6782d9a..5f243ca 100644
--- a/src/main/java/speiger/src/coreengine/assets/base/IAssetPackage.java
+++ b/src/main/java/speiger/src/coreengine/assets/base/IAssetPackage.java
@@ -1,31 +1,31 @@
-package speiger.src.coreengine.assets.base;
-
-import java.io.Closeable;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.attribute.FileTime;
-import java.util.List;
-import java.util.function.BiConsumer;
-
-import speiger.src.coreengine.assets.AssetLocation;
-import speiger.src.coreengine.assets.impl.FolderAssetPackage;
-import speiger.src.coreengine.assets.impl.ZipAssetPackage;
-import speiger.src.coreengine.utils.helpers.IOUtils;
-
-public interface IAssetPackage extends Closeable
-{
- @Override
- public void close();
- public void getModifiedTime(String domain, BiConsumer accept);
- public List getDomains();
- public IAsset getAsset(AssetLocation location);
- public void gatherAssets(AssetLocation folder, BiConsumer accept);
-
- public static IAssetPackage of(Path path) {
- if(Files.exists(path)) {
- if(Files.isDirectory(path)) return new FolderAssetPackage(path);
- if(IOUtils.isZip(path)) return new ZipAssetPackage(path);
- }
- return null;
- }
-}
+package speiger.src.coreengine.assets.base;
+
+import java.io.Closeable;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.attribute.FileTime;
+import java.util.List;
+import java.util.function.BiConsumer;
+
+import speiger.src.coreengine.assets.AssetLocation;
+import speiger.src.coreengine.assets.impl.FolderAssetPackage;
+import speiger.src.coreengine.assets.impl.ZipAssetPackage;
+import speiger.src.coreengine.utils.helpers.IOUtils;
+
+public interface IAssetPackage extends Closeable
+{
+ @Override
+ public void close();
+ public void getModifiedTime(String domain, BiConsumer accept);
+ public List getDomains();
+ public IAsset getAsset(AssetLocation location);
+ public void gatherAssets(AssetLocation folder, BiConsumer accept);
+
+ public static IAssetPackage of(Path path) {
+ if(Files.exists(path)) {
+ if(Files.isDirectory(path)) return new FolderAssetPackage(path);
+ if(IOUtils.isZip(path)) return new ZipAssetPackage(path);
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/speiger/src/coreengine/assets/base/IAssetProvider.java b/src/main/java/speiger/src/coreengine/assets/base/IAssetProvider.java
index 5952f49..71ae8f6 100644
--- a/src/main/java/speiger/src/coreengine/assets/base/IAssetProvider.java
+++ b/src/main/java/speiger/src/coreengine/assets/base/IAssetProvider.java
@@ -1,22 +1,22 @@
-package speiger.src.coreengine.assets.base;
-
-import java.nio.file.attribute.FileTime;
-import java.util.Map;
-import java.util.function.Predicate;
-
-import speiger.src.coreengine.assets.AssetLocation;
-
-public interface IAssetProvider {
-
- public IAsset getAsset(AssetLocation location);
- public MultiAsset getAllAssets(AssetLocation location);
- public FileTime getModifiedTime(AssetLocation location);
- public FileTime getLatestTime(AssetLocation...locations);
- public Map listAssets(String folder, Predicate filter);
- public Map listAllAssets(String folder, Predicate filter);
-
- public static interface ICloseableAssetProvider extends IAssetProvider, AutoCloseable {
- @Override
- public void close();
- }
-}
+package speiger.src.coreengine.assets.base;
+
+import java.nio.file.attribute.FileTime;
+import java.util.Map;
+import java.util.function.Predicate;
+
+import speiger.src.coreengine.assets.AssetLocation;
+
+public interface IAssetProvider {
+
+ public IAsset getAsset(AssetLocation location);
+ public MultiAsset getAllAssets(AssetLocation location);
+ public FileTime getModifiedTime(AssetLocation location);
+ public FileTime getLatestTime(AssetLocation...locations);
+ public Map listAssets(String folder, Predicate filter);
+ public Map listAllAssets(String folder, Predicate filter);
+
+ public static interface ICloseableAssetProvider extends IAssetProvider, AutoCloseable {
+ @Override
+ public void close();
+ }
+}
diff --git a/src/main/java/speiger/src/coreengine/assets/base/MultiAsset.java b/src/main/java/speiger/src/coreengine/assets/base/MultiAsset.java
index cb434ee..414291b 100644
--- a/src/main/java/speiger/src/coreengine/assets/base/MultiAsset.java
+++ b/src/main/java/speiger/src/coreengine/assets/base/MultiAsset.java
@@ -1,85 +1,85 @@
-package speiger.src.coreengine.assets.base;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.function.Consumer;
-import java.util.function.Supplier;
-
-import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
-import speiger.src.collections.objects.collections.ObjectIterable;
-import speiger.src.collections.objects.collections.ObjectIterator;
-import speiger.src.collections.objects.functions.consumer.ObjectObjectConsumer;
-import speiger.src.collections.objects.lists.ObjectArrayList;
-import speiger.src.collections.objects.lists.ObjectList;
-
-public class MultiAsset implements Closeable, ObjectIterable {
- ObjectList assets;
-
- public MultiAsset(IAsset...assets) {
- this(ObjectArrayList.wrap(assets));
- }
-
- public MultiAsset(ObjectList assets) {
- this.assets = assets.unmodifiable();
- }
-
- @Override
- public void close() {
- if(assets != null) {
- assets.forEach(IAsset::close);
- assets = null;
- }
- }
-
- public int size() {
- return assets.size();
- }
-
- public IAsset get(int index) {
- return assets.get(index);
- }
-
- public Iterable map(AssetMapper mappingFunction, Supplier defaultValue) {
- return () -> new Iterator() {
- int index = 0;
- int size = assets.size();
- @Override
- public boolean hasNext() { return index < size; }
- @Override
- public T next() {
- if(!hasNext()) throw new NoSuchElementException();
- try { return mappingFunction.apply(assets.get(index++)); }
- catch(IOException e) {
- e.printStackTrace();
- return defaultValue.get();
- }
- }
- };
- }
-
- @Override
- public void forEach(Consumer super IAsset> action) {
- assets.forEach(action);
- }
-
- @Override
- public void forEach(E input, ObjectObjectConsumer action) {
- assets.forEach(input, action);
- }
-
- @Override
- public void forEachIndexed(IntObjectConsumer action) {
- assets.forEachIndexed(action);
- }
-
- @Override
- public ObjectIterator iterator() {
- return assets.iterator();
- }
-
- public static interface AssetMapper {
- public T apply(IAsset asset) throws IOException;
- }
-}
+package speiger.src.coreengine.assets.base;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+import speiger.src.collections.ints.functions.consumer.IntObjectConsumer;
+import speiger.src.collections.objects.collections.ObjectIterable;
+import speiger.src.collections.objects.collections.ObjectIterator;
+import speiger.src.collections.objects.functions.consumer.ObjectObjectConsumer;
+import speiger.src.collections.objects.lists.ObjectArrayList;
+import speiger.src.collections.objects.lists.ObjectList;
+
+public class MultiAsset implements Closeable, ObjectIterable {
+ ObjectList assets;
+
+ public MultiAsset(IAsset...assets) {
+ this(ObjectArrayList.wrap(assets));
+ }
+
+ public MultiAsset(ObjectList assets) {
+ this.assets = assets.unmodifiable();
+ }
+
+ @Override
+ public void close() {
+ if(assets != null) {
+ assets.forEach(IAsset::close);
+ assets = null;
+ }
+ }
+
+ public int size() {
+ return assets.size();
+ }
+
+ public IAsset get(int index) {
+ return assets.get(index);
+ }
+
+ public Iterable map(AssetMapper mappingFunction, Supplier defaultValue) {
+ return () -> new Iterator() {
+ int index = 0;
+ int size = assets.size();
+ @Override
+ public boolean hasNext() { return index < size; }
+ @Override
+ public T next() {
+ if(!hasNext()) throw new NoSuchElementException();
+ try { return mappingFunction.apply(assets.get(index++)); }
+ catch(IOException e) {
+ e.printStackTrace();
+ return defaultValue.get();
+ }
+ }
+ };
+ }
+
+ @Override
+ public void forEach(Consumer super IAsset> action) {
+ assets.forEach(action);
+ }
+
+ @Override
+ public void forEach(E input, ObjectObjectConsumer action) {
+ assets.forEach(input, action);
+ }
+
+ @Override
+ public void forEachIndexed(IntObjectConsumer action) {
+ assets.forEachIndexed(action);
+ }
+
+ @Override
+ public ObjectIterator iterator() {
+ return assets.iterator();
+ }
+
+ public static interface AssetMapper {
+ public T apply(IAsset asset) throws IOException;
+ }
+}
diff --git a/src/main/java/speiger/src/coreengine/assets/impl/BaseAsset.java b/src/main/java/speiger/src/coreengine/assets/impl/BaseAsset.java
index 248ba3b..5e6dbcb 100644
--- a/src/main/java/speiger/src/coreengine/assets/impl/BaseAsset.java
+++ b/src/main/java/speiger/src/coreengine/assets/impl/BaseAsset.java
@@ -1,44 +1,44 @@
-package speiger.src.coreengine.assets.impl;
-
-import java.io.Closeable;
-import java.util.List;
-
-import speiger.src.collections.objects.lists.ObjectArrayList;
-import speiger.src.coreengine.assets.AssetLocation;
-import speiger.src.coreengine.assets.base.IAsset;
-import speiger.src.coreengine.assets.base.IAssetPackage;
-
-public abstract class BaseAsset implements IAsset {
- protected AssetLocation location;
- protected IAssetPackage owner;
- protected List closeable = new ObjectArrayList<>();
-
- public BaseAsset(AssetLocation location, IAssetPackage owner) {
- this.location = location;
- this.owner = owner;
- }
-
- @Override
- public void close() {
- for(Closeable close : closeable) {
- try { close.close(); }
- catch(Exception e) { e.printStackTrace(); }
- }
- closeable.clear();
- }
-
- protected T markClosed(T value) {
- closeable.add(value);
- return value;
- }
-
- @Override
- public AssetLocation location() {
- return location;
- }
-
- @Override
- public IAssetPackage owner() {
- return owner;
- }
-}
+package speiger.src.coreengine.assets.impl;
+
+import java.io.Closeable;
+import java.util.List;
+
+import speiger.src.collections.objects.lists.ObjectArrayList;
+import speiger.src.coreengine.assets.AssetLocation;
+import speiger.src.coreengine.assets.base.IAsset;
+import speiger.src.coreengine.assets.base.IAssetPackage;
+
+public abstract class BaseAsset implements IAsset {
+ protected AssetLocation location;
+ protected IAssetPackage owner;
+ protected List closeable = new ObjectArrayList<>();
+
+ public BaseAsset(AssetLocation location, IAssetPackage owner) {
+ this.location = location;
+ this.owner = owner;
+ }
+
+ @Override
+ public void close() {
+ for(Closeable close : closeable) {
+ try { close.close(); }
+ catch(Exception e) { e.printStackTrace(); }
+ }
+ closeable.clear();
+ }
+
+ protected T markClosed(T value) {
+ closeable.add(value);
+ return value;
+ }
+
+ @Override
+ public AssetLocation location() {
+ return location;
+ }
+
+ @Override
+ public IAssetPackage owner() {
+ return owner;
+ }
+}
diff --git a/src/main/java/speiger/src/coreengine/assets/impl/FolderAssetPackage.java b/src/main/java/speiger/src/coreengine/assets/impl/FolderAssetPackage.java
index ce0abf1..45b29e7 100644
--- a/src/main/java/speiger/src/coreengine/assets/impl/FolderAssetPackage.java
+++ b/src/main/java/speiger/src/coreengine/assets/impl/FolderAssetPackage.java
@@ -1,71 +1,71 @@
-package speiger.src.coreengine.assets.impl;
-
-import java.io.IOException;
-import java.nio.file.DirectoryStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.attribute.FileTime;
-import java.util.List;
-import java.util.function.BiConsumer;
-import java.util.stream.Stream;
-
-import speiger.src.collections.objects.lists.ObjectArrayList;
-import speiger.src.coreengine.assets.AssetLocation;
-import speiger.src.coreengine.assets.base.IAsset;
-import speiger.src.coreengine.assets.base.IAssetPackage;
-import speiger.src.coreengine.utils.collections.iterators.IterableWrapper;
-
-public class FolderAssetPackage implements IAssetPackage {
- Path baseFolder;
-
- public FolderAssetPackage(Path baseFolder) {
- this.baseFolder = baseFolder;
- }
-
- @Override
- public void close() {}
-
- @Override
- public void getModifiedTime(String domain, BiConsumer accept) {
- try {
- Path start = baseFolder.resolve("assets/").resolve(domain);
- for(Path path : IterableWrapper.wrap(Files.walk(start).filter(Files::isRegularFile).iterator())) {
- accept.accept(AssetLocation.of(domain, start.relativize(path).toString().replace("\\", "/")), Files.getLastModifiedTime(path));
- }
- }
- catch(IOException e) { e.printStackTrace(); }
- }
-
- @Override
- public List getDomains() {
- List domains = new ObjectArrayList<>();
- try(DirectoryStream dirs = Files.newDirectoryStream(baseFolder.resolve("assets"))) {
- for(Path path : dirs) {
- domains.add(path.getFileName().toString());
- }
- }
- catch(IOException e) { e.printStackTrace(); }
- return domains;
- }
-
- @Override
- public IAsset getAsset(AssetLocation location) {
- Path path = baseFolder.resolve(location.actualLocation());
- return Files.exists(path) ? new SimpleAsset(location, this, path) : null;
- }
-
- @Override
- public void gatherAssets(AssetLocation folder, BiConsumer result) {
- Path start = baseFolder.resolve(folder.actualLocation());
- if(Files.notExists(start)) return;
- try(Stream stream = Files.walk(start).filter(Files::isRegularFile)) {
- for(Path path : IterableWrapper.wrap(stream.iterator())) {
- AssetLocation location = folder.subAsset(start.relativize(path).toString().replace("\\", "/"));
- result.accept(location, new SimpleAsset(location, this, path));
- }
- }
- catch(IOException e) {
- e.printStackTrace();
- }
- }
+package speiger.src.coreengine.assets.impl;
+
+import java.io.IOException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.attribute.FileTime;
+import java.util.List;
+import java.util.function.BiConsumer;
+import java.util.stream.Stream;
+
+import speiger.src.collections.objects.lists.ObjectArrayList;
+import speiger.src.coreengine.assets.AssetLocation;
+import speiger.src.coreengine.assets.base.IAsset;
+import speiger.src.coreengine.assets.base.IAssetPackage;
+import speiger.src.coreengine.utils.collections.iterators.IterableWrapper;
+
+public class FolderAssetPackage implements IAssetPackage {
+ Path baseFolder;
+
+ public FolderAssetPackage(Path baseFolder) {
+ this.baseFolder = baseFolder;
+ }
+
+ @Override
+ public void close() {}
+
+ @Override
+ public void getModifiedTime(String domain, BiConsumer accept) {
+ try {
+ Path start = baseFolder.resolve("assets/").resolve(domain);
+ for(Path path : IterableWrapper.wrap(Files.walk(start).filter(Files::isRegularFile).iterator())) {
+ accept.accept(AssetLocation.of(domain, start.relativize(path).toString().replace("\\", "/")), Files.getLastModifiedTime(path));
+ }
+ }
+ catch(IOException e) { e.printStackTrace(); }
+ }
+
+ @Override
+ public List getDomains() {
+ List domains = new ObjectArrayList<>();
+ try(DirectoryStream dirs = Files.newDirectoryStream(baseFolder.resolve("assets"))) {
+ for(Path path : dirs) {
+ domains.add(path.getFileName().toString());
+ }
+ }
+ catch(IOException e) { e.printStackTrace(); }
+ return domains;
+ }
+
+ @Override
+ public IAsset getAsset(AssetLocation location) {
+ Path path = baseFolder.resolve(location.actualLocation());
+ return Files.exists(path) ? new SimpleAsset(location, this, path) : null;
+ }
+
+ @Override
+ public void gatherAssets(AssetLocation folder, BiConsumer result) {
+ Path start = baseFolder.resolve(folder.actualLocation());
+ if(Files.notExists(start)) return;
+ try(Stream stream = Files.walk(start).filter(Files::isRegularFile)) {
+ for(Path path : IterableWrapper.wrap(stream.iterator())) {
+ AssetLocation location = folder.subAsset(start.relativize(path).toString().replace("\\", "/"));
+ result.accept(location, new SimpleAsset(location, this, path));
+ }
+ }
+ catch(IOException e) {
+ e.printStackTrace();
+ }
+ }
}
\ No newline at end of file
diff --git a/src/main/java/speiger/src/coreengine/assets/impl/LayeredAssetProvider.java b/src/main/java/speiger/src/coreengine/assets/impl/LayeredAssetProvider.java
index b801fdd..3d7a2fd 100644
--- a/src/main/java/speiger/src/coreengine/assets/impl/LayeredAssetProvider.java
+++ b/src/main/java/speiger/src/coreengine/assets/impl/LayeredAssetProvider.java
@@ -1,161 +1,161 @@
-package speiger.src.coreengine.assets.impl;
-
-import java.nio.file.attribute.FileTime;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Predicate;
-
-import speiger.src.collections.objects.lists.ObjectArrayList;
-import speiger.src.collections.objects.lists.ObjectList;
-import speiger.src.collections.objects.maps.interfaces.Object2ObjectMap;
-import speiger.src.collections.objects.utils.maps.Object2ObjectMaps;
-import speiger.src.coreengine.assets.AssetLocation;
-import speiger.src.coreengine.assets.base.IAsset;
-import speiger.src.coreengine.assets.base.IAssetPackage;
-import speiger.src.coreengine.assets.base.IAssetProvider;
-import speiger.src.coreengine.assets.base.IAssetProvider.ICloseableAssetProvider;
-import speiger.src.coreengine.assets.base.MultiAsset;
-import speiger.src.coreengine.math.ArrayUtil;
-
-public class LayeredAssetProvider implements ICloseableAssetProvider {
- public static final FileTime DEFAULT_TIME = FileTime.fromMillis(0L);
- Map domains = Object2ObjectMap.builder().linkedMap();
- List packages;
-
- public LayeredAssetProvider(List packages) {
- this.packages = packages;
- for(IAssetPackage pack : packages) {
- for(String domain : pack.getDomains()) {
- domains.computeIfAbsent(domain, DomainAssetProvider::new).addPackage(pack);
- }
- }
- domains.values().forEach(DomainAssetProvider::buildCaches);
- }
-
- @Override
- public void close() {
- packages.forEach(IAssetPackage::close);
- }
-
- @Override
- public FileTime getModifiedTime(AssetLocation location) {
- DomainAssetProvider provider = domains.get(location.domain());
- return provider == null ? DEFAULT_TIME : provider.getModifiedTime(location);
- }
-
- @Override
- public FileTime getLatestTime(AssetLocation... locations) {
- FileTime time = DEFAULT_TIME;
- for(AssetLocation location : locations) {
- time = ArrayUtil.higher(time, getModifiedTime(location));
- }
- return time;
- }
-
- @Override
- public IAsset getAsset(AssetLocation location) {
- DomainAssetProvider provider = domains.get(location.domain());
- return provider == null ? null : provider.getAsset(location);
- }
-
- @Override
- public MultiAsset getAllAssets(AssetLocation location) {
- DomainAssetProvider provider = domains.get(location.domain());
- return provider == null ? null : provider.getAllAssets(location);
- }
-
- @Override
- public Map listAssets(String folder, Predicate filter) {
- Map result = Object2ObjectMap.builder().linkedMap();
- for(DomainAssetProvider provider : domains.values()) {
- result.putAll(provider.listAssets(folder, filter));
- }
- return result;
- }
-
- @Override
- public Map listAllAssets(String folder, Predicate filter) {
- Map result = Object2ObjectMap.builder().linkedMap();
- for(DomainAssetProvider provider : domains.values()) {
- result.putAll(provider.listAllAssets(folder, filter));
- }
- return result;
- }
-
- private static class DomainAssetProvider implements IAssetProvider {
- final String domain;
- ObjectList packages = new ObjectArrayList<>();
- Map lastChanges = Object2ObjectMap.builder().map();
-
- public DomainAssetProvider(String domain) {
- this.domain = domain;
- }
-
- public void addPackage(IAssetPackage pack) {
- packages.add(pack);
- }
-
- private void buildCaches() {
- for(int i = packages.size()-1;i>=0;i--) {
- packages.get(i).getModifiedTime(domain, lastChanges::putIfAbsent);
- }
- }
-
- @Override
- public FileTime getModifiedTime(AssetLocation location) {
- return lastChanges.getOrDefault(location, DEFAULT_TIME);
- }
-
- @Override
- public FileTime getLatestTime(AssetLocation... locations) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public IAsset getAsset(AssetLocation location) {
- for(int i = packages.size()-1;i>=0;i--) {
- IAsset asset = packages.get(i).getAsset(location);
- if(asset != null) return asset;
- }
- return null;
- }
-
- @Override
- public MultiAsset getAllAssets(AssetLocation location) {
- ObjectList result = new ObjectArrayList<>();
- for(int i = packages.size()-1;i>=0;i--) {
- IAsset asset = packages.get(i).getAsset(location);
- if(asset != null) result.add(asset);
- }
- return new MultiAsset(result);
- }
-
- @Override
- public Map listAssets(String folder, Predicate filter) {
- AssetLocation base = AssetLocation.of(domain, folder);
- Map result = Object2ObjectMap.builder().linkedMap();
- for(int i = packages.size()-1;i>=0;i--) {
- packages.get(i).gatherAssets(base, (K, V) -> {
- if(filter.test(K)) result.putIfAbsent(K, V);
- });
- }
- return result;
- }
-
- @Override
- public Map listAllAssets(String folder, Predicate filter) {
- AssetLocation base = AssetLocation.of(domain, folder);
- Object2ObjectMap> assets = Object2ObjectMap.builder().linkedMap();
- for(int i = packages.size()-1;i>=0;i--) {
- packages.get(i).gatherAssets(base, (K, V) -> {
- if(filter.test(K)) assets.supplyIfAbsent(K, ObjectArrayList::new).add(V);
- });
- }
- Map result = Object2ObjectMap.builder().linkedMap();
- for(Object2ObjectMap.Entry> entry : Object2ObjectMaps.fastIterable(assets)) {
- result.put(entry.getKey(), new MultiAsset(entry.getValue()));
- }
- return result;
- }
- }
+package speiger.src.coreengine.assets.impl;
+
+import java.nio.file.attribute.FileTime;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Predicate;
+
+import speiger.src.collections.objects.lists.ObjectArrayList;
+import speiger.src.collections.objects.lists.ObjectList;
+import speiger.src.collections.objects.maps.interfaces.Object2ObjectMap;
+import speiger.src.collections.objects.utils.maps.Object2ObjectMaps;
+import speiger.src.coreengine.assets.AssetLocation;
+import speiger.src.coreengine.assets.base.IAsset;
+import speiger.src.coreengine.assets.base.IAssetPackage;
+import speiger.src.coreengine.assets.base.IAssetProvider;
+import speiger.src.coreengine.assets.base.IAssetProvider.ICloseableAssetProvider;
+import speiger.src.coreengine.assets.base.MultiAsset;
+import speiger.src.coreengine.math.ArrayUtil;
+
+public class LayeredAssetProvider implements ICloseableAssetProvider {
+ public static final FileTime DEFAULT_TIME = FileTime.fromMillis(0L);
+ Map domains = Object2ObjectMap.builder().linkedMap();
+ List packages;
+
+ public LayeredAssetProvider(List packages) {
+ this.packages = packages;
+ for(IAssetPackage pack : packages) {
+ for(String domain : pack.getDomains()) {
+ domains.computeIfAbsent(domain, DomainAssetProvider::new).addPackage(pack);
+ }
+ }
+ domains.values().forEach(DomainAssetProvider::buildCaches);
+ }
+
+ @Override
+ public void close() {
+ packages.forEach(IAssetPackage::close);
+ }
+
+ @Override
+ public FileTime getModifiedTime(AssetLocation location) {
+ DomainAssetProvider provider = domains.get(location.domain());
+ return provider == null ? DEFAULT_TIME : provider.getModifiedTime(location);
+ }
+
+ @Override
+ public FileTime getLatestTime(AssetLocation... locations) {
+ FileTime time = DEFAULT_TIME;
+ for(AssetLocation location : locations) {
+ time = ArrayUtil.higher(time, getModifiedTime(location));
+ }
+ return time;
+ }
+
+ @Override
+ public IAsset getAsset(AssetLocation location) {
+ DomainAssetProvider provider = domains.get(location.domain());
+ return provider == null ? null : provider.getAsset(location);
+ }
+
+ @Override
+ public MultiAsset getAllAssets(AssetLocation location) {
+ DomainAssetProvider provider = domains.get(location.domain());
+ return provider == null ? null : provider.getAllAssets(location);
+ }
+
+ @Override
+ public Map listAssets(String folder, Predicate filter) {
+ Map result = Object2ObjectMap.builder().linkedMap();
+ for(DomainAssetProvider provider : domains.values()) {
+ result.putAll(provider.listAssets(folder, filter));
+ }
+ return result;
+ }
+
+ @Override
+ public Map listAllAssets(String folder, Predicate filter) {
+ Map result = Object2ObjectMap.builder().linkedMap();
+ for(DomainAssetProvider provider : domains.values()) {
+ result.putAll(provider.listAllAssets(folder, filter));
+ }
+ return result;
+ }
+
+ private static class DomainAssetProvider implements IAssetProvider {
+ final String domain;
+ ObjectList packages = new ObjectArrayList<>();
+ Map lastChanges = Object2ObjectMap.builder().map();
+
+ public DomainAssetProvider(String domain) {
+ this.domain = domain;
+ }
+
+ public void addPackage(IAssetPackage pack) {
+ packages.add(pack);
+ }
+
+ private void buildCaches() {
+ for(int i = packages.size()-1;i>=0;i--) {
+ packages.get(i).getModifiedTime(domain, lastChanges::putIfAbsent);
+ }
+ }
+
+ @Override
+ public FileTime getModifiedTime(AssetLocation location) {
+ return lastChanges.getOrDefault(location, DEFAULT_TIME);
+ }
+
+ @Override
+ public FileTime getLatestTime(AssetLocation... locations) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public IAsset getAsset(AssetLocation location) {
+ for(int i = packages.size()-1;i>=0;i--) {
+ IAsset asset = packages.get(i).getAsset(location);
+ if(asset != null) return asset;
+ }
+ return null;
+ }
+
+ @Override
+ public MultiAsset getAllAssets(AssetLocation location) {
+ ObjectList result = new ObjectArrayList<>();
+ for(int i = packages.size()-1;i>=0;i--) {
+ IAsset asset = packages.get(i).getAsset(location);
+ if(asset != null) result.add(asset);
+ }
+ return new MultiAsset(result);
+ }
+
+ @Override
+ public Map listAssets(String folder, Predicate filter) {
+ AssetLocation base = AssetLocation.of(domain, folder);
+ Map result = Object2ObjectMap.builder().linkedMap();
+ for(int i = packages.size()-1;i>=0;i--) {
+ packages.get(i).gatherAssets(base, (K, V) -> {
+ if(filter.test(K)) result.putIfAbsent(K, V);
+ });
+ }
+ return result;
+ }
+
+ @Override
+ public Map listAllAssets(String folder, Predicate filter) {
+ AssetLocation base = AssetLocation.of(domain, folder);
+ Object2ObjectMap> assets = Object2ObjectMap.builder().linkedMap();
+ for(int i = packages.size()-1;i>=0;i--) {
+ packages.get(i).gatherAssets(base, (K, V) -> {
+ if(filter.test(K)) assets.supplyIfAbsent(K, ObjectArrayList::new).add(V);
+ });
+ }
+ Map result = Object2ObjectMap.builder().linkedMap();
+ for(Object2ObjectMap.Entry> entry : Object2ObjectMaps.fastIterable(assets)) {
+ result.put(entry.getKey(), new MultiAsset(entry.getValue()));
+ }
+ return result;
+ }
+ }
}
\ No newline at end of file
diff --git a/src/main/java/speiger/src/coreengine/assets/impl/SimpleAsset.java b/src/main/java/speiger/src/coreengine/assets/impl/SimpleAsset.java
index 072a427..1e12fe6 100644
--- a/src/main/java/speiger/src/coreengine/assets/impl/SimpleAsset.java
+++ b/src/main/java/speiger/src/coreengine/assets/impl/SimpleAsset.java
@@ -1,51 +1,51 @@
-package speiger.src.coreengine.assets.impl;
-
-import java.awt.image.BufferedImage;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.List;
-
-import javax.imageio.ImageIO;
-
-import com.google.gson.JsonObject;
-
-import speiger.src.coreengine.assets.AssetLocation;
-import speiger.src.coreengine.assets.base.IAsset;
-import speiger.src.coreengine.assets.base.IAssetPackage;
-import speiger.src.coreengine.assets.base.IAssetParser;
-import speiger.src.coreengine.utils.helpers.JsonUtil;
-
-public class SimpleAsset extends BaseAsset {
- Path path;
-
- public SimpleAsset(AssetLocation location, IAssetPackage owner, Path path) {
- super(location, owner);
- this.path = path;
- }
-
- @Override
- public IAsset subAsset(String alternative) {
- Path newPath = path.resolveSibling(path.getFileName().toString()+"."+alternative);
- return Files.exists(newPath) ? new SimpleAsset(location.alternate(alternative), owner, newPath) : null;
- }
-
- @Override
- public InputStream stream() throws IOException { return markClosed(Files.newInputStream(path)); }
- @Override
- public ByteBuffer bytes() throws IOException { return ByteBuffer.wrap(Files.readAllBytes(path)); }
- @Override
- public BufferedImage texture() throws Exception { return ImageIO.read(stream()); }
- @Override
- public BufferedReader reader() throws IOException { return markClosed(Files.newBufferedReader(path)); }
- @Override
- public List lines() throws IOException { return Files.readAllLines(path); }
- @Override
- public JsonObject json() throws IOException { return JsonUtil.loadFile(path); }
- @Override
- public T custom(IAssetParser parser) throws IOException { return parser.parseAsset(path, closeable::add); }
-
-}
+package speiger.src.coreengine.assets.impl;
+
+import java.awt.image.BufferedImage;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+
+import javax.imageio.ImageIO;
+
+import com.google.gson.JsonObject;
+
+import speiger.src.coreengine.assets.AssetLocation;
+import speiger.src.coreengine.assets.base.IAsset;
+import speiger.src.coreengine.assets.base.IAssetPackage;
+import speiger.src.coreengine.assets.base.IAssetParser;
+import speiger.src.coreengine.utils.helpers.JsonUtil;
+
+public class SimpleAsset extends BaseAsset {
+ Path path;
+
+ public SimpleAsset(AssetLocation location, IAssetPackage owner, Path path) {
+ super(location, owner);
+ this.path = path;
+ }
+
+ @Override
+ public IAsset subAsset(String alternative) {
+ Path newPath = path.resolveSibling(path.getFileName().toString()+"."+alternative);
+ return Files.exists(newPath) ? new SimpleAsset(location.alternate(alternative), owner, newPath) : null;
+ }
+
+ @Override
+ public InputStream stream() throws IOException { return markClosed(Files.newInputStream(path)); }
+ @Override
+ public ByteBuffer bytes() throws IOException { return ByteBuffer.wrap(Files.readAllBytes(path)); }
+ @Override
+ public BufferedImage texture() throws Exception { return ImageIO.read(stream()); }
+ @Override
+ public BufferedReader reader() throws IOException { return markClosed(Files.newBufferedReader(path)); }
+ @Override
+ public List lines() throws IOException { return Files.readAllLines(path); }
+ @Override
+ public JsonObject json() throws IOException { return JsonUtil.loadFile(path); }
+ @Override
+ public T custom(IAssetParser parser) throws IOException { return parser.parseAsset(path, closeable::add); }
+
+}
diff --git a/src/main/java/speiger/src/coreengine/assets/impl/ZipAssetPackage.java b/src/main/java/speiger/src/coreengine/assets/impl/ZipAssetPackage.java
index c53298a..cf09b90 100644
--- a/src/main/java/speiger/src/coreengine/assets/impl/ZipAssetPackage.java
+++ b/src/main/java/speiger/src/coreengine/assets/impl/ZipAssetPackage.java
@@ -1,107 +1,107 @@
-package speiger.src.coreengine.assets.impl;
-
-import java.io.IOException;
-import java.nio.file.DirectoryStream;
-import java.nio.file.FileSystem;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.attribute.FileTime;
-import java.util.List;
-import java.util.function.BiConsumer;
-import java.util.stream.Stream;
-
-import speiger.src.collections.objects.lists.ObjectArrayList;
-import speiger.src.coreengine.assets.AssetLocation;
-import speiger.src.coreengine.assets.base.IAsset;
-import speiger.src.coreengine.assets.base.IAssetPackage;
-import speiger.src.coreengine.utils.collections.iterators.IterableWrapper;
-
-public class ZipAssetPackage implements IAssetPackage {
- Path baseFolder;
- FileSystem cache;
-
- public ZipAssetPackage(Path baseFolder) {
- this.baseFolder = baseFolder;
- }
-
- @Override
- public void close() {
- if(cache != null) {
- try { cache.close(); }
- catch(Exception e) { e.printStackTrace(); }
- cache = null;
- }
- }
-
- @Override
- public void getModifiedTime(String domain, BiConsumer accept) {
- try {
- try(FileSystem system = FileSystems.newFileSystem(baseFolder)) {
- Path start = system.getPath("assets");
- for(Path path : IterableWrapper.wrap(Files.walk(start.resolve(domain)).filter(Files::isRegularFile).iterator())) {
- accept.accept(AssetLocation.of(domain, start.relativize(path).toString().replace("\\", "/")), Files.getLastModifiedTime(path));
- }
- }
- }
- catch(IOException e) { e.printStackTrace(); }
- }
-
- protected FileSystem getReference() throws IOException {
- if(cache == null) cache = FileSystems.newFileSystem(baseFolder);
- return cache;
- }
-
- @Override
- public List getDomains() {
- List domains = new ObjectArrayList<>();
- try(FileSystem system = FileSystems.newFileSystem(baseFolder)) {
- try(DirectoryStream dirs = Files.newDirectoryStream(system.getPath("assets"))) {
- for(Path path : dirs) {
- String s = path.getFileName().toString();
- domains.add(s.substring(0, s.length()));
- }
- }
- catch(Exception e) {
- e.printStackTrace();
- }
- }
- catch(Exception e) {
- e.printStackTrace();
- }
- return domains;
- }
-
- @Override
- public IAsset getAsset(AssetLocation location) {
- try {
- Path path = getReference().getPath(location.actualLocation());
- return Files.exists(path) ? new SimpleAsset(location, this, path) : null;
- }
- catch(Exception e) {
- e.printStackTrace();
- return null;
- }
- }
-
- @Override
- public void gatherAssets(AssetLocation folder, BiConsumer result) {
- try {
- FileSystem system = getReference();
- Path start = system.getPath(folder.actualLocation());
- if(Files.notExists(start)) return;
- try(Stream stream = Files.walk(start).filter(Files::isRegularFile)) {
- for(Path path : IterableWrapper.wrap(stream.iterator())) {
- AssetLocation location = folder.subAsset(start.relativize(path).toString().replace("\\", "/"));
- result.accept(location, new SimpleAsset(location, this, path));
- }
- }
- catch(IOException e) {
- e.printStackTrace();
- }
- }
- catch(Exception e) {
- e.printStackTrace();
- }
- }
+package speiger.src.coreengine.assets.impl;
+
+import java.io.IOException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.attribute.FileTime;
+import java.util.List;
+import java.util.function.BiConsumer;
+import java.util.stream.Stream;
+
+import speiger.src.collections.objects.lists.ObjectArrayList;
+import speiger.src.coreengine.assets.AssetLocation;
+import speiger.src.coreengine.assets.base.IAsset;
+import speiger.src.coreengine.assets.base.IAssetPackage;
+import speiger.src.coreengine.utils.collections.iterators.IterableWrapper;
+
+public class ZipAssetPackage implements IAssetPackage {
+ Path baseFolder;
+ FileSystem cache;
+
+ public ZipAssetPackage(Path baseFolder) {
+ this.baseFolder = baseFolder;
+ }
+
+ @Override
+ public void close() {
+ if(cache != null) {
+ try { cache.close(); }
+ catch(Exception e) { e.printStackTrace(); }
+ cache = null;
+ }
+ }
+
+ @Override
+ public void getModifiedTime(String domain, BiConsumer accept) {
+ try {
+ try(FileSystem system = FileSystems.newFileSystem(baseFolder)) {
+ Path start = system.getPath("assets");
+ for(Path path : IterableWrapper.wrap(Files.walk(start.resolve(domain)).filter(Files::isRegularFile).iterator())) {
+ accept.accept(AssetLocation.of(domain, start.relativize(path).toString().replace("\\", "/")), Files.getLastModifiedTime(path));
+ }
+ }
+ }
+ catch(IOException e) { e.printStackTrace(); }
+ }
+
+ protected FileSystem getReference() throws IOException {
+ if(cache == null) cache = FileSystems.newFileSystem(baseFolder);
+ return cache;
+ }
+
+ @Override
+ public List getDomains() {
+ List domains = new ObjectArrayList<>();
+ try(FileSystem system = FileSystems.newFileSystem(baseFolder)) {
+ try(DirectoryStream dirs = Files.newDirectoryStream(system.getPath("assets"))) {
+ for(Path path : dirs) {
+ String s = path.getFileName().toString();
+ domains.add(s.substring(0, s.length()));
+ }
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ }
+ return domains;
+ }
+
+ @Override
+ public IAsset getAsset(AssetLocation location) {
+ try {
+ Path path = getReference().getPath(location.actualLocation());
+ return Files.exists(path) ? new SimpleAsset(location, this, path) : null;
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ @Override
+ public void gatherAssets(AssetLocation folder, BiConsumer result) {
+ try {
+ FileSystem system = getReference();
+ Path start = system.getPath(folder.actualLocation());
+ if(Files.notExists(start)) return;
+ try(Stream stream = Files.walk(start).filter(Files::isRegularFile)) {
+ for(Path path : IterableWrapper.wrap(stream.iterator())) {
+ AssetLocation location = folder.subAsset(start.relativize(path).toString().replace("\\", "/"));
+ result.accept(location, new SimpleAsset(location, this, path));
+ }
+ }
+ catch(IOException e) {
+ e.printStackTrace();
+ }
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
}
\ No newline at end of file
diff --git a/src/main/java/speiger/src/coreengine/assets/language/LanguageManager.java b/src/main/java/speiger/src/coreengine/assets/language/LanguageManager.java
index 36b5103..359b081 100644
--- a/src/main/java/speiger/src/coreengine/assets/language/LanguageManager.java
+++ b/src/main/java/speiger/src/coreengine/assets/language/LanguageManager.java
@@ -1,106 +1,106 @@
-package speiger.src.coreengine.assets.language;
-
-import java.util.Map;
-
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-
-import speiger.src.collections.objects.maps.impl.hash.Object2ObjectOpenHashMap;
-import speiger.src.collections.objects.utils.maps.Object2ObjectMaps;
-import speiger.src.coreengine.assets.AssetLocation;
-import speiger.src.coreengine.assets.AssetManager;
-import speiger.src.coreengine.assets.base.MultiAsset;
-import speiger.src.coreengine.assets.reloader.IReloadableResource;
-
-public class LanguageManager implements IReloadableResource {
- final AssetLocation location = AssetLocation.of("lang");
- Map languages = new Object2ObjectOpenHashMap<>();
- AssetManager assets;
- String currentLanguage;
-
- @Override
- public void reload() {
- languages.clear();
- try(MultiAsset langs = assets.getAllAssets(location.subAsset("langs.json"))) {
- for(int i = 0,m = langs.size();i < m;i++) {
- preLoadLanguage(langs.get(i).json());
- }
- }
- catch(Exception e) {
- e.printStackTrace();
- }
- if(loadLanguage(currentLanguage)) {
- I18n.CURRENT_LANGUAGE = languages.get(currentLanguage);
- }
- else {
- Language dummy = new Language("en_US", "English");
- dummy.load(Object2ObjectMaps.empty());
- I18n.CURRENT_LANGUAGE = dummy;
- }
- }
-
- public boolean setLanguage(String lang) {
- if(loadLanguage(lang)) {
- I18n.CURRENT_LANGUAGE = languages.get(lang);
- Language currentLang = languages.get(currentLanguage);
- currentLanguage = lang;
- if(currentLang != null) currentLang.clear();
- return true;
- }
- return false;
- }
-
- protected boolean loadLanguage(String loadingLang) {
- Language lang = languages.get(loadingLang);
- if(lang == null) return false;
- Map map = new Object2ObjectOpenHashMap<>();
- loadLanguage(loadingLang, map);
- if(loadingLang != "en_US") loadLanguage("en_US", map);
- lang.load(map);
- return true;
- }
-
- protected void loadLanguage(String lang, Map data) {
- try(MultiAsset language = assets.getAllAssets(location.subAsset(lang+".lang"))) {
- for(int i = 0,m = language.size();i < m;i++) {
- try {
- for(Map.Entry element : language.get(i).json().entrySet()) {
- loadEntry(element.getKey(), element.getValue(), data);
- }
- }
- catch(Exception e) {
- e.printStackTrace();
- }
- }
- }
- catch(Exception e) {
- e.printStackTrace();
- }
- }
-
- protected void loadEntry(String basePath, JsonElement el, Map data) {
- if(el.isJsonPrimitive()) data.putIfAbsent(basePath, el.getAsString());
- else if(el.isJsonObject()) {
- for(Map.Entry elements : el.getAsJsonObject().entrySet()) {
- String key = elements.getKey();
- if(key.isEmpty()) loadEntry(basePath, elements.getValue(), data);
- else loadEntry(basePath+"."+key, elements.getValue(), data);
- }
- }
- }
-
- protected void preLoadLanguage(JsonObject object) {
- JsonArray array = object.getAsJsonArray("languages");
- if(array == null) return;
- for(int i = 0,m = array.size();i < m;i++) {
- JsonArray subArray = array.get(i).getAsJsonArray();
- if(subArray.size() != 2) continue;
- String key = subArray.get(0).getAsString();
- String value = subArray.get(1).getAsString();
- if(key.length() != 2 || value.length() > 16) continue;
- languages.computeIfAbsent(key, T -> new Language(key, value));
- }
- }
-
-}
+package speiger.src.coreengine.assets.language;
+
+import java.util.Map;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+
+import speiger.src.collections.objects.maps.impl.hash.Object2ObjectOpenHashMap;
+import speiger.src.collections.objects.utils.maps.Object2ObjectMaps;
+import speiger.src.coreengine.assets.AssetLocation;
+import speiger.src.coreengine.assets.AssetManager;
+import speiger.src.coreengine.assets.base.MultiAsset;
+import speiger.src.coreengine.assets.reloader.IReloadableResource;
+
+public class LanguageManager implements IReloadableResource {
+ final AssetLocation location = AssetLocation.of("lang");
+ Map languages = new Object2ObjectOpenHashMap<>();
+ AssetManager assets;
+ String currentLanguage;
+
+ @Override
+ public void reload() {
+ languages.clear();
+ try(MultiAsset langs = assets.getAllAssets(location.subAsset("langs.json"))) {
+ for(int i = 0,m = langs.size();i < m;i++) {
+ preLoadLanguage(langs.get(i).json());
+ }
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ }
+ if(loadLanguage(currentLanguage)) {
+ I18n.CURRENT_LANGUAGE = languages.get(currentLanguage);
+ }
+ else {
+ Language dummy = new Language("en_US", "English");
+ dummy.load(Object2ObjectMaps.empty());
+ I18n.CURRENT_LANGUAGE = dummy;
+ }
+ }
+
+ public boolean setLanguage(String lang) {
+ if(loadLanguage(lang)) {
+ I18n.CURRENT_LANGUAGE = languages.get(lang);
+ Language currentLang = languages.get(currentLanguage);
+ currentLanguage = lang;
+ if(currentLang != null) currentLang.clear();
+ return true;
+ }
+ return false;
+ }
+
+ protected boolean loadLanguage(String loadingLang) {
+ Language lang = languages.get(loadingLang);
+ if(lang == null) return false;
+ Map map = new Object2ObjectOpenHashMap<>();
+ loadLanguage(loadingLang, map);
+ if(loadingLang != "en_US") loadLanguage("en_US", map);
+ lang.load(map);
+ return true;
+ }
+
+ protected void loadLanguage(String lang, Map data) {
+ try(MultiAsset language = assets.getAllAssets(location.subAsset(lang+".lang"))) {
+ for(int i = 0,m = language.size();i < m;i++) {
+ try {
+ for(Map.Entry element : language.get(i).json().entrySet()) {
+ loadEntry(element.getKey(), element.getValue(), data);
+ }
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ protected void loadEntry(String basePath, JsonElement el, Map data) {
+ if(el.isJsonPrimitive()) data.putIfAbsent(basePath, el.getAsString());
+ else if(el.isJsonObject()) {
+ for(Map.Entry elements : el.getAsJsonObject().entrySet()) {
+ String key = elements.getKey();
+ if(key.isEmpty()) loadEntry(basePath, elements.getValue(), data);
+ else loadEntry(basePath+"."+key, elements.getValue(), data);
+ }
+ }
+ }
+
+ protected void preLoadLanguage(JsonObject object) {
+ JsonArray array = object.getAsJsonArray("languages");
+ if(array == null) return;
+ for(int i = 0,m = array.size();i < m;i++) {
+ JsonArray subArray = array.get(i).getAsJsonArray();
+ if(subArray.size() != 2) continue;
+ String key = subArray.get(0).getAsString();
+ String value = subArray.get(1).getAsString();
+ if(key.length() != 2 || value.length() > 16) continue;
+ languages.computeIfAbsent(key, _ -> new Language(key, value));
+ }
+ }
+
+}
diff --git a/src/main/java/speiger/src/coreengine/math/vector/VectorUtil.java b/src/main/java/speiger/src/coreengine/math/vector/VectorUtil.java
deleted file mode 100644
index a6d145e..0000000
--- a/src/main/java/speiger/src/coreengine/math/vector/VectorUtil.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package speiger.src.coreengine.math.vector;
-
-import speiger.src.coreengine.math.vector.floats.Vec2f;
-import speiger.src.coreengine.math.vector.floats.Vec3f;
-
-public class VectorUtil
-{
- public static float barryCentric(Vec3f p1, Vec3f p2, Vec3f p3, Vec2f pos)
- {
- float det = (p2.z() - p3.z()) * (p1.x() - p3.x()) + (p3.x() - p2.x()) * (p1.z() - p3.z());
- float l1 = ((p2.z() - p3.z()) * (pos.x() - p3.x()) + (p3.x() - p2.x()) * (pos.y() - p3.z())) / det;
- float l2 = ((p3.z() - p1.z()) * (pos.x() - p3.x()) + (p1.x() - p3.x()) * (pos.y() - p3.z())) / det;
- float l3 = 1.0f - l1 - l2;
- return l1 * p1.y() + l2 * p2.y() + l3 * p3.y();
- }
-}
diff --git a/src/main/java/speiger/src/coreengine/math/vector/bytes/Vec2bImmutable.java b/src/main/java/speiger/src/coreengine/math/vector/bytes/Vec2bImmutable.java
deleted file mode 100644
index 7c5a3a9..0000000
--- a/src/main/java/speiger/src/coreengine/math/vector/bytes/Vec2bImmutable.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package speiger.src.coreengine.math.vector.bytes;
-
-import java.util.Objects;
-
-public class Vec2bImmutable implements Vec2b {
- final byte x;
- final byte y;
-
- public Vec2bImmutable() {
- x = 0;
- y = 0;
- }
-
- public Vec2bImmutable(byte value) {
- x = value;
- y = value;
- }
-
- public Vec2bImmutable(byte x, byte y) {
- this.x = x;
- this.y = y;
- }
-
- @Override
- public boolean isMutable() { return false; }
- @Override
- public byte x() { return x; }
- @Override
- public byte y() { return y; }
- @Override
- public Vec2b x(byte x) { return this.x == x ? this : Vec2b.of(x, y); }
- @Override
- public Vec2b y(byte y) { return this.y == y ? this : Vec2b.of(x, y); }
- @Override
- public Vec2b copy() { return Vec2b.of(this); }
- @Override
- public Vec2b set(byte x, byte y) { return this.x == x && this.y == y ? this : Vec2b.of(x, y); }
- @Override
- public int hashCode() { return Objects.hash(x, y); }
- @Override
- public boolean equals(Object obj) {
- if(obj instanceof Vec2b) {
- Vec2b vec = (Vec2b)obj;
- return vec.x() == x && vec.y() == y;
- }
- return false;
- }
-
- @Override
- public String toString() { return "Vec2b[x="+x+", y="+y+"]"; }
-}
diff --git a/src/main/java/speiger/src/coreengine/math/vector/bytes/Vec3bImmutable.java b/src/main/java/speiger/src/coreengine/math/vector/bytes/Vec3bImmutable.java
deleted file mode 100644
index 30b685a..0000000
--- a/src/main/java/speiger/src/coreengine/math/vector/bytes/Vec3bImmutable.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package speiger.src.coreengine.math.vector.bytes;
-
-import java.util.Objects;
-
-public class Vec3bImmutable implements Vec3b {
- final byte x;
- final byte y;
- final byte z;
-
- public Vec3bImmutable() {
- x = 0;
- y = 0;
- z = 0;
- }
-
- public Vec3bImmutable(byte value) {
- x = value;
- y = value;
- z = value;
- }
-
- public Vec3bImmutable(byte x, byte y, byte z) {
- this.x = x;
- this.y = y;
- this.z = z;
- }
-
- @Override
- public boolean isMutable() { return false; }
- @Override
- public byte x() { return x; }
- @Override
- public byte y() { return y; }
- @Override
- public byte z() { return z; }
- @Override
- public Vec3b x(byte x) { return this.x == x ? this : Vec3b.of(x, y, z); }
- @Override
- public Vec3b y(byte y) { return this.y == y ? this : Vec3b.of(x, y, z); }
- @Override
- public Vec3b z(byte z) { return this.z == z ? this : Vec3b.of(x, y, z); }
- @Override
- public Vec3b copy() { return Vec3b.of(this); }
- @Override
- public Vec3b set(byte x, byte y, byte z) { return this.x == x && this.y == y && this.z == z ? this : Vec3b.of(x, y, z); }
- @Override
- public int hashCode() { return Objects.hash(x, y, z); }
- @Override
- public boolean equals(Object obj) {
- if(obj instanceof Vec3b) {
- Vec3b vec = (Vec3b)obj;
- return vec.x() == x && vec.y() == y && vec.z() == z;
- }
- return false;
- }
-
- @Override
- public String toString() { return "Vec3b[x="+x+", y="+y+", z="+z+"]"; }
-}
diff --git a/src/main/java/speiger/src/coreengine/math/vector/bytes/Vec4bImmutable.java b/src/main/java/speiger/src/coreengine/math/vector/bytes/Vec4bImmutable.java
deleted file mode 100644
index c32b4ea..0000000
--- a/src/main/java/speiger/src/coreengine/math/vector/bytes/Vec4bImmutable.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package speiger.src.coreengine.math.vector.bytes;
-
-import java.util.Objects;
-
-public class Vec4bImmutable implements Vec4b {
- final byte x;
- final byte y;
- final byte z;
- final byte w;
-
- public Vec4bImmutable() {
- x = 0;
- y = 0;
- z = 0;
- w = 0;
- }
-
- public Vec4bImmutable(byte value) {
- x = value;
- y = value;
- z = value;
- w = value;
- }
-
- public Vec4bImmutable(byte x, byte y, byte z, byte w) {
- this.x = x;
- this.y = y;
- this.z = z;
- this.w = w;
- }
-
- @Override
- public boolean isMutable() { return false; }
- @Override
- public byte x() { return x; }
- @Override
- public byte y() { return y; }
- @Override
- public byte z() { return z; }
- @Override
- public byte w() { return w; }
- @Override
- public Vec4b x(byte x) { return this.x == x ? this : Vec4b.of(x, y, z, w); }
- @Override
- public Vec4b y(byte y) { return this.y == y ? this : Vec4b.of(x, y, z, w); }
- @Override
- public Vec4b z(byte z) { return this.z == z ? this : Vec4b.of(x, y, z, w); }
- @Override
- public Vec4b w(byte w) { return this.w == w ? this : Vec4b.of(x, y, z, w); }
- @Override
- public Vec4b copy() { return Vec4b.of(this); }
- @Override
- public Vec4b set(byte x, byte y, byte z, byte w) { return this.x == x && this.y == y && this.z == z && this.w == w ? this : Vec4b.of(x, y, z, w); }
- @Override
- public int hashCode() { return Objects.hash(x, y, z, w); }
-
- @Override
- public boolean equals(Object obj) {
- if(obj instanceof Vec4b) {
- Vec4b vec = (Vec4b)obj;
- return vec.x() == x && vec.y() == y && vec.z() == z && vec.w() == w;
- }
- return false;
- }
-
- @Override
- public String toString() { return "Vec4b[x="+x+", y="+y+", z="+z+", w="+w+"]"; }
-}
diff --git a/src/main/java/speiger/src/coreengine/rendering/gui/font/FontManager.java b/src/main/java/speiger/src/coreengine/rendering/gui/font/FontManager.java
index ab9649f..63f73f7 100644
--- a/src/main/java/speiger/src/coreengine/rendering/gui/font/FontManager.java
+++ b/src/main/java/speiger/src/coreengine/rendering/gui/font/FontManager.java
@@ -1,118 +1,118 @@
-package speiger.src.coreengine.rendering.gui.font;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.function.BiFunction;
-
-import com.google.gson.JsonObject;
-
-import speiger.src.collections.floats.maps.interfaces.Float2ObjectMap;
-import speiger.src.collections.objects.lists.ObjectArrayList;
-import speiger.src.collections.objects.lists.ObjectList;
-import speiger.src.collections.objects.maps.interfaces.Object2ObjectMap;
-import speiger.src.coreengine.assets.AssetFilter;
-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.base.MultiAsset;
-import speiger.src.coreengine.assets.base.SteppedReloadableAsset;
-import speiger.src.coreengine.rendering.gui.font.glyth.Glyth;
-import speiger.src.coreengine.rendering.gui.font.glyth.IGlythSheetInfo;
-import speiger.src.coreengine.rendering.gui.font.providers.FreeTypeProvider;
-import speiger.src.coreengine.rendering.gui.font.providers.IFontProvider;
-import speiger.src.coreengine.rendering.gui.font.providers.STBTrueTypeProvider;
-import speiger.src.coreengine.utils.helpers.JsonUtil;
-
-public class FontManager extends SteppedReloadableAsset