From a9ce2eefcd8c02958699bcc302de9900b1033e9f Mon Sep 17 00:00:00 2001 From: Goby56 <60710855+Goby56@users.noreply.github.com> Date: Sat, 6 Apr 2024 13:36:52 +0200 Subject: [PATCH] LOD kinda works + f3 text f3 text only shows when debug boxes are enabled and will show how many of the wakes are renderer --- .../com/goby56/wakes/mixin/DebugHudMixin.java | 24 +++++++++++++++++++ .../wakes/render/DynamicWakeTexture.java | 10 ++++---- .../wakes/render/WakeTextureRenderer.java | 6 +++++ .../com/goby56/wakes/simulation/QuadTree.java | 8 +++++++ .../goby56/wakes/simulation/WakeHandler.java | 11 +++++++++ src/main/resources/wakes.mixins.json | 17 ++++++------- 6 files changed, 64 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/goby56/wakes/mixin/DebugHudMixin.java diff --git a/src/main/java/com/goby56/wakes/mixin/DebugHudMixin.java b/src/main/java/com/goby56/wakes/mixin/DebugHudMixin.java new file mode 100644 index 0000000..c764756 --- /dev/null +++ b/src/main/java/com/goby56/wakes/mixin/DebugHudMixin.java @@ -0,0 +1,24 @@ +package com.goby56.wakes.mixin; + +import com.goby56.wakes.WakesClient; +import com.goby56.wakes.render.WakeTextureRenderer; +import com.goby56.wakes.simulation.WakeHandler; +import net.fabricmc.fabric.api.renderer.v1.RendererAccess; +import net.minecraft.client.gui.hud.DebugHud; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.List; + +@Mixin(DebugHud.class) +public class DebugHudMixin { + + @Inject(at = @At("RETURN"), method = "getLeftText") + protected void getLeftText(CallbackInfoReturnable> info) { + if (WakesClient.CONFIG_INSTANCE.drawDebugBoxes) { + info.getReturnValue().add(String.format("[Wakes] Rendering %d/%d wake nodes", WakeTextureRenderer.nodesRendered, WakeHandler.getInstance().getTotal())); + } + } +} diff --git a/src/main/java/com/goby56/wakes/render/DynamicWakeTexture.java b/src/main/java/com/goby56/wakes/render/DynamicWakeTexture.java index ee52149..fb79ba3 100644 --- a/src/main/java/com/goby56/wakes/render/DynamicWakeTexture.java +++ b/src/main/java/com/goby56/wakes/render/DynamicWakeTexture.java @@ -42,11 +42,13 @@ private static int distToLOD(float distance) { } public void populatePixels(WakeNode node, float distance, int waterColor, float opacity) { + // TODO SAVE EACH NODE'S TEXTURE EACH TICK (HAVE THE TEXTURE READY FOR EACH FRAME) + // May decrease rendering time but will use up more memory int lod = distToLOD(distance); Texture texture = lods.get(lod); - int samples = Math.max(1, node.res / texture.res); - for (int i = 0; i < texture.res; i += samples) { - for (int j = 0; j < texture.res; j += samples) { + int samples = Math.max(1, WakeNode.res / texture.res); + for (int i = 0; i < texture.res; i++) { + for (int j = 0; j < texture.res; j++) { float avg = 0; for (int dy = 0; dy < samples; dy++) { for (int dx = 0; dx < samples; dx++) { @@ -54,7 +56,7 @@ public void populatePixels(WakeNode node, float distance, int waterColor, float } } int color = WakeColor.getColor(avg / (samples * samples), waterColor, opacity); - MemoryUtil.memPutInt(texture.imgPtr + (((i*(long)node.res)+j)*4), color); + MemoryUtil.memPutInt(texture.imgPtr + (((i*(long) texture.res)+j)*4), color); } } this.currentTexture = texture; diff --git a/src/main/java/com/goby56/wakes/render/WakeTextureRenderer.java b/src/main/java/com/goby56/wakes/render/WakeTextureRenderer.java index 9d8d96f..97baa65 100644 --- a/src/main/java/com/goby56/wakes/render/WakeTextureRenderer.java +++ b/src/main/java/com/goby56/wakes/render/WakeTextureRenderer.java @@ -13,6 +13,7 @@ import java.util.ArrayList; public class WakeTextureRenderer implements WorldRenderEvents.AfterTranslucent { + public static int nodesRendered = 0; @Override public void afterTranslucent(WorldRenderContext context) { @@ -40,6 +41,7 @@ public void afterTranslucent(WorldRenderContext context) { t1 = System.nanoTime(); + int n = 0; for (WakeNode node : nodes) { if (node.isDead()) continue; if (WakesClient.CONFIG_INSTANCE.wakeResolution.res != WakeNode.res) continue; @@ -64,11 +66,15 @@ public void afterTranslucent(WorldRenderContext context) { // TODO IMPLEMENT NODE TEXTURE RENDER CLUMPING (RENDER MULTIPLE NODES IN ONE QUAD/PASS) wakeTexture.render(matrix, x, y, z, light); + n++; + renderingTime += System.nanoTime() - t3; } RenderSystem.enableCull(); + WakeTextureRenderer.nodesRendered = n; + fullTime = System.nanoTime() - t1; // if (!nodes.isEmpty() && !MinecraftClient.getInstance().isPaused()) { // System.out.printf("Full time: %d, Memory time: %.2f, Rendering time: %.2f\n", fullTime, memoryTime / (float) fullTime, renderingTime / (float) fullTime); diff --git a/src/main/java/com/goby56/wakes/simulation/QuadTree.java b/src/main/java/com/goby56/wakes/simulation/QuadTree.java index b6dbf2a..d57578d 100644 --- a/src/main/java/com/goby56/wakes/simulation/QuadTree.java +++ b/src/main/java/com/goby56/wakes/simulation/QuadTree.java @@ -165,6 +165,14 @@ private void subdivide() { this.SE = new QuadTree<>(x + w, z + w, w, depth + 1, this.ROOT); } + public int count() { + int n = this.nodes.size(); + if (this.NE == null) { + return n; + } + return n + this.NE.count() + this.NW.count() + this.SW.count() + this.SE.count(); + } + public void prune() { this.nodes.forEach(T::markDead); this.nodes.clear(); diff --git a/src/main/java/com/goby56/wakes/simulation/WakeHandler.java b/src/main/java/com/goby56/wakes/simulation/WakeHandler.java index 5094c8f..60f484c 100644 --- a/src/main/java/com/goby56/wakes/simulation/WakeHandler.java +++ b/src/main/java/com/goby56/wakes/simulation/WakeHandler.java @@ -90,6 +90,17 @@ public ArrayList getVisible(Frustum frustum) { return foundNodes; } + public int getTotal() { + // TODO SEEMS LIKE THERE ARE DUPLICATE NODES + int n = 0; + for (int y = 0; y < this.maxY - this.minY; y++) { + if (this.trees.get(y) != null) { + n += this.trees.get(y).count(); + } + } + return n; + } + public ArrayList getNearby(int x, int y, int z) { ArrayList foundNodes = new ArrayList<>(); int i = this.getArrayIndex(y); diff --git a/src/main/resources/wakes.mixins.json b/src/main/resources/wakes.mixins.json index af8ada7..7084a9b 100644 --- a/src/main/resources/wakes.mixins.json +++ b/src/main/resources/wakes.mixins.json @@ -1,11 +1,12 @@ { - "required": true, - "package": "com.goby56.wakes.mixin", - "compatibilityLevel": "JAVA_17", - "client": [ - "WakeSpawnerMixin" - ], - "injectors": { - "defaultRequire": 1 + "required": true, + "package": "com.goby56.wakes.mixin", + "compatibilityLevel": "JAVA_17", + "client": [ + "DebugHudMixin", + "WakeSpawnerMixin" + ], + "injectors": { + "defaultRequire": 1 } } \ No newline at end of file