diff options
author | makamys <makamys@outlook.com> | 2022-06-03 12:29:09 +0200 |
---|---|---|
committer | makamys <makamys@outlook.com> | 2022-06-03 12:29:09 +0200 |
commit | d5b0ec39fda8bc53ecb44ff491eba6e0b096b296 (patch) | |
tree | b3f77eda80638e22b239f44e46793db247351174 | |
parent | 310007e1395cca1a0147c84fd7aa695592285be3 (diff) | |
download | Neodymium-d5b0ec39fda8bc53ecb44ff491eba6e0b096b296.tar.gz Neodymium-d5b0ec39fda8bc53ecb44ff491eba6e0b096b296.tar.bz2 Neodymium-d5b0ec39fda8bc53ecb44ff491eba6e0b096b296.zip |
Make it work with fast render
6 files changed, 37 insertions, 9 deletions
diff --git a/src/main/java/makamys/lodmod/LODMod.java b/src/main/java/makamys/lodmod/LODMod.java index d2e99ec..5c251e0 100644 --- a/src/main/java/makamys/lodmod/LODMod.java +++ b/src/main/java/makamys/lodmod/LODMod.java @@ -198,4 +198,8 @@ public class LODMod fogEventWasPosted = true; } + public static void debugHookToChunkMeshEnd() { + + } + } diff --git a/src/main/java/makamys/lodmod/ducks/ITessellator.java b/src/main/java/makamys/lodmod/ducks/ITessellator.java index 6c2cd9d..eb8f90a 100644 --- a/src/main/java/makamys/lodmod/ducks/ITessellator.java +++ b/src/main/java/makamys/lodmod/ducks/ITessellator.java @@ -4,7 +4,8 @@ import org.spongepowered.asm.mixin.Mixin; import makamys.lodmod.renderer.ChunkMesh; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.WorldRenderer; public interface ITessellator { - public ChunkMesh toChunkMesh(int pass); + public ChunkMesh toChunkMesh(int pass, WorldRenderer wr); } diff --git a/src/main/java/makamys/lodmod/mixin/MixinRenderGlobal.java b/src/main/java/makamys/lodmod/mixin/MixinRenderGlobal.java index 196e809..39b435e 100644 --- a/src/main/java/makamys/lodmod/mixin/MixinRenderGlobal.java +++ b/src/main/java/makamys/lodmod/mixin/MixinRenderGlobal.java @@ -1,16 +1,22 @@ package makamys.lodmod.mixin; +import java.nio.IntBuffer; + +import org.lwjgl.opengl.GL11; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import makamys.lodmod.LODMod; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.entity.Entity; @Mixin(RenderGlobal.class) abstract class MixinRenderGlobal { @@ -25,6 +31,14 @@ abstract class MixinRenderGlobal { } } + // for OptiFine's Fast Render option + @Redirect(method = "renderSortedRenderersFast", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glCallLists(Ljava/nio/IntBuffer;)V"), remap=false) + private void redirectRenderAllRenderLists(IntBuffer buffer) { + if(!LODMod.isActive() || (LODMod.isActive() && LODMod.renderer.renderWorld)) { + GL11.glCallLists(buffer); + } + } + @Inject(method = "renderSortedRenderers", at = @At(value = "HEAD")) public void preRenderSortedRenderers(int startRenderer, int numRenderers, int renderPass, double partialTickTime, CallbackInfoReturnable cir) { if(LODMod.isActive()) { diff --git a/src/main/java/makamys/lodmod/mixin/MixinTessellator.java b/src/main/java/makamys/lodmod/mixin/MixinTessellator.java index 12eb1ce..d791ba9 100644 --- a/src/main/java/makamys/lodmod/mixin/MixinTessellator.java +++ b/src/main/java/makamys/lodmod/mixin/MixinTessellator.java @@ -6,11 +6,13 @@ import java.util.List; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import makamys.lodmod.LODMod; import makamys.lodmod.ducks.ITessellator; import makamys.lodmod.renderer.ChunkMesh; import makamys.lodmod.renderer.MeshQuad; import makamys.lodmod.renderer.MeshQuad.QuadPlaneComparator; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.WorldRenderer; @Mixin(Tessellator.class) abstract class MixinTessellator implements ITessellator { @@ -54,7 +56,7 @@ abstract class MixinTessellator implements ITessellator { } }*/ - public ChunkMesh toChunkMesh(int pass) { + public ChunkMesh toChunkMesh(int pass, WorldRenderer wr) { if(this.vertexCount % 4 != 0) { System.out.println("Error: Vertex count is not a multiple of 4"); return null; @@ -72,8 +74,12 @@ abstract class MixinTessellator implements ITessellator { List<Byte> bVs = new ArrayList<>(); List<Integer> cs = new ArrayList<>(); + int xOffset = wr.posX; + int yOffset = wr.posY; + int zOffset = wr.posZ; + for(int quadI = 0; quadI < this.vertexCount / 4; quadI++) { - MeshQuad quad = new MeshQuad(rawBuffer, quadI * 32, new ChunkMesh.Flags(hasTexture, hasBrightness, hasColor, hasNormals)); + MeshQuad quad = new MeshQuad(rawBuffer, quadI * 32, new ChunkMesh.Flags(hasTexture, hasBrightness, hasColor, hasNormals), xOffset, yOffset, zOffset); /*if(quad.bUs[0] == quad.bUs[1] && quad.bUs[1] == quad.bUs[2] && quad.bUs[2] == quad.bUs[3] && quad.bUs[3] == quad.bVs[0] && quad.bVs[0] == quad.bVs[1] && quad.bVs[1] == quad.bVs[2] && quad.bVs[2] == quad.bVs[3] && quad.bVs[3] == 0) { quad.deleted = true; }*/ @@ -118,9 +124,11 @@ abstract class MixinTessellator implements ITessellator { totalSimplifiedQuadCount += quadCount; //System.out.println("simplified quads " + totalOriginalQuadCount + " -> " + totalSimplifiedQuadCount + " (ratio: " + ((float)totalSimplifiedQuadCount / (float)totalOriginalQuadCount) + ") totalMergeCountByPlane: " + Arrays.toString(totalMergeCountByPlane)); + LODMod.debugHookToChunkMeshEnd(); + if(quadCount > 0) { return new ChunkMesh( - (int)(-xOffset / 16), (int)(-yOffset / 16), (int)(-zOffset / 16), + (int)(xOffset / 16), (int)(yOffset / 16), (int)(zOffset / 16), new ChunkMesh.Flags(hasTexture, hasBrightness, hasColor, hasNormals), quadCount, quads, pass); } else { diff --git a/src/main/java/makamys/lodmod/mixin/MixinWorldRenderer.java b/src/main/java/makamys/lodmod/mixin/MixinWorldRenderer.java index 8e36241..eba0a5e 100644 --- a/src/main/java/makamys/lodmod/mixin/MixinWorldRenderer.java +++ b/src/main/java/makamys/lodmod/mixin/MixinWorldRenderer.java @@ -97,7 +97,7 @@ abstract class MixinWorldRenderer implements IWorldRenderer { private void prePostRenderBlocks(int pass, EntityLivingBase entity, CallbackInfo ci) { if(LODMod.isActive() && !LODMod.disableChunkMeshes) { if(chunkMeshes != null) { - chunkMeshes.add(((ITessellator)Tessellator.instance).toChunkMesh(pass)); + chunkMeshes.add(((ITessellator)Tessellator.instance).toChunkMesh(pass, WorldRenderer.class.cast(this))); } } } diff --git a/src/main/java/makamys/lodmod/renderer/MeshQuad.java b/src/main/java/makamys/lodmod/renderer/MeshQuad.java index dfd5f0d..48f0a12 100644 --- a/src/main/java/makamys/lodmod/renderer/MeshQuad.java +++ b/src/main/java/makamys/lodmod/renderer/MeshQuad.java @@ -19,6 +19,7 @@ public class MeshQuad { public int[] xs = new int[4]; public int[] ys = new int[4]; public int[] zs = new int[4]; + public int baseX = -1, baseY, baseZ; public int minX = Integer.MAX_VALUE; public int minY = Integer.MAX_VALUE; public int minZ = Integer.MAX_VALUE; @@ -56,7 +57,7 @@ public class MeshQuad { } } - public MeshQuad(int[] rawBuffer, int offset, ChunkMesh.Flags flags) { + public MeshQuad(int[] rawBuffer, int offset, ChunkMesh.Flags flags, int offsetX, int offsetY, int offsetZ) { this.offset = offset; this.flags = flags; int i = offset; @@ -89,9 +90,9 @@ public class MeshQuad { } else { spriteName = sprite.getIconName(); for(int vertexI = 0; vertexI < 4; vertexI++) { - float x = Float.intBitsToFloat(rawBuffer[i + 0]); - float y = Float.intBitsToFloat(rawBuffer[i + 1]); - float z = Float.intBitsToFloat(rawBuffer[i + 2]); + float x = Float.intBitsToFloat(rawBuffer[i + 0]) - offsetX; + float y = Float.intBitsToFloat(rawBuffer[i + 1]) - offsetY; + float z = Float.intBitsToFloat(rawBuffer[i + 2]) - offsetZ; int simpleX = (int)(x * 16); //if(simpleX == 256) simpleX = 255; |