]> git.lizzy.rs Git - LightOverlay.git/commitdiff
1.16.2 Forge + frustum calculations
authorshedaniel <daniel@shedaniel.me>
Fri, 14 Aug 2020 17:11:52 +0000 (01:11 +0800)
committershedaniel <daniel@shedaniel.me>
Fri, 14 Aug 2020 17:11:52 +0000 (01:11 +0800)
Signed-off-by: shedaniel <daniel@shedaniel.me>
16 files changed:
build.gradle
fabric/build.gradle
fabric/src/main/java/me/shedaniel/lightoverlay/fabric/FrustumHelper.java [new file with mode: 0644]
fabric/src/main/java/me/shedaniel/lightoverlay/fabric/LightOverlay.java
fabric/src/main/java/me/shedaniel/lightoverlay/fabric/mixin/MixinWorldRenderer.java [new file with mode: 0644]
fabric/src/main/resources/lightoverlay.accesswidener
fabric/src/main/resources/lightoverlay.mixins.json
forge/build.gradle
forge/src/main/java/me/shedaniel/lightoverlay/forge/FrustumHelper.java [new file with mode: 0644]
forge/src/main/java/me/shedaniel/lightoverlay/forge/LightOverlayClient.java
forge/src/main/java/me/shedaniel/lightoverlay/forge/LightOverlayCloth.java
forge/src/main/resources/META-INF/WorldRenderer.js
forge/src/main/resources/META-INF/accesstransformer.cfg [new file with mode: 0644]
forge/src/main/resources/META-INF/mods.toml
gradle.properties
settings.gradle

index 6d70caeacade1917128c60b22abb154337700e08..a87cca45e3bab40838335babfec0afd6b4e77789 100644 (file)
@@ -47,14 +47,14 @@ idea.project.settings {
             project = rootProject.project(":fabric")
             taskNames = Collections.singletonList("runServer")
         }
-//        "Forge: Minecraft Client"(org.jetbrains.gradle.ext.Gradle) {
-//            project = rootProject.project(":forge")
-//            taskNames = Collections.singletonList("runClient")
-//        }
-//        "Forge: Minecraft Server"(org.jetbrains.gradle.ext.Gradle) {
-//            project = rootProject.project(":forge")
-//            taskNames = Collections.singletonList("runServer")
-//        }
+        "Forge: Minecraft Client"(org.jetbrains.gradle.ext.Gradle) {
+            project = rootProject.project(":forge")
+            taskNames = Collections.singletonList("runClient")
+        }
+        "Forge: Minecraft Server"(org.jetbrains.gradle.ext.Gradle) {
+            project = rootProject.project(":forge")
+            taskNames = Collections.singletonList("runServer")
+        }
     }
 }
 
index d85007da73b16f007f918b2db8ee956d3f083faa..6cd73c20de7617dc0800015279cce0a3c8ecbe82 100755 (executable)
@@ -1,5 +1,5 @@
 plugins {
-    id("fabric-loom") version "0.5-SNAPSHOT"
+    id("fabric-loom") version "0.4-SNAPSHOT"
 }
 
 minecraft {
diff --git a/fabric/src/main/java/me/shedaniel/lightoverlay/fabric/FrustumHelper.java b/fabric/src/main/java/me/shedaniel/lightoverlay/fabric/FrustumHelper.java
new file mode 100644 (file)
index 0000000..278ff84
--- /dev/null
@@ -0,0 +1,31 @@
+package me.shedaniel.lightoverlay.fabric;
+
+import net.minecraft.client.render.Frustum;
+import net.minecraft.client.util.math.Vector4f;
+
+public class FrustumHelper {
+    public static boolean isVisible(Frustum frustum, double minX, double minY, double minZ, double maxX, double maxY, double maxZ) {
+        float x1 = (float) (minX - frustum.x);
+        float y1 = (float) (minY - frustum.y);
+        float z1 = (float) (minZ - frustum.z);
+        float x2 = (float) (maxX - frustum.x);
+        float y2 = (float) (maxY - frustum.y);
+        float z2 = (float) (maxZ - frustum.z);
+        return isAnyCornerVisible(frustum, x1, y1, z1, x2, y2, z2);
+    }
+    
+    private static boolean isAnyCornerVisible(Frustum frustum, float x1, float y1, float z1, float x2, float y2, float z2) {
+        Vector4f[] homogeneousCoordinates = frustum.homogeneousCoordinates;
+        for (Vector4f vector4f : homogeneousCoordinates) {
+            if (dotProduct(vector4f, x1, y1, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y1, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x1, y2, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y2, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x1, y1, z2, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y1, z2, 1.0F) <= 0.0F && dotProduct(vector4f, x1, y2, z2, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y2, z2, 1.0F) <= 0.0F) {
+                return false;
+            }
+        }
+        
+        return true;
+    }
+    
+    private static float dotProduct(Vector4f self, float x, float y, float z, float w) {
+        return self.getX() * x + self.getY() * y + self.getZ() * z + self.getW() * w;
+    }
+}
index dc273c996caf119f9fb641be1c22cd97ed80ba5b..86affd0dbb8c2013b733b2dd5afaa22b0db2e642 100644 (file)
@@ -18,6 +18,7 @@ import net.minecraft.client.font.TextRenderer;
 import net.minecraft.client.network.ClientPlayerEntity;
 import net.minecraft.client.options.KeyBinding;
 import net.minecraft.client.render.Camera;
+import net.minecraft.client.render.Frustum;
 import net.minecraft.client.render.Tessellator;
 import net.minecraft.client.render.VertexConsumerProvider;
 import net.minecraft.client.util.InputUtil;
@@ -47,7 +48,10 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.text.DecimalFormat;
-import java.util.*;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadPoolExecutor;
 
@@ -72,6 +76,7 @@ public class LightOverlay implements ClientModInitializer {
     private static boolean enabled = false;
     private static EntityType<Entity> testingEntityType;
     private static int threadNumber = 0;
+    public static Frustum frustum;
     private static final ThreadPoolExecutor EXECUTOR = (ThreadPoolExecutor) Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), r -> {
         Thread thread = new Thread(r, "light-overlay-" + threadNumber++);
         thread.setDaemon(true);
@@ -437,6 +442,7 @@ public class LightOverlay implements ClientModInitializer {
                     RenderSystem.enableTexture();
                     RenderSystem.depthMask(true);
                     BlockPos.Mutable mutable = new BlockPos.Mutable();
+                    BlockPos.Mutable downMutable = new BlockPos.Mutable();
                     for (Map.Entry<ChunkPos, Long2ReferenceMap<Object>> entry : CHUNK_MAP.entrySet()) {
                         if (caching && (MathHelper.abs(entry.getKey().x - playerPosX) > getChunkRange() || MathHelper.abs(entry.getKey().z - playerPosZ) > getChunkRange())) {
                             continue;
@@ -445,8 +451,10 @@ public class LightOverlay implements ClientModInitializer {
                             if (objectEntry.getValue() instanceof Integer) {
                                 mutable.set(BlockPos.unpackLongX(objectEntry.getLongKey()), BlockPos.unpackLongY(objectEntry.getLongKey()), BlockPos.unpackLongZ(objectEntry.getLongKey()));
                                 if (mutable.isWithinDistance(playerPos, reach)) {
-                                    BlockPos down = mutable.down();
-                                    LightOverlay.renderLevel(CLIENT, camera, world, mutable, down, (Integer) objectEntry.getValue(), entityContext);
+                                    if (frustum == null || FrustumHelper.isVisible(frustum, mutable.getX(), mutable.getY(), mutable.getZ(), mutable.getX() + 1, mutable.getX() + 1, mutable.getX() + 1)) {
+                                        downMutable.set(mutable.getX(), mutable.getY() - 1, mutable.getZ());
+                                        LightOverlay.renderLevel(CLIENT, camera, world, mutable, downMutable, (Integer) objectEntry.getValue(), entityContext);
+                                    }
                                 }
                             }
                         }
@@ -469,8 +477,10 @@ public class LightOverlay implements ClientModInitializer {
                             if (objectEntry.getValue() instanceof CrossType) {
                                 mutable.set(BlockPos.unpackLongX(objectEntry.getLongKey()), BlockPos.unpackLongY(objectEntry.getLongKey()), BlockPos.unpackLongZ(objectEntry.getLongKey()));
                                 if (mutable.isWithinDistance(playerPos, reach)) {
-                                    int color = objectEntry.getValue() == CrossType.RED ? redColor : objectEntry.getValue() == CrossType.YELLOW ? yellowColor : secondaryColor;
-                                    LightOverlay.renderCross(camera, world, mutable, color, entityContext);
+                                    if (frustum == null || FrustumHelper.isVisible(frustum, mutable.getX(), mutable.getY(), mutable.getZ(), mutable.getX() + 1, mutable.getX() + 1, mutable.getX() + 1)) {
+                                        int color = objectEntry.getValue() == CrossType.RED ? redColor : objectEntry.getValue() == CrossType.YELLOW ? yellowColor : secondaryColor;
+                                        LightOverlay.renderCross(camera, world, mutable, color, entityContext);
+                                    }
                                 }
                             }
                         }
diff --git a/fabric/src/main/java/me/shedaniel/lightoverlay/fabric/mixin/MixinWorldRenderer.java b/fabric/src/main/java/me/shedaniel/lightoverlay/fabric/mixin/MixinWorldRenderer.java
new file mode 100644 (file)
index 0000000..4c0b271
--- /dev/null
@@ -0,0 +1,18 @@
+package me.shedaniel.lightoverlay.fabric.mixin;
+
+import me.shedaniel.lightoverlay.fabric.LightOverlay;
+import net.minecraft.client.render.Camera;
+import net.minecraft.client.render.Frustum;
+import net.minecraft.client.render.WorldRenderer;
+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.CallbackInfo;
+
+@Mixin(WorldRenderer.class)
+public class MixinWorldRenderer {
+    @Inject(method = "setupTerrain", at = @At("HEAD"))
+    private void setupTerrain(Camera camera, Frustum frustum, boolean hasForcedFrustum, int frame, boolean spectator, CallbackInfo ci) {
+        LightOverlay.frustum = frustum;
+    }
+}
index 860a467cf2e7f6a909c7fa08df722ca5a20bd33b..5339db9f2abbdece5807f534f377a8ee3a0c850d 100644 (file)
@@ -1,2 +1,6 @@
 accessWidener  v1  named
-accessible  field  net/minecraft/network/packet/s2c/play/ChunkDeltaUpdateS2CPacket sectionPos Lnet/minecraft/util/math/ChunkSectionPos;
\ No newline at end of file
+accessible field net/minecraft/network/packet/s2c/play/ChunkDeltaUpdateS2CPacket sectionPos Lnet/minecraft/util/math/ChunkSectionPos;
+accessible field net/minecraft/client/render/Frustum x D
+accessible field net/minecraft/client/render/Frustum y D
+accessible field net/minecraft/client/render/Frustum z D
+accessible field net/minecraft/client/render/Frustum homogeneousCoordinates [Lnet/minecraft/client/util/math/Vector4f;
\ No newline at end of file
index cb0c3f1f58b90e87e9476f4f0d1a3d6d2bf7b86e..7b63a7bd750ad216a625907435d5ecfc7dbff33d 100644 (file)
@@ -5,7 +5,8 @@
   "compatibilityLevel": "JAVA_8",
   "mixins": [],
   "client": [
-    "MixinClientConnection"
+    "MixinClientConnection",
+    "MixinWorldRenderer"
   ],
   "injectors": {
     "defaultRequire": 1
index 829a4d1ed9022841ceef6fbf08e4b16cbd4c6072..655e58715ee6fad47fbe041e447893571876cdaa 100644 (file)
@@ -14,6 +14,7 @@ apply plugin: "eclipse"
 
 minecraft {
     mappings(channel: "snapshot", version: rootProject.mcp_snapshot)
+    accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')
     runs {
         client {
             workingDirectory project.file("run")
diff --git a/forge/src/main/java/me/shedaniel/lightoverlay/forge/FrustumHelper.java b/forge/src/main/java/me/shedaniel/lightoverlay/forge/FrustumHelper.java
new file mode 100644 (file)
index 0000000..918b4b2
--- /dev/null
@@ -0,0 +1,31 @@
+package me.shedaniel.lightoverlay.forge;
+
+import net.minecraft.client.renderer.culling.ClippingHelper;
+import net.minecraft.util.math.vector.Vector4f;
+
+public class FrustumHelper {
+    public static boolean isVisible(ClippingHelper frustum, double minX, double minY, double minZ, double maxX, double maxY, double maxZ) {
+        float x1 = (float) (minX - frustum.cameraX);
+        float y1 = (float) (minY - frustum.cameraY);
+        float z1 = (float) (minZ - frustum.cameraZ);
+        float x2 = (float) (maxX - frustum.cameraX);
+        float y2 = (float) (maxY - frustum.cameraY);
+        float z2 = (float) (maxZ - frustum.cameraZ);
+        return isAnyCornerVisible(frustum, x1, y1, z1, x2, y2, z2);
+    }
+    
+    private static boolean isAnyCornerVisible(ClippingHelper frustum, float x1, float y1, float z1, float x2, float y2, float z2) {
+        Vector4f[] homogeneousCoordinates = frustum.frustum;
+        for (Vector4f vector4f : homogeneousCoordinates) {
+            if (dotProduct(vector4f, x1, y1, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y1, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x1, y2, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y2, z1, 1.0F) <= 0.0F && dotProduct(vector4f, x1, y1, z2, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y1, z2, 1.0F) <= 0.0F && dotProduct(vector4f, x1, y2, z2, 1.0F) <= 0.0F && dotProduct(vector4f, x2, y2, z2, 1.0F) <= 0.0F) {
+                return false;
+            }
+        }
+        
+        return true;
+    }
+    
+    private static float dotProduct(Vector4f self, float x, float y, float z, float w) {
+        return self.getX() * x + self.getY() * y + self.getZ() * z + self.getW() * w;
+    }
+}
index dc65b188e97104f73f33e9cc05df9f7e62e495de..1ff0c8a3108bbe14603d07ee53a55c131962d0b2 100644 (file)
@@ -4,6 +4,8 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.mojang.blaze3d.platform.GlStateManager;
 import com.mojang.blaze3d.systems.RenderSystem;
+import it.unimi.dsi.fastutil.longs.Long2ReferenceMap;
+import it.unimi.dsi.fastutil.longs.Long2ReferenceOpenHashMap;
 import net.minecraft.block.Block;
 import net.minecraft.block.BlockState;
 import net.minecraft.client.Minecraft;
@@ -12,6 +14,7 @@ import net.minecraft.client.gui.FontRenderer;
 import net.minecraft.client.renderer.ActiveRenderInfo;
 import net.minecraft.client.renderer.IRenderTypeBuffer;
 import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.culling.ClippingHelper;
 import net.minecraft.client.settings.KeyBinding;
 import net.minecraft.client.util.InputMappings;
 import net.minecraft.client.world.ClientWorld;
@@ -36,7 +39,7 @@ import net.minecraft.util.math.vector.Vector3d;
 import net.minecraft.world.IBlockReader;
 import net.minecraft.world.LightType;
 import net.minecraft.world.World;
-import net.minecraft.world.biome.Biome;
+import net.minecraft.world.biome.MobSpawnInfo;
 import net.minecraft.world.chunk.Chunk;
 import net.minecraft.world.chunk.ChunkStatus;
 import net.minecraft.world.lighting.IWorldLightListener;
@@ -49,7 +52,6 @@ import net.minecraftforge.event.TickEvent;
 import net.minecraftforge.eventbus.api.SubscribeEvent;
 import net.minecraftforge.fml.DistExecutor;
 import net.minecraftforge.fml.client.registry.ClientRegistry;
-import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
 import org.apache.logging.log4j.LogManager;
 import org.lwjgl.opengl.GL11;
 
@@ -58,7 +60,10 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.text.DecimalFormat;
-import java.util.*;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
@@ -82,13 +87,14 @@ public class LightOverlayClient {
     private static boolean enabled = false;
     private static EntityType<Entity> testingEntityType;
     private static int threadNumber = 0;
+    public static ClippingHelper frustum;
     private static final ExecutorService EXECUTOR = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), r -> {
         Thread thread = new Thread(r, "light-overlay-" + threadNumber++);
         thread.setDaemon(true);
         return thread;
     });
     private static final List<ChunkPos> POS = Lists.newCopyOnWriteArrayList();
-    private static final Map<ChunkPos, Map<Long, Object>> CHUNK_MAP = Maps.newConcurrentMap();
+    private static final Map<ChunkPos, Long2ReferenceMap<Object>> CHUNK_MAP = Maps.newConcurrentMap();
     private static long ticks = 0;
     
     static {
@@ -238,21 +244,21 @@ public class LightOverlayClient {
                         CHUNK_MAP.clear();
                         ClientPlayerEntity player = minecraft.player;
                         ClientWorld world = minecraft.world;
-                        BlockPos playerPos = player.func_233580_cy_();
+                        BlockPos playerPos = player.getPosition();
                         ISelectionContext entityContext = ISelectionContext.forEntity(player);
                         IWorldLightListener block = world.getLightManager().getLightEngine(LightType.BLOCK);
                         IWorldLightListener sky = showNumber ? null : world.getLightManager().getLightEngine(LightType.SKY);
                         BlockPos.Mutable downPos = new BlockPos.Mutable();
                         Iterable<BlockPos> iterate = BlockPos.getAllInBoxMutable(playerPos.getX() - reach, playerPos.getY() - reach, playerPos.getZ() - reach,
                                 playerPos.getX() + reach, playerPos.getY() + reach, playerPos.getZ() + reach);
-                        HashMap<Long, Object> map = Maps.newHashMap();
+                        Long2ReferenceMap<Object> map = new Long2ReferenceOpenHashMap<>();
                         CHUNK_MAP.put(new ChunkPos(0, 0), map);
                         for (BlockPos blockPos : iterate) {
                             downPos.setPos(blockPos.getX(), blockPos.getY() - 1, blockPos.getZ());
                             if (showNumber) {
                                 int level = getCrossLevel(blockPos, downPos, world, block, entityContext);
                                 if (level >= 0) {
-                                    map.put(blockPos.toLong(), level);
+                                    map.put(blockPos.toLong(), Integer.valueOf(level));
                                 }
                             } else {
                                 CrossType type = getCrossType(blockPos, downPos, world, block, sky, entityContext);
@@ -277,28 +283,29 @@ public class LightOverlayClient {
                                 }
                             }
                         }
-                        if (!POS.isEmpty()) {
-                            if (playerPos[0] == null) {
-                                playerPos[0] = player.getPositionVec();
-                            }
-                            ChunkPos pos = POS.stream().min(Comparator.comparingDouble(value -> value.getBlock(8, 0, 8).distanceSq(playerPos[0].x, 0, playerPos[0].z, false))).get();
-                            EXECUTOR.submit(() -> {
-                                if (MathHelper.abs(pos.x - playerPosX) <= getChunkRange() && MathHelper.abs(pos.z - playerPosZ) <= getChunkRange()) {
-                                    calculateChunk(world.getChunkProvider().getChunk(pos.x, pos.z, ChunkStatus.FULL, false), world, pos, selectionContext);
-                                } else {
-                                    CHUNK_MAP.remove(pos);
+                        POS.removeIf(pos -> MathHelper.abs(pos.x - playerPosX) > getChunkRange() || MathHelper.abs(pos.z - playerPosZ) > getChunkRange());
+                        for (int k = 0; k < 2; k++) {
+                            if (!POS.isEmpty()) {
+                                if (playerPos[0] == null) {
+                                    playerPos[0] = player.getPositionVec();
                                 }
-                            });
-                            POS.remove(pos);
+                                ChunkPos pos = POS.stream().min(Comparator.comparingDouble(value -> {
+                                    int i = Math.abs(value.x - playerPosX);
+                                    int j = Math.abs(value.z - playerPosZ);
+                                    return i * i + j * j;
+                                })).get();
+                                POS.remove(pos);
+                                EXECUTOR.submit(() -> {
+                                    try {
+                                        calculateChunk(world.getChunkProvider().getChunk(pos.x, pos.z, ChunkStatus.FULL, false), world, pos, selectionContext);
+                                    } catch (Throwable throwable) {
+                                        LogManager.getLogger().throwing(throwable);
+                                    }
+                                });
+                            }
                         }
                         if (ticks % 50 == 0) {
-                            Iterator<Map.Entry<ChunkPos, Map<Long, Object>>> chunkMapIterator = CHUNK_MAP.entrySet().iterator();
-                            while (chunkMapIterator.hasNext()) {
-                                Map.Entry<ChunkPos, Map<Long, Object>> pos = chunkMapIterator.next();
-                                if (MathHelper.abs(pos.getKey().x - playerPosX) > getChunkRange() * 2 || MathHelper.abs(pos.getKey().z - playerPosZ) > getChunkRange() * 2) {
-                                    chunkMapIterator.remove();
-                                }
-                            }
+                            CHUNK_MAP.entrySet().removeIf(pos -> MathHelper.abs(pos.getKey().x - playerPosX) > getChunkRange() * 2 || MathHelper.abs(pos.getKey().z - playerPosZ) > getChunkRange() * 2);
                         }
                     }
                 }
@@ -308,9 +315,13 @@ public class LightOverlayClient {
         }
     }
     
+    public static void updateFrustum(ClippingHelper helper) {
+        frustum = helper;
+    }
+    
     private static void calculateChunk(Chunk chunk, World world, ChunkPos chunkPos, ISelectionContext selectionContext) {
-        Map<Long, Object> map = Maps.newHashMap();
-        if (chunk != null) {
+        if (world != null && chunk != null) {
+            Long2ReferenceMap<Object> map = new Long2ReferenceOpenHashMap<>();
             IWorldLightListener block = chunk.getWorldLightManager().getLightEngine(LightType.BLOCK);
             IWorldLightListener sky = showNumber ? null : chunk.getWorldLightManager().getLightEngine(LightType.SKY);
             for (BlockPos pos : BlockPos.getAllInBoxMutable(chunkPos.getXStart(), 0, chunkPos.getZStart(), chunkPos.getXEnd(), 256, chunkPos.getZEnd())) {
@@ -318,11 +329,11 @@ public class LightOverlayClient {
                 if (showNumber) {
                     int level = LightOverlayClient.getCrossLevel(pos, down, chunk, block, selectionContext);
                     if (level >= 0) {
-                        map.put(pos.toLong(), level);
+                        map.put(pos.toLong(), Integer.valueOf(level));
                     }
                 } else {
-                    Biome biome = world.getBiomeManager().getBiome(pos);
-                    if (biome.getSpawningChance() > 0 && !biome.getSpawns(EntityClassification.MONSTER).isEmpty()) {
+                    MobSpawnInfo spawnInfo = world.getBiomeManager().getBiome(pos).func_242433_b();
+                    if (spawnInfo.func_242557_a() > 0 && !spawnInfo.func_242559_a(EntityClassification.MONSTER).isEmpty()) {
                         CrossType type = LightOverlayClient.getCrossType(pos, down, chunk, block, sky, selectionContext);
                         if (type != CrossType.NONE) {
                             map.put(pos.toLong(), type);
@@ -330,8 +341,10 @@ public class LightOverlayClient {
                     }
                 }
             }
+            CHUNK_MAP.put(chunkPos, map);
+        } else {
+            CHUNK_MAP.remove(chunkPos);
         }
-        CHUNK_MAP.put(chunkPos, map);
     }
     
     public static void renderWorldLast() {
@@ -343,22 +356,25 @@ public class LightOverlayClient {
             int playerPosZ = ((int) playerEntity.getPosZ()) >> 4;
             ISelectionContext selectionContext = ISelectionContext.forEntity(playerEntity);
             World world = client.world;
-            BlockPos playerPos = playerEntity.func_233580_cy_();
+            BlockPos playerPos = playerEntity.getPosition();
             ActiveRenderInfo info = client.gameRenderer.getActiveRenderInfo();
             if (showNumber) {
                 RenderSystem.enableTexture();
                 RenderSystem.depthMask(true);
                 BlockPos.Mutable mutable = new BlockPos.Mutable();
-                for (Map.Entry<ChunkPos, Map<Long, Object>> entry : CHUNK_MAP.entrySet()) {
+                BlockPos.Mutable downMutable = new BlockPos.Mutable();
+                for (Map.Entry<ChunkPos, Long2ReferenceMap<Object>> entry : CHUNK_MAP.entrySet()) {
                     if (caching && (MathHelper.abs(entry.getKey().x - playerPosX) > getChunkRange() || MathHelper.abs(entry.getKey().z - playerPosZ) > getChunkRange())) {
                         continue;
                     }
-                    for (Map.Entry<Long, Object> objectEntry : entry.getValue().entrySet()) {
+                    for (Long2ReferenceMap.Entry<Object> objectEntry : entry.getValue().long2ReferenceEntrySet()) {
                         if (objectEntry.getValue() instanceof Integer) {
-                            mutable.setPos(BlockPos.unpackX(objectEntry.getKey()), BlockPos.unpackY(objectEntry.getKey()), BlockPos.unpackZ(objectEntry.getKey()));
+                            mutable.setPos(BlockPos.unpackX(objectEntry.getLongKey()), BlockPos.unpackY(objectEntry.getLongKey()), BlockPos.unpackZ(objectEntry.getLongKey()));
                             if (mutable.withinDistance(playerPos, reach)) {
-                                BlockPos down = mutable.down();
-                                LightOverlayClient.renderLevel(client, info, world, mutable, down, (Integer) objectEntry.getValue(), selectionContext);
+                                if (frustum == null || FrustumHelper.isVisible(frustum, mutable.getX(), mutable.getY(), mutable.getZ(), mutable.getX() + 1, mutable.getX() + 1, mutable.getX() + 1)) {
+                                    downMutable.setPos(mutable.getX(), mutable.getY() - 1, mutable.getZ());
+                                    LightOverlayClient.renderLevel(client, info, world, mutable, downMutable, (Integer) objectEntry.getValue(), selectionContext);
+                                }
                             }
                         }
                     }
@@ -374,17 +390,18 @@ public class LightOverlayClient {
                 GL11.glLineWidth(lineWidth);
                 GL11.glBegin(GL11.GL_LINES);
                 BlockPos.Mutable mutable = new BlockPos.Mutable();
-                for (Map.Entry<ChunkPos, Map<Long, Object>> entry : CHUNK_MAP.entrySet()) {
+                for (Map.Entry<ChunkPos, Long2ReferenceMap<Object>> entry : CHUNK_MAP.entrySet()) {
                     if (caching && (MathHelper.abs(entry.getKey().x - playerPosX) > getChunkRange() || MathHelper.abs(entry.getKey().z - playerPosZ) > getChunkRange())) {
                         continue;
                     }
-                    for (Map.Entry<Long, Object> objectEntry : entry.getValue().entrySet()) {
+                    for (Long2ReferenceMap.Entry<Object> objectEntry : entry.getValue().long2ReferenceEntrySet()) {
                         if (objectEntry.getValue() instanceof CrossType) {
-                            mutable.setPos(BlockPos.unpackX(objectEntry.getKey()), BlockPos.unpackY(objectEntry.getKey()), BlockPos.unpackZ(objectEntry.getKey()));
+                            mutable.setPos(BlockPos.unpackX(objectEntry.getLongKey()), BlockPos.unpackY(objectEntry.getLongKey()), BlockPos.unpackZ(objectEntry.getLongKey()));
                             if (mutable.withinDistance(playerPos, reach)) {
-                                BlockPos down = mutable.down();
-                                int color = objectEntry.getValue() == CrossType.RED ? redColor : objectEntry.getValue() == CrossType.YELLOW ? yellowColor : secondaryColor;
-                                renderCross(info, world, mutable, color, selectionContext);
+                                if (frustum == null || FrustumHelper.isVisible(frustum, mutable.getX(), mutable.getY(), mutable.getZ(), mutable.getX() + 1, mutable.getX() + 1, mutable.getX() + 1)) {
+                                    int color = objectEntry.getValue() == CrossType.RED ? redColor : objectEntry.getValue() == CrossType.YELLOW ? yellowColor : secondaryColor;
+                                    renderCross(info, world, mutable, color, selectionContext);
+                                }
                             }
                         }
                     }
@@ -517,8 +534,7 @@ public class LightOverlayClient {
         } else if (packet instanceof SChunkDataPacket) {
             LightOverlayClient.queueChunkAndNear(new ChunkPos(((SChunkDataPacket) packet).getChunkX(), ((SChunkDataPacket) packet).getChunkZ()));
         } else if (packet instanceof SMultiBlockChangePacket) {
-            ChunkPos chunkPos = ObfuscationReflectionHelper.getPrivateValue(SMultiBlockChangePacket.class, (SMultiBlockChangePacket) packet, "field_148925_b");
-            LightOverlayClient.queueChunkAndNear(new ChunkPos(chunkPos.x, chunkPos.z));
+            LightOverlayClient.queueChunkAndNear(new ChunkPos(((SMultiBlockChangePacket) packet).field_244305_a.getSectionX(), ((SMultiBlockChangePacket) packet).field_244305_a.getSectionZ()));
         } else if (packet instanceof SUpdateLightPacket) {
             LightOverlayClient.queueChunkAndNear(new ChunkPos(((SUpdateLightPacket) packet).getChunkX(), ((SUpdateLightPacket) packet).getChunkZ()));
         }
index 2e0ed5c48ee9d55c1fc162f8860d76573d548cda..2eaff45bb489baaf2baaaae53cea0261c495ba43 100644 (file)
@@ -20,20 +20,20 @@ public class LightOverlayCloth {
             
             ConfigEntryBuilder eb = builder.entryBuilder();
             ConfigCategory general = builder.getOrCreateCategory(new TranslationTextComponent("config.lightoverlay.general"));
-            general.addEntry(eb.startTextDescription(ITextComponent.func_241827_a_("§7" + I18n.format("description.lightoverlay.caching"))).build());
+            general.addEntry(eb.startTextDescription(ITextComponent.func_244388_a("§7" + I18n.format("description.lightoverlay.caching"))).build());
             general.addEntry(eb.startBooleanToggle(new TranslationTextComponent("config.lightoverlay.caching"), LightOverlayClient.caching).setDefaultValue(false).setSaveConsumer(bool -> LightOverlayClient.caching = bool).build());
-            general.addEntry(eb.startIntSlider(new TranslationTextComponent("config.lightoverlay.reach"), LightOverlayClient.reach, 1, 64).setDefaultValue(12).setTextGetter(integer -> ITextComponent.func_241827_a_("Reach: " + integer + " Blocks")).setSaveConsumer(integer -> LightOverlayClient.reach = integer).build());
-            IntegerSliderEntry crossLevel = eb.startIntSlider(new TranslationTextComponent("config.lightoverlay.crossLevel"), LightOverlayClient.crossLevel, 0, 15).setDefaultValue(7).setTextGetter(integer -> ITextComponent.func_241827_a_("Cross Level: " + integer)).setSaveConsumer(integer -> LightOverlayClient.crossLevel = integer).build();
+            general.addEntry(eb.startIntSlider(new TranslationTextComponent("config.lightoverlay.reach"), LightOverlayClient.reach, 1, 64).setDefaultValue(12).setTextGetter(integer -> ITextComponent.func_244388_a("Reach: " + integer + " Blocks")).setSaveConsumer(integer -> LightOverlayClient.reach = integer).build());
+            IntegerSliderEntry crossLevel = eb.startIntSlider(new TranslationTextComponent("config.lightoverlay.crossLevel"), LightOverlayClient.crossLevel, 0, 15).setDefaultValue(7).setTextGetter(integer -> ITextComponent.func_244388_a("Cross Level: " + integer)).setSaveConsumer(integer -> LightOverlayClient.crossLevel = integer).build();
             general.addEntry(crossLevel);
             general.addEntry(eb.startIntSlider(new TranslationTextComponent("config.lightoverlay.secondaryLevel"), LightOverlayClient.secondaryLevel, -1, 15)
                     .setErrorSupplier(integer -> {
-                        if (integer >= 0 && integer >= crossLevel.getValue()) return Optional.of(ITextComponent.func_241827_a_("Secondary Level cannot be higher than Cross Level!"));
+                        if (integer >= 0 && integer >= crossLevel.getValue()) return Optional.of(ITextComponent.func_244388_a("Secondary Level cannot be higher than Cross Level!"));
                         return Optional.empty();
-                    }).setDefaultValue(-1).setTextGetter(integer -> ITextComponent.func_241827_a_(integer < 0 ? "Off" : "Level: " + integer)).setSaveConsumer(integer -> LightOverlayClient.secondaryLevel = integer).build());
+                    }).setDefaultValue(-1).setTextGetter(integer -> ITextComponent.func_244388_a(integer < 0 ? "Off" : "Level: " + integer)).setSaveConsumer(integer -> LightOverlayClient.secondaryLevel = integer).build());
             general.addEntry(eb.startBooleanToggle(new TranslationTextComponent("config.lightoverlay.showNumber"), LightOverlayClient.showNumber).setDefaultValue(false).setSaveConsumer(bool -> LightOverlayClient.showNumber = bool).build());
             general.addEntry(eb.startBooleanToggle(new TranslationTextComponent("config.lightoverlay.smoothLines"), LightOverlayClient.smoothLines).setDefaultValue(true).setSaveConsumer(bool -> LightOverlayClient.smoothLines = bool).build());
             general.addEntry(eb.startBooleanToggle(new TranslationTextComponent("config.lightoverlay.underwater"), LightOverlayClient.underwater).setDefaultValue(false).setSaveConsumer(bool -> LightOverlayClient.underwater = bool).build());
-            general.addEntry(eb.startIntSlider(new TranslationTextComponent("config.lightoverlay.lineWidth"), MathHelper.floor(LightOverlayClient.lineWidth * 100), 100, 700).setDefaultValue(100).setTextGetter(integer -> ITextComponent.func_241827_a_("Light Width: " + LightOverlayClient.FORMAT.format(integer / 100d))).setSaveConsumer(integer -> LightOverlayClient.lineWidth = integer / 100f).build());
+            general.addEntry(eb.startIntSlider(new TranslationTextComponent("config.lightoverlay.lineWidth"), MathHelper.floor(LightOverlayClient.lineWidth * 100), 100, 700).setDefaultValue(100).setTextGetter(integer -> ITextComponent.func_244388_a("Light Width: " + LightOverlayClient.FORMAT.format(integer / 100d))).setSaveConsumer(integer -> LightOverlayClient.lineWidth = integer / 100f).build());
             general.addEntry(eb.startColorField(new TranslationTextComponent("config.lightoverlay.yellowColor"), LightOverlayClient.yellowColor).setDefaultValue(0xFFFF00).setSaveConsumer(color -> LightOverlayClient.yellowColor = color).build());
             general.addEntry(eb.startColorField(new TranslationTextComponent("config.lightoverlay.redColor"), LightOverlayClient.redColor).setDefaultValue(0xFF0000).setSaveConsumer(color -> LightOverlayClient.redColor = color).build());
             general.addEntry(eb.startColorField(new TranslationTextComponent("config.lightoverlay.secondaryColor"), LightOverlayClient.secondaryColor).setDefaultValue(0x0000FF).setSaveConsumer(color -> LightOverlayClient.secondaryColor = color).build());
index 8ec0e758982eb5f0dbe85f684e2c3a49209858ec..5f29014913494d38246dfa4e49610bebec6c880a 100644 (file)
@@ -13,7 +13,8 @@ function initializeCoreMod() {
             },
             'transformer': function (classNode) {
                 var render = ASMAPI.mapMethod("func_229019_a_");
-                for (i in classNode.methods) {
+                var setupTerrain = ASMAPI.mapMethod("func_228437_a_");
+                for (var i in classNode.methods) {
                     var method = classNode.methods[i];
                     if (method.name === render) {
                         var instructions = method.instructions;
@@ -28,6 +29,11 @@ function initializeCoreMod() {
                             }
                         }
                         break;
+                    } else if (method.name === setupTerrain) {
+                        var instructions = method.instructions;
+                        instructions.insertBefore(new LabelNode());
+                        instructions.insertBefore(new VarInsnNode(Opcodes.ALOAD, 2));
+                        instructions.insertBefore(new MethodInsnNode(Opcodes.INVOKESTATIC, "me/shedaniel/lightoverlay/forge/LightOverlayClient", "updateFrustum", "(Lnet/minecraft/client/renderer/culling/ClippingHelper;)V", false));
                     }
                 }
                 return classNode;
diff --git a/forge/src/main/resources/META-INF/accesstransformer.cfg b/forge/src/main/resources/META-INF/accesstransformer.cfg
new file mode 100644 (file)
index 0000000..c459c1b
--- /dev/null
@@ -0,0 +1,5 @@
+public net.minecraft.client.renderer.culling.ClippingHelper field_228949_b_ #cameraX
+public net.minecraft.client.renderer.culling.ClippingHelper field_228950_c_ #cameraY
+public net.minecraft.client.renderer.culling.ClippingHelper field_228951_d_ #cameraZ
+public net.minecraft.client.renderer.culling.ClippingHelper field_228948_a_ #frustum
+public net.minecraft.network.play.server.SMultiBlockChangePacket field_244305_a #field_244305_a
\ No newline at end of file
index de20c6f6d2b128525d36aad70d771fc828fdd175..2aab95a3eef857f9b8d411c801e7018e8f0dd378 100755 (executable)
@@ -3,6 +3,7 @@ loaderVersion="[29,)"
 issueTrackerURL="https://github.com/shedaniel/LightOverlay/issues/" #optional
 logoFile="icon.png"
 authors="shedaniel"
+license="Apache-2.0"
 [[mods]]
     modId="lightoverlay-forge"
     version="${file.jarVersion}"
index d05f45ac83733de440b271807132bae291bbb728..13ececeeefab2549b569ce44c48cdbe9c2a9aa2e 100755 (executable)
@@ -1,7 +1,7 @@
 org.gradle.jvmargs=-Xmx3G
 org.gradle.daemon=false
 
-mod_version=5.5.0
+mod_version=5.5.1
 
 # fabric
 fabric_minecraft_version=1.16.2
@@ -13,7 +13,7 @@ cloth_config_version=4.7.0-unstable
 modmenu_version=1.14.6+build.31
 
 # forge
-mcp_snapshot=20200514-1.16
-forge_minecraft_version=1.16.1
-forge_version=32.0.7
-cloth_config_forge=4.0
\ No newline at end of file
+mcp_snapshot=20200723-1.16.1
+forge_minecraft_version=1.16.2
+forge_version=33.0.3
+cloth_config_forge=4.1.0
\ No newline at end of file
index 24884136a9e28e7a76aa3a64d116588eccd34ba8..baec76af7dc178ca51b90dc33cf034739cc9ca8d 100644 (file)
@@ -12,4 +12,4 @@ pluginManagement {
 rootProject.name="light-overlay"
 
 include("fabric")
-//include("forge")
+include("forge")