From c95e7ce20da4cf2f960cacbf550c34616aa50305 Mon Sep 17 00:00:00 2001 From: Speiger Date: Sun, 24 Apr 2022 21:55:05 +0200 Subject: [PATCH] Optimized Model loader to no longer require vertex duplication --- .../coreengine/assets/language/Language.java | 3 +- .../gui/helper/animations/Animation.java | 4 +- .../gui/helper/animations/Animator.java | 22 ++---- .../coreengine/rendering/models/DataType.java | 30 ++++--- .../rendering/models/ModelCache.java | 2 +- .../models/frameBuffer/BufferAttachment.java | 1 - .../rendering/models/loader/VertexEntry.java | 7 +- .../rendering/models/loader/VertexLoader.java | 79 ++++++++++++------- .../rendering/shader/ShaderTracker.java | 5 +- .../coreengine/utils/eventbus/Listeners.java | 10 +-- 10 files changed, 89 insertions(+), 74 deletions(-) diff --git a/src/main/java/speiger/src/coreengine/assets/language/Language.java b/src/main/java/speiger/src/coreengine/assets/language/Language.java index 4a8ac83..27870b3 100644 --- a/src/main/java/speiger/src/coreengine/assets/language/Language.java +++ b/src/main/java/speiger/src/coreengine/assets/language/Language.java @@ -33,8 +33,7 @@ public class Language public String translate(String key) { - String result = translations.get(key); - return result == null ? key : result; + return translations.getOrDefault(key, key); } public String translate(String key, Object...args) diff --git a/src/main/java/speiger/src/coreengine/rendering/gui/helper/animations/Animation.java b/src/main/java/speiger/src/coreengine/rendering/gui/helper/animations/Animation.java index 5198d4a..ad0d2e5 100644 --- a/src/main/java/speiger/src/coreengine/rendering/gui/helper/animations/Animation.java +++ b/src/main/java/speiger/src/coreengine/rendering/gui/helper/animations/Animation.java @@ -9,7 +9,7 @@ import speiger.src.coreengine.rendering.gui.helper.animations.transitions.ITrans public class Animation { - Object2ObjectMap transitions = new Object2ObjectLinkedOpenHashMap(); + Object2ObjectMap transitions = new Object2ObjectLinkedOpenHashMap<>(); AnimationListener listener; float duration = 0F; @@ -28,7 +28,7 @@ public class Animation public AnimationInstance createInstance(GuiComponent comp, AnimationInstance old, float delay, boolean reverse) { - Object2ObjectMap values = new Object2ObjectLinkedOpenHashMap(); + Object2ObjectMap values = new Object2ObjectLinkedOpenHashMap<>(); for(Object2ObjectMap.Entry entry : Object2ObjectMaps.fastIterable(transitions)) { AnimationTarget target = entry.getKey(); diff --git a/src/main/java/speiger/src/coreengine/rendering/gui/helper/animations/Animator.java b/src/main/java/speiger/src/coreengine/rendering/gui/helper/animations/Animator.java index 27f278d..a2b3808 100644 --- a/src/main/java/speiger/src/coreengine/rendering/gui/helper/animations/Animator.java +++ b/src/main/java/speiger/src/coreengine/rendering/gui/helper/animations/Animator.java @@ -46,12 +46,9 @@ public class Animator public void update(float particalTicks) { - if(listeners.size() > 0) + for(int i = 0,m=listeners.size();i data, int offset, int size) + public void putIntoBuffer(ByteBuffer buffer, JsonList list, int offset, int stride, int size) { - for(int i = 0;i entries, boolean excludeOptional) { - List numbers = parseVertexData(obj, entries, excludeOptional); - ByteBuffer buffer = ByteBuffer.allocate(vertexCount * VertexEntry.caculateByteSize(entries, excludeOptional)).order(ByteOrder.nativeOrder()); - for(int i = 0,offset=0,m=vertexCount*entries.size();i parseVertexData(JsonObject obj, List entries, boolean excludeOptional) - { + int byteStride = VertexEntry.caculateByteSize(entries, excludeOptional); + JsonArray vertexes = obj.getAsJsonArray("vertexes"); + ByteBuffer buffer = ByteBuffer.allocate(vertexCount * byteStride).order(ByteOrder.nativeOrder()); int stride = VertexEntry.caclulateStride(entries); - int outStride = excludeOptional ? VertexEntry.calculateNonOptionalStride(entries) : stride; - int[] vertexes = JsonUtil.parseIntArray(obj.getAsJsonArray("vertexes")); - Number[] data = new Number[excludeOptional ? (vertexes.length / stride) * outStride : vertexes.length]; - for(int i = 0,inOff=0,outOff=0,m=entries.size();i> parseMappedVertexData(JsonObject obj, List entries, boolean excludeOptional) @@ -66,14 +54,6 @@ public class VertexLoader return mappedData; } - public static void deserializeIndecies(int[] indecies, T[] in, int size, int stride, int offset, T[] out, int outStride, int outOffset) - { - for(int i = 0,m=(indecies.length/stride)*size;i List deserializeIndecies(int[] indecies, T[] in, int size, int stride, int offset) { List out = new ObjectArrayList<>(); @@ -83,4 +63,43 @@ public class VertexLoader } return out; } + + public static interface JsonList + { + public JsonElement get(int index); + public int size(); + } + + private static class JsonWrapper implements JsonList + { + JsonArray array; + JsonArray vertexes; + int offset; + int size; + int stride; + int max; + + public JsonWrapper(JsonArray vertexes, JsonArray array, int offset, int stride, int size, int max) + { + this.array = array; + this.vertexes = vertexes; + this.offset = offset; + this.size = size; + this.stride = stride; + this.max = max; + } + + @Override + public int size() + { + return max; + } + + @Override + public JsonElement get(int index) + { + return array.get(vertexes.get(offset + ((index/size) * stride) + (index % size)).getAsInt()); + } + + } } diff --git a/src/main/java/speiger/src/coreengine/rendering/shader/ShaderTracker.java b/src/main/java/speiger/src/coreengine/rendering/shader/ShaderTracker.java index eeb8d6d..95ccb76 100644 --- a/src/main/java/speiger/src/coreengine/rendering/shader/ShaderTracker.java +++ b/src/main/java/speiger/src/coreengine/rendering/shader/ShaderTracker.java @@ -13,7 +13,7 @@ import speiger.src.coreengine.assets.reloader.IReloadableResource; public class ShaderTracker implements IReloadableResource { public static final ShaderTracker INSTANCE = new ShaderTracker(); - List> programs = new ObjectArrayList>(); + List> programs = new ObjectArrayList<>(); int activeShader = 0; boolean reloading = false; AssetManager assets; @@ -27,8 +27,7 @@ public class ShaderTracker implements IReloadableResource { T result = creator.get(); result.init(); - ReloadReference reference = new ReloadReference<>(result, creator, reloader); - programs.add(reference); + programs.add(new ReloadReference<>(result, creator, reloader)); return result; } diff --git a/src/main/java/speiger/src/coreengine/utils/eventbus/Listeners.java b/src/main/java/speiger/src/coreengine/utils/eventbus/Listeners.java index 4f343b4..52ac58e 100644 --- a/src/main/java/speiger/src/coreengine/utils/eventbus/Listeners.java +++ b/src/main/java/speiger/src/coreengine/utils/eventbus/Listeners.java @@ -19,7 +19,7 @@ public class Listeners { for(int i = 0;i>(); + unsortedListeners[i] = new ObjectLinkedOpenHashSet<>(); } } @@ -46,18 +46,13 @@ public class Listeners public void removeListeners(Consumer listener) { - boolean found = false; for(int i = 0,m=unsortedListeners.length;i> events) @@ -77,6 +72,7 @@ public class Listeners private void markDirty() { + if(rebuild) return; rebuild = true; if(childs != null) {