aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/makamys/lodmod/mixin
diff options
context:
space:
mode:
authormakamys <makamys@outlook.com>2021-05-10 15:00:09 +0200
committermakamys <makamys@outlook.com>2021-05-10 15:36:42 +0200
commitf5683b4048072b566839ef07a2b6a06da91a07bc (patch)
tree62ebc08999e1356f5f720db77f9e160778c27d07 /src/main/java/makamys/lodmod/mixin
parentc95e989d793b81530343871a6062059f18bbffdb (diff)
downloadNeodymium-f5683b4048072b566839ef07a2b6a06da91a07bc.tar.gz
Neodymium-f5683b4048072b566839ef07a2b6a06da91a07bc.tar.bz2
Neodymium-f5683b4048072b566839ef07a2b6a06da91a07bc.zip
Fix invisible chunks in OptiFine
Diffstat (limited to 'src/main/java/makamys/lodmod/mixin')
-rw-r--r--src/main/java/makamys/lodmod/mixin/MixinRenderGlobal.java17
-rw-r--r--src/main/java/makamys/lodmod/mixin/MixinWorldRenderer.java27
2 files changed, 28 insertions, 16 deletions
diff --git a/src/main/java/makamys/lodmod/mixin/MixinRenderGlobal.java b/src/main/java/makamys/lodmod/mixin/MixinRenderGlobal.java
index 0981974..196e809 100644
--- a/src/main/java/makamys/lodmod/mixin/MixinRenderGlobal.java
+++ b/src/main/java/makamys/lodmod/mixin/MixinRenderGlobal.java
@@ -1,6 +1,7 @@
package makamys.lodmod.mixin;
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.Redirect;
@@ -14,6 +15,9 @@ import net.minecraft.client.renderer.WorldRenderer;
@Mixin(RenderGlobal.class)
abstract class MixinRenderGlobal {
+ @Shadow
+ private WorldRenderer[] sortedWorldRenderers;
+
@Redirect(method = "renderSortedRenderers", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;renderAllRenderLists(ID)V"))
private void redirectRenderAllRenderLists(RenderGlobal thiz, int p1, double p2) {
if(!LODMod.isActive() || (LODMod.isActive() && LODMod.renderer.renderWorld)) {
@@ -21,21 +25,10 @@ abstract class MixinRenderGlobal {
}
}
- @Redirect(method = "renderSortedRenderers", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/WorldRenderer;getGLCallListForPass(I)I"))
- public int redirectCallList(WorldRenderer thiz, int arg) {
- int numba = thiz.getGLCallListForPass(arg);
- if(LODMod.isActive()) {
- if(numba != -1) {
- LODMod.renderer.onWorldRendererRender(thiz);
- }
- }
- return numba;
- }
-
@Inject(method = "renderSortedRenderers", at = @At(value = "HEAD"))
public void preRenderSortedRenderers(int startRenderer, int numRenderers, int renderPass, double partialTickTime, CallbackInfoReturnable cir) {
if(LODMod.isActive()) {
- LODMod.renderer.preRenderSortedRenderers(renderPass, partialTickTime);
+ LODMod.renderer.preRenderSortedRenderers(renderPass, partialTickTime, sortedWorldRenderers);
}
}
}
diff --git a/src/main/java/makamys/lodmod/mixin/MixinWorldRenderer.java b/src/main/java/makamys/lodmod/mixin/MixinWorldRenderer.java
index a3a0e60..3dc2187 100644
--- a/src/main/java/makamys/lodmod/mixin/MixinWorldRenderer.java
+++ b/src/main/java/makamys/lodmod/mixin/MixinWorldRenderer.java
@@ -45,6 +45,11 @@ abstract class MixinWorldRenderer implements IWorldRenderer {
@Shadow
private int glRenderList;
+ boolean lastDrawn;
+
+ @Shadow
+ public boolean needsUpdate;
+
public List<ChunkMesh> chunkMeshes = new ArrayList<>();
@Redirect(method = "setPosition", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/Render;renderAABB(Lnet/minecraft/util/AxisAlignedBB;)V"))
@@ -66,15 +71,21 @@ abstract class MixinWorldRenderer implements IWorldRenderer {
@Inject(method = "updateRenderer", at = @At(value = "HEAD"))
private void preUpdateRenderer(CallbackInfo ci) {
if(LODMod.isActive()) {
- chunkMeshes.clear();
+ if(needsUpdate) {
+ chunkMeshes.clear();
+ } else {
+ chunkMeshes = null;
+ }
}
}
@Inject(method = "updateRenderer", at = @At(value = "TAIL"))
private void postUpdateRenderer(CallbackInfo ci) {
if(LODMod.isActive()) {
- LODMod.renderer.onWorldRendererPost(WorldRenderer.class.cast(this));
- chunkMeshes.clear();
+ if(chunkMeshes != null) {
+ LODMod.renderer.onWorldRendererPost(WorldRenderer.class.cast(this));
+ chunkMeshes.clear();
+ }
}
}
@@ -124,7 +135,7 @@ abstract class MixinWorldRenderer implements IWorldRenderer {
@Inject(method = "setDontDraw", at = @At(value = "HEAD"))
private void preSetDontDraw(CallbackInfo ci) {
if(LODMod.isActive()) {
- LODMod.renderer.onDontDraw(WorldRenderer.class.cast(this));
+ LODMod.renderer.onWorldRendererChanged(WorldRenderer.class.cast(this), false);
}
}
@@ -132,4 +143,12 @@ abstract class MixinWorldRenderer implements IWorldRenderer {
public List<ChunkMesh> getChunkMeshes() {
return chunkMeshes;
}
+
+ public void myTick() {
+ boolean drawn = isInFrustum && (!skipRenderPass[0] || !skipRenderPass[1]);
+ if(drawn != lastDrawn) {
+ LODMod.renderer.onWorldRendererChanged(WorldRenderer.class.cast(this), drawn);
+ }
+ lastDrawn = drawn;
+ }
}