From 2aed897b9b6bb69b03bf477338468e8799142762 Mon Sep 17 00:00:00 2001 From: cola98765 Date: Thu, 4 Nov 2021 11:30:33 +0100 Subject: [PATCH] pulled some changes around wrappers from 1.17.1_fabric --- .../bufferBuilding/LodBufferBuilder.java | 42 +++---- .../lodTemplates/AbstractLodTemplate.java | 4 +- .../bufferBuilding/lodTemplates/Box.java | 4 +- .../lodTemplates/CubicLodTemplate.java | 7 +- .../lodTemplates/DynamicLodTemplate.java | 4 +- .../lodTemplates/TriangularLodTemplate.java | 4 +- .../worldGeneration/LodGenWorker.java | 17 +-- .../worldGeneration/LodWorldGenerator.java | 8 +- .../java/com/seibel/lod/objects/LodWorld.java | 11 +- .../com/seibel/lod/objects/RegionPos.java | 21 ++-- .../com/seibel/lod/proxy/ClientProxy.java | 2 +- .../com/seibel/lod/render/LodRenderer.java | 21 ++-- .../com/seibel/lod/render/RenderUtil.java | 3 +- .../java/com/seibel/lod/util/LodUtil.java | 14 ++- .../com/seibel/lod/util/ThreadMapUtil.java | 10 +- .../lod/wrappers/Block/BlockPosWrapper.java | 115 +++++++++--------- .../lod/wrappers/Chunk/ChunkPosWrapper.java | 32 ++++- .../seibel/lod/wrappers/MinecraftWrapper.java | 15 +++ 18 files changed, 192 insertions(+), 142 deletions(-) diff --git a/src/main/java/com/seibel/lod/builders/bufferBuilding/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/LodBufferBuilder.java index 45bc7231e..e4baaa2da 100644 --- a/src/main/java/com/seibel/lod/builders/bufferBuilding/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/LodBufferBuilder.java @@ -30,6 +30,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.locks.ReentrantLock; +import com.seibel.lod.wrappers.Block.BlockPosWrapper; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL30; @@ -49,6 +50,7 @@ import com.seibel.lod.objects.RegionPos; import com.seibel.lod.proxy.ClientProxy; import com.seibel.lod.proxy.GlProxy; import com.seibel.lod.render.LodRenderer; +import com.seibel.lod.wrappers.Chunk.ChunkPosWrapper; import com.seibel.lod.util.DataPointUtil; import com.seibel.lod.util.DetailDistanceUtil; import com.seibel.lod.util.LevelPosUtil; @@ -61,8 +63,6 @@ import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.vertex.VertexBuffer; import net.minecraft.client.world.ClientWorld; import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; import net.minecraft.world.LightType; /** @@ -141,11 +141,11 @@ public class LodBufferBuilder private volatile RegionPos center; /** - * This is the ChunkPos the player was at the last time the buffers were built. + * This is the ChunkPosWrapper the player was at the last time the buffers were built. * IE the center of the buffers last time they were built */ - private volatile ChunkPos drawableCenterChunkPos = new ChunkPos(0, 0); - private volatile ChunkPos buildableCenterChunkPos = new ChunkPos(0, 0); + private volatile ChunkPosWrapper drawableCenterChunkPos = new ChunkPosWrapper(0, 0); + private volatile ChunkPosWrapper buildableCenterChunkPos = new ChunkPosWrapper(0, 0); @@ -167,7 +167,7 @@ public class LodBufferBuilder * swapped with the drawable buffers in the LodRenderer to be drawn. */ public void generateLodBuffersAsync(LodRenderer renderer, LodDimension lodDim, - BlockPos playerBlockPos, boolean fullRegen) + BlockPosWrapper playerBlockPos, boolean fullRegen) { // only allow one generation process to happen at a time @@ -190,15 +190,15 @@ public class LodBufferBuilder // more easily edited by hot swapping. Because, As far as James is aware // you can't hot swap lambda expressions. private void generateLodBuffersThread(LodRenderer renderer, LodDimension lodDim, - BlockPos playerBlockPos, boolean fullRegen) + BlockPosWrapper playerBlockPos, boolean fullRegen) { bufferLock.lock(); try { // round the player's block position down to the nearest chunk BlockPos - ChunkPos playerChunkPos = new ChunkPos(playerBlockPos); - BlockPos playerBlockPosRounded = playerChunkPos.getWorldPosition(); + ChunkPosWrapper playerChunkPos = new ChunkPosWrapper(playerBlockPos); + BlockPosWrapper playerBlockPosRounded = playerChunkPos.getWorldPosition(); //long startTime = System.currentTimeMillis(); @@ -233,7 +233,7 @@ public class LodBufferBuilder //================================// ClientWorld world = mc.getClientWorld(); - skyLightPlayer = world.getBrightness(LightType.SKY, playerBlockPos); + skyLightPlayer = world.getBrightness(LightType.SKY, playerBlockPos.getBlockPos()); for (int xRegion = 0; xRegion < lodDim.getWidth(); xRegion++) { @@ -315,8 +315,8 @@ public class LodBufferBuilder posX = posToRender.getNthPosX(index); posZ = posToRender.getNthPosZ(index); - int chunkXdist = LevelPosUtil.getChunkPos(detailLevel, posX) - playerChunkPos.x; - int chunkZdist = LevelPosUtil.getChunkPos(detailLevel, posZ) - playerChunkPos.z; + int chunkXdist = LevelPosUtil.getChunkPos(detailLevel, posX) - playerChunkPos.getX(); + int chunkZdist = LevelPosUtil.getChunkPos(detailLevel, posZ) - playerChunkPos.getZ(); //We don't want to render this fake block if //The block is inside the render distance with, is not bigger than a chunk and is positioned in a chunk set as vanilla rendered @@ -343,8 +343,8 @@ public class LodBufferBuilder xAdj = posX + Box.DIRECTION_NORMAL_MAP.get(direction).getX(); zAdj = posZ + Box.DIRECTION_NORMAL_MAP.get(direction).getZ(); long data; - chunkXdist = LevelPosUtil.getChunkPos(detailLevel, xAdj) - playerChunkPos.x; - chunkZdist = LevelPosUtil.getChunkPos(detailLevel, zAdj) - playerChunkPos.z; + chunkXdist = LevelPosUtil.getChunkPos(detailLevel, xAdj) - playerChunkPos.getX(); + chunkZdist = LevelPosUtil.getChunkPos(detailLevel, zAdj) - playerChunkPos.getZ(); adjPosInPlayerChunk = (chunkXdist == 0 && chunkZdist == 0); //If the adj block is rendered in the same region and with same detail @@ -476,13 +476,13 @@ public class LodBufferBuilder } } - private boolean isThisPositionGoingToBeRendered(byte detailLevel, int posX, int posZ, ChunkPos playerChunkPos, boolean[][] vanillaRenderedChunks, int gameChunkRenderDistance){ + private boolean isThisPositionGoingToBeRendered(byte detailLevel, int posX, int posZ, ChunkPosWrapper playerChunkPos, boolean[][] vanillaRenderedChunks, int gameChunkRenderDistance){ // skip any chunks that Minecraft is going to render - int chunkXdist = LevelPosUtil.getChunkPos(detailLevel, posX) - playerChunkPos.x; - int chunkZdist = LevelPosUtil.getChunkPos(detailLevel, posZ) - playerChunkPos.z; - + int chunkXdist = LevelPosUtil.getChunkPos(detailLevel, posX) - playerChunkPos.getX(); + int chunkZdist = LevelPosUtil.getChunkPos(detailLevel, posZ) - playerChunkPos.getZ(); + // check if the chunk is on the border boolean isItBorderPos; if (LodConfig.CLIENT.graphics.advancedGraphicsOption.vanillaOverdraw.get() == VanillaOverdraw.BORDER) @@ -793,7 +793,7 @@ public class LodBufferBuilder } finally { - GL11.glFinish(); + GL15.glFinish(); // close the context so it can be re-used later. // I'm guessing we can't just leave it because the executor service @@ -953,9 +953,9 @@ public class LodBufferBuilder { public final VertexBuffer[][][] vbos; public final int[][][] storageBufferIds; - public final ChunkPos drawableCenterChunkPos; + public final ChunkPosWrapper drawableCenterChunkPos; - public VertexBuffersAndOffset(VertexBuffer[][][] newVbos, int[][][] newStorageBufferIds, ChunkPos newDrawableCenterChunkPos) + public VertexBuffersAndOffset(VertexBuffer[][][] newVbos, int[][][] newStorageBufferIds, ChunkPosWrapper newDrawableCenterChunkPos) { vbos = newVbos; storageBufferIds = newStorageBufferIds; diff --git a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java index daff1fa0f..0cf1eab1d 100644 --- a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java +++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/AbstractLodTemplate.java @@ -23,10 +23,10 @@ import java.util.Map; import com.seibel.lod.enums.DebugMode; import com.seibel.lod.util.ColorUtil; +import com.seibel.lod.wrappers.Block.BlockPosWrapper; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; /** * This is the abstract class used to create different @@ -38,7 +38,7 @@ public abstract class AbstractLodTemplate { /** Uploads the given LOD to the buffer. */ - public abstract void addLodToBuffer(BufferBuilder buffer, BlockPos bufferCenterBlockPos, long data, Map adjData, + public abstract void addLodToBuffer(BufferBuilder buffer, BlockPosWrapper bufferCenterBlockPos, long data, Map adjData, byte detailLevel, int posX, int posZ, Box box, DebugMode debugging, boolean[] adjShadeDisabled); /** add the given position and color to the buffer */ diff --git a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/Box.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/Box.java index 90172d0a7..b3449831e 100644 --- a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/Box.java +++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/Box.java @@ -28,10 +28,10 @@ import com.seibel.lod.enums.DebugMode; import com.seibel.lod.util.ColorUtil; import com.seibel.lod.util.DataPointUtil; import com.seibel.lod.util.LodUtil; +import com.seibel.lod.wrappers.Block.BlockPosWrapper; import com.seibel.lod.wrappers.MinecraftWrapper; import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.vector.Vector3i; /** @@ -279,7 +279,7 @@ public class Box } /** determine which faces should be culled */ - public void setUpCulling(int cullingDistance, BlockPos playerPos) + public void setUpCulling(int cullingDistance, BlockPosWrapper playerPos) { for (Direction direction : DIRECTIONS) { diff --git a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java index 677dc7c7d..f1045bcf5 100644 --- a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java +++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/CubicLodTemplate.java @@ -25,10 +25,11 @@ import com.seibel.lod.enums.DebugMode; import com.seibel.lod.util.ColorUtil; import com.seibel.lod.util.DataPointUtil; import com.seibel.lod.util.LodUtil; +import com.seibel.lod.wrappers.Block.BlockPosWrapper; + import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; /** * Builds LODs as rectangular prisms. @@ -44,7 +45,7 @@ public class CubicLodTemplate extends AbstractLodTemplate } @Override - public void addLodToBuffer(BufferBuilder buffer, BlockPos bufferCenterBlockPos, long data, Map adjData, + public void addLodToBuffer(BufferBuilder buffer, BlockPosWrapper bufferCenterBlockPos, long data, Map adjData, byte detailLevel, int posX, int posZ, Box box, DebugMode debugging, boolean[] adjShadeDisabled) { if (box == null) @@ -79,7 +80,7 @@ public class CubicLodTemplate extends AbstractLodTemplate private void generateBoundingBox(Box box, int height, int depth, int width, double xOffset, double yOffset, double zOffset, - BlockPos bufferCenterBlockPos, + BlockPosWrapper bufferCenterBlockPos, Map adjData, int color, int skyLight, diff --git a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/DynamicLodTemplate.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/DynamicLodTemplate.java index dd88744ab..e3f92f067 100644 --- a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/DynamicLodTemplate.java +++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/DynamicLodTemplate.java @@ -24,9 +24,9 @@ import java.util.Map; import com.seibel.lod.enums.DebugMode; import com.seibel.lod.proxy.ClientProxy; +import com.seibel.lod.wrappers.Block.BlockPosWrapper; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; /** * TODO DynamicLodTemplate @@ -39,7 +39,7 @@ import net.minecraft.util.math.BlockPos; public class DynamicLodTemplate extends AbstractLodTemplate { @Override - public void addLodToBuffer(BufferBuilder buffer, BlockPos bufferCenterBlockPos, long data, Map adjData, + public void addLodToBuffer(BufferBuilder buffer, BlockPosWrapper bufferCenterBlockPos, long data, Map adjData, byte detailLevel, int posX, int posZ, Box box, DebugMode debugging, boolean[] adjShadeDisabled) { ClientProxy.LOGGER.error(DynamicLodTemplate.class.getSimpleName() + " is not implemented!"); diff --git a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/TriangularLodTemplate.java b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/TriangularLodTemplate.java index 765399455..2bd3491e1 100644 --- a/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/TriangularLodTemplate.java +++ b/src/main/java/com/seibel/lod/builders/bufferBuilding/lodTemplates/TriangularLodTemplate.java @@ -24,9 +24,9 @@ import java.util.Map; import com.seibel.lod.enums.DebugMode; import com.seibel.lod.proxy.ClientProxy; +import com.seibel.lod.wrappers.Block.BlockPosWrapper; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; /** * TODO #21 TriangularLodTemplate @@ -37,7 +37,7 @@ import net.minecraft.util.math.BlockPos; public class TriangularLodTemplate extends AbstractLodTemplate { @Override - public void addLodToBuffer(BufferBuilder buffer, BlockPos bufferCenterBlockPos, long data, Map adjData, + public void addLodToBuffer(BufferBuilder buffer, BlockPosWrapper bufferCenterBlockPos, long data, Map adjData, byte detailLevel, int posX, int posZ, Box box, DebugMode debugging, boolean[] adjShadeDisabled) { ClientProxy.LOGGER.error(DynamicLodTemplate.class.getSimpleName() + " is not implemented!"); diff --git a/src/main/java/com/seibel/lod/builders/worldGeneration/LodGenWorker.java b/src/main/java/com/seibel/lod/builders/worldGeneration/LodGenWorker.java index 4fed6fb9b..a72ea3707 100644 --- a/src/main/java/com/seibel/lod/builders/worldGeneration/LodGenWorker.java +++ b/src/main/java/com/seibel/lod/builders/worldGeneration/LodGenWorker.java @@ -37,6 +37,7 @@ import com.seibel.lod.objects.LodDimension; import com.seibel.lod.proxy.ClientProxy; import com.seibel.lod.util.LodUtil; +import com.seibel.lod.wrappers.Chunk.ChunkPosWrapper; import com.seibel.lod.wrappers.Chunk.ChunkWrapper; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -90,7 +91,7 @@ public class LodGenWorker implements IWorker - public LodGenWorker(ChunkPos newPos, DistanceGenerationMode newGenerationMode, + public LodGenWorker(ChunkPosWrapper newPos, DistanceGenerationMode newGenerationMode, LodBuilder newLodBuilder, LodDimension newLodDimension, ServerWorld newServerWorld) { @@ -161,9 +162,9 @@ public class LodGenWorker implements IWorker public final DistanceGenerationMode generationMode; public final LodBuilder lodBuilder; - private final ChunkPos pos; + private final ChunkPosWrapper pos; - public LodChunkGenThread(ChunkPos newPos, DistanceGenerationMode newGenerationMode, + public LodChunkGenThread(ChunkPosWrapper newPos, DistanceGenerationMode newGenerationMode, LodBuilder newLodBuilder, LodDimension newLodDimension, ServerWorld newServerWorld) { @@ -183,7 +184,7 @@ public class LodGenWorker implements IWorker // be added to the current LodDimension /* TODO I must disable this 'if', if I will find a way to replace it */ - if (lodDim.regionIsInRange(pos.x / LodUtil.REGION_WIDTH_IN_CHUNKS, pos.z / LodUtil.REGION_WIDTH_IN_CHUNKS)) + if (lodDim.regionIsInRange(pos.getX() / LodUtil.REGION_WIDTH_IN_CHUNKS, pos.getZ() / LodUtil.REGION_WIDTH_IN_CHUNKS)) { // //{ @@ -295,7 +296,7 @@ public class LodGenWorker implements IWorker private void generateUsingBiomesOnly() { List chunkList = new LinkedList<>(); - ChunkPrimer chunk = new ChunkPrimer(pos, UpgradeData.EMPTY); + ChunkPrimer chunk = new ChunkPrimer(pos.getChunkPos(), UpgradeData.EMPTY); chunkList.add(chunk); ServerChunkProvider chunkSource = serverWorld.getChunkSource(); @@ -407,7 +408,7 @@ public class LodGenWorker implements IWorker private void generateUsingSurface() { List chunkList = new LinkedList<>(); - ChunkPrimer chunk = new ChunkPrimer(pos, UpgradeData.EMPTY); + ChunkPrimer chunk = new ChunkPrimer(pos.getChunkPos(), UpgradeData.EMPTY); chunkList.add(chunk); LodServerWorld lodServerWorld = new LodServerWorld(serverWorld, chunk); @@ -447,7 +448,7 @@ public class LodGenWorker implements IWorker private void generateUsingFeatures() { List chunkList = new LinkedList<>(); - ChunkPrimer chunk = new ChunkPrimer(pos, UpgradeData.EMPTY); + ChunkPrimer chunk = new ChunkPrimer(pos.getChunkPos(), UpgradeData.EMPTY); chunkList.add(chunk); LodServerWorld lodServerWorld = new LodServerWorld(serverWorld, chunk); @@ -565,7 +566,7 @@ public class LodGenWorker implements IWorker */ private void generateWithServer() { - lodBuilder.generateLodNodeFromChunk(lodDim, new ChunkWrapper(serverWorld.getChunk(pos.x, pos.z, ChunkStatus.FEATURES)), new LodBuilderConfig(DistanceGenerationMode.SERVER)); + lodBuilder.generateLodNodeFromChunk(lodDim, new ChunkWrapper(serverWorld.getChunk(pos.getX(), pos.getZ(), ChunkStatus.FEATURES)), new LodBuilderConfig(DistanceGenerationMode.SERVER)); } diff --git a/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java b/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java index 736aea480..b4faaca6d 100644 --- a/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java +++ b/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java @@ -35,9 +35,9 @@ import com.seibel.lod.util.DetailDistanceUtil; import com.seibel.lod.util.LevelPosUtil; import com.seibel.lod.util.LodThreadFactory; import com.seibel.lod.util.LodUtil; +import com.seibel.lod.wrappers.Chunk.ChunkPosWrapper; import com.seibel.lod.wrappers.MinecraftWrapper; -import net.minecraft.util.math.ChunkPos; import net.minecraft.world.server.ServerWorld; import net.minecraftforge.common.WorldWorkerManager; @@ -72,7 +72,7 @@ public class LodWorldGenerator */ public final AtomicInteger numberOfChunksWaitingToGenerate = new AtomicInteger(0); - public final Set positionsWaitingToBeGenerated = new HashSet<>(); + public final Set positionsWaitingToBeGenerated = new HashSet<>(); /** * Singleton copy of this object @@ -142,7 +142,7 @@ public class LodWorldGenerator posZ = posToGenerate.getNthPosZ(nearIndex, true); nearIndex++; - ChunkPos chunkPos = new ChunkPos(LevelPosUtil.getChunkPos(detailLevel, posX), LevelPosUtil.getChunkPos(detailLevel, posZ)); + ChunkPosWrapper chunkPos = new ChunkPosWrapper(LevelPosUtil.getChunkPos(detailLevel, posX), LevelPosUtil.getChunkPos(detailLevel, posZ)); // prevent generating the same chunk multiple times if (positionsWaitingToBeGenerated.contains(chunkPos)) @@ -167,7 +167,7 @@ public class LodWorldGenerator posZ = posToGenerate.getNthPosZ(farIndex, false); farIndex++; - ChunkPos chunkPos = new ChunkPos(LevelPosUtil.getChunkPos(detailLevel, posX), LevelPosUtil.getChunkPos(detailLevel, posZ)); + ChunkPosWrapper chunkPos = new ChunkPosWrapper(LevelPosUtil.getChunkPos(detailLevel, posX), LevelPosUtil.getChunkPos(detailLevel, posZ)); // don't add more to the generation queue then allowed if (numberOfChunksWaitingToGenerate.get() >= maxChunkGenRequests) diff --git a/src/main/java/com/seibel/lod/objects/LodWorld.java b/src/main/java/com/seibel/lod/objects/LodWorld.java index 95d4ec998..b549aebb7 100644 --- a/src/main/java/com/seibel/lod/objects/LodWorld.java +++ b/src/main/java/com/seibel/lod/objects/LodWorld.java @@ -24,6 +24,7 @@ import java.util.Map; import com.seibel.lod.proxy.ClientProxy; +import com.seibel.lod.wrappers.World.DimensionTypeWrapper; import net.minecraft.world.DimensionType; /** @@ -39,7 +40,7 @@ public class LodWorld private String worldName; /** dimensions in this world */ - private Map lodDimensions; + private Map lodDimensions; /** If true then the LOD world is setup and ready to use */ private boolean isWorldLoaded = false; @@ -107,7 +108,7 @@ public class LodWorld if (lodDimensions == null) return; - lodDimensions.put(newDimension.dimension, newDimension); + lodDimensions.put(DimensionTypeWrapper.getDimensionTypeWrapper(newDimension.dimension), newDimension); } /** @@ -118,7 +119,7 @@ public class LodWorld if (lodDimensions == null) return null; - return lodDimensions.get(dimension); + return lodDimensions.get(DimensionTypeWrapper.getDimensionTypeWrapper(dimension)); } /** @@ -132,7 +133,7 @@ public class LodWorld saveAllDimensions(); - for (DimensionType key : lodDimensions.keySet()) + for (DimensionTypeWrapper key : lodDimensions.keySet()) lodDimensions.get(key).setRegionWidth(newRegionWidth); } @@ -148,7 +149,7 @@ public class LodWorld // but that requires a LodDimension.hasDirtyRegions() method or something similar ClientProxy.LOGGER.info("Saving LODs"); - for (DimensionType key : lodDimensions.keySet()) + for (DimensionTypeWrapper key : lodDimensions.keySet()) lodDimensions.get(key).saveDirtyRegionsToFileAsync(); } diff --git a/src/main/java/com/seibel/lod/objects/RegionPos.java b/src/main/java/com/seibel/lod/objects/RegionPos.java index 22657c571..20ae78de5 100644 --- a/src/main/java/com/seibel/lod/objects/RegionPos.java +++ b/src/main/java/com/seibel/lod/objects/RegionPos.java @@ -20,9 +20,8 @@ package com.seibel.lod.objects; import com.seibel.lod.util.LodUtil; - -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; +import com.seibel.lod.wrappers.Block.BlockPosWrapper; +import com.seibel.lod.wrappers.Chunk.ChunkPosWrapper; /** * This object is similar to ChunkPos or BlockPos. @@ -55,28 +54,28 @@ public class RegionPos } /** Converts from a BlockPos to a RegionPos */ - public RegionPos(BlockPos pos) + public RegionPos(BlockPosWrapper pos) { - this(new ChunkPos(pos)); + this(new ChunkPosWrapper(pos)); } /** Converts from a ChunkPos to a RegionPos */ - public RegionPos(ChunkPos pos) + public RegionPos(ChunkPosWrapper pos) { - x = Math.floorDiv(pos.x, LodUtil.REGION_WIDTH_IN_CHUNKS); - z = Math.floorDiv(pos.z, LodUtil.REGION_WIDTH_IN_CHUNKS); + x = Math.floorDiv(pos.getX(), LodUtil.REGION_WIDTH_IN_CHUNKS); + z = Math.floorDiv(pos.getZ(), LodUtil.REGION_WIDTH_IN_CHUNKS); } /** Returns the ChunkPos at the center of this region */ - public ChunkPos chunkPos() + public ChunkPosWrapper chunkPos() { - return new ChunkPos( + return new ChunkPosWrapper( (x * LodUtil.REGION_WIDTH_IN_CHUNKS) + LodUtil.REGION_WIDTH_IN_CHUNKS / 2, (z * LodUtil.REGION_WIDTH_IN_CHUNKS) + LodUtil.REGION_WIDTH_IN_CHUNKS / 2); } /** Returns the BlockPos at the center of this region */ - public BlockPos blockPos() + public BlockPosWrapper blockPos() { return chunkPos().getWorldPosition() .offset(LodUtil.CHUNK_WIDTH / 2, 0, LodUtil.CHUNK_WIDTH / 2); diff --git a/src/main/java/com/seibel/lod/proxy/ClientProxy.java b/src/main/java/com/seibel/lod/proxy/ClientProxy.java index e99e09f64..3ad57ba94 100644 --- a/src/main/java/com/seibel/lod/proxy/ClientProxy.java +++ b/src/main/java/com/seibel/lod/proxy/ClientProxy.java @@ -314,7 +314,7 @@ public class ClientProxy private void playerMoveEvent(LodDimension lodDim) { // make sure the dimension is centered - RegionPos playerRegionPos = new RegionPos(mc.getPlayer().blockPosition()); + RegionPos playerRegionPos = new RegionPos(mc.getPlayerBlockPos()); RegionPos worldRegionOffset = new RegionPos(playerRegionPos.x - lodDim.getCenterRegionPosX(), playerRegionPos.z - lodDim.getCenterRegionPosZ()); if (worldRegionOffset.x != 0 || worldRegionOffset.z != 0) { diff --git a/src/main/java/com/seibel/lod/render/LodRenderer.java b/src/main/java/com/seibel/lod/render/LodRenderer.java index fd8608a23..cce0855ab 100644 --- a/src/main/java/com/seibel/lod/render/LodRenderer.java +++ b/src/main/java/com/seibel/lod/render/LodRenderer.java @@ -35,6 +35,8 @@ import com.seibel.lod.proxy.GlProxy; import com.seibel.lod.util.DetailDistanceUtil; import com.seibel.lod.util.LevelPosUtil; import com.seibel.lod.util.LodUtil; +import com.seibel.lod.wrappers.Block.BlockPosWrapper; +import com.seibel.lod.wrappers.Chunk.ChunkPosWrapper; import com.seibel.lod.wrappers.MinecraftWrapper; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.GameRenderer; @@ -90,7 +92,7 @@ public class LodRenderer */ private int[][][] storageBufferIds; - private ChunkPos vbosCenter = new ChunkPos(0, 0); + private ChunkPosWrapper vbosCenter = new ChunkPosWrapper(0, 0); /** This is used to determine if the LODs should be regenerated */ @@ -128,7 +130,6 @@ public class LodRenderer - public LodRenderer(LodBufferBuilder newLodNodeBufferBuilder) { mc = MinecraftWrapper.INSTANCE; @@ -205,7 +206,7 @@ public class LodRenderer if ((partialRegen || fullRegen) && !lodBufferBuilder.generatingBuffers && !lodBufferBuilder.newBuffersAvailable()) { // generate the LODs on a separate thread to prevent stuttering or freezing - lodBufferBuilder.generateLodBuffersAsync(this, lodDim, mc.getPlayer().blockPosition(), fullRegen); + lodBufferBuilder.generateLodBuffersAsync(this, lodDim, mc.getPlayerBlockPos(), fullRegen); // the regen process has been started, // it will be done when lodBufferBuilder.newBuffersAvailable() @@ -539,7 +540,7 @@ public class LodRenderer // translate the camera relative to the regions' center // (AxisAlignedBoundingBoxes (LODs) use doubles and thus have a higher // accuracy vs the model view matrix, which only uses floats) - BlockPos bufferPos = vbosCenter.getWorldPosition(); + BlockPosWrapper bufferPos = vbosCenter.getWorldPosition(); double xDiff = projectedView.x - bufferPos.getX(); double zDiff = projectedView.z - bufferPos.getZ(); mcMatrixStack.translate(-xDiff, -projectedView.y, -zDiff); @@ -841,12 +842,12 @@ public class LodRenderer if (newTime - prevPlayerPosTime > LodConfig.CLIENT.advancedModOptions.buffers.rebuildTimes.get().playerMoveTimeout) { if (LevelPosUtil.getDetailLevel(previousPos) == 0 - || mc.getPlayer().xChunk != LevelPosUtil.getPosX(previousPos) - || mc.getPlayer().zChunk != LevelPosUtil.getPosZ(previousPos)) + || mc.getPlayerChunkPos().getX() != LevelPosUtil.getPosX(previousPos) + || mc.getPlayerChunkPos().getZ() != LevelPosUtil.getPosZ(previousPos)) { vanillaRenderedChunks = new boolean[vanillaRenderedChunksWidth][vanillaRenderedChunksWidth]; fullRegen = true; - previousPos = LevelPosUtil.createLevelPos((byte) 4, mc.getPlayer().xChunk, mc.getPlayer().zChunk); + previousPos = LevelPosUtil.createLevelPos((byte) 4, mc.getPlayerChunkPos().getX(), mc.getPlayerChunkPos().getZ()); } prevPlayerPosTime = newTime; } @@ -921,15 +922,15 @@ public class LodRenderer //==============// // determine which LODs should not be rendered close to the player - HashSet chunkPosToSkip = LodUtil.getNearbyLodChunkPosToSkip(lodDim, mc.getPlayer().blockPosition()); + HashSet chunkPosToSkip = LodUtil.getNearbyLodChunkPosToSkip(lodDim, mc.getPlayerBlockPos()); int xIndex; int zIndex; for (ChunkPos pos : chunkPosToSkip) { vanillaRenderedChunksEmptySkip = false; - xIndex = (pos.x - mc.getPlayer().xChunk) + (chunkRenderDistance + 1); - zIndex = (pos.z - mc.getPlayer().zChunk) + (chunkRenderDistance + 1); + xIndex = (pos.x - mc.getPlayerChunkPos().getX()) + (chunkRenderDistance + 1); + zIndex = (pos.z - mc.getPlayerChunkPos().getZ()) + (chunkRenderDistance + 1); // sometimes we are given chunks that are outside the render distance, // This prevents index out of bounds exceptions diff --git a/src/main/java/com/seibel/lod/render/RenderUtil.java b/src/main/java/com/seibel/lod/render/RenderUtil.java index 8835f4cda..27b577cf3 100644 --- a/src/main/java/com/seibel/lod/render/RenderUtil.java +++ b/src/main/java/com/seibel/lod/render/RenderUtil.java @@ -20,6 +20,7 @@ package com.seibel.lod.render; import com.seibel.lod.util.LodUtil; +import com.seibel.lod.wrappers.Block.BlockPosWrapper; import com.seibel.lod.wrappers.MinecraftWrapper; import net.minecraft.util.math.BlockPos; @@ -85,7 +86,7 @@ public class RenderUtil * Returns true if one of the region's 4 corners is in front * of the camera. */ - public static boolean isRegionInViewFrustum(BlockPos playerBlockPos, Vector3d cameraDir, BlockPos vboCenterPos) + public static boolean isRegionInViewFrustum(BlockPos playerBlockPos, Vector3d cameraDir, BlockPosWrapper vboCenterPos) { // convert the vbo position into a direction vector // starting from the player's position diff --git a/src/main/java/com/seibel/lod/util/LodUtil.java b/src/main/java/com/seibel/lod/util/LodUtil.java index 30e132379..ae3bd4f79 100644 --- a/src/main/java/com/seibel/lod/util/LodUtil.java +++ b/src/main/java/com/seibel/lod/util/LodUtil.java @@ -29,6 +29,8 @@ import com.seibel.lod.enums.HorizontalResolution; import com.seibel.lod.enums.VanillaOverdraw; import com.seibel.lod.objects.LodDimension; import com.seibel.lod.objects.RegionPos; +import com.seibel.lod.wrappers.Block.BlockPosWrapper; +import com.seibel.lod.wrappers.Chunk.ChunkPosWrapper; import com.seibel.lod.wrappers.MinecraftWrapper; import net.minecraft.client.multiplayer.ServerData; @@ -349,10 +351,10 @@ public class LodUtil * Get a HashSet of all ChunkPos within the normal render distance * that should not be rendered. */ - public static HashSet getNearbyLodChunkPosToSkip(LodDimension lodDim, BlockPos playerPos) + public static HashSet getNearbyLodChunkPosToSkip(LodDimension lodDim, BlockPosWrapper blockPosWrapper) { int chunkRenderDist = mc.getRenderDistance(); - ChunkPos centerChunk = new ChunkPos(playerPos); + ChunkPosWrapper centerChunk = new ChunkPosWrapper(blockPosWrapper); int skipRadius; VanillaOverdraw overdraw = LodConfig.CLIENT.graphics.advancedGraphicsOption.vanillaOverdraw.get(); @@ -426,12 +428,12 @@ public class LodUtil // if the skipRadius is being used if (skipRadius != 0) { - for (int x = centerChunk.x - chunkRenderDist; x < centerChunk.x + chunkRenderDist; x++) + for (int x = centerChunk.getX() - chunkRenderDist; x < centerChunk.getX() + chunkRenderDist; x++) { - for (int z = centerChunk.z - chunkRenderDist; z < centerChunk.z + chunkRenderDist; z++) + for (int z = centerChunk.getZ() - chunkRenderDist; z < centerChunk.getZ() + chunkRenderDist; z++) { - if (x <= centerChunk.x - skipRadius || x >= centerChunk.x + skipRadius - || z <= centerChunk.z - skipRadius || z >= centerChunk.z + skipRadius) + if (x <= centerChunk.getX() - skipRadius || x >= centerChunk.getX() + skipRadius + || z <= centerChunk.getZ() - skipRadius || z >= centerChunk.getZ() + skipRadius) posToSkip.remove(new ChunkPos(x, z)); } diff --git a/src/main/java/com/seibel/lod/util/ThreadMapUtil.java b/src/main/java/com/seibel/lod/util/ThreadMapUtil.java index bf19076f3..bec0bf2e4 100644 --- a/src/main/java/com/seibel/lod/util/ThreadMapUtil.java +++ b/src/main/java/com/seibel/lod/util/ThreadMapUtil.java @@ -19,8 +19,6 @@ package com.seibel.lod.util; -import static com.seibel.lod.util.LodUtil.DETAIL_OPTIONS; - import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -142,9 +140,9 @@ public class ThreadMapUtil { if (!saveContainer.containsKey(Thread.currentThread().getName()) || (saveContainer.get(Thread.currentThread().getName()) == null)) { - byte[][] array = new byte[DETAIL_OPTIONS][]; + byte[][] array = new byte[LodUtil.DETAIL_OPTIONS][]; int size = 1; - for (int i = DETAIL_OPTIONS - 1; i >= 0; i--) + for (int i = LodUtil.DETAIL_OPTIONS - 1; i >= 0; i--) { array[i] = new byte[2 + 8 * size * size * DetailDistanceUtil.getMaxVerticalData(i)]; size = size << 1; @@ -188,8 +186,8 @@ public class ThreadMapUtil { if (!verticalUpdate.containsKey(Thread.currentThread().getName()) || (verticalUpdate.get(Thread.currentThread().getName()) == null)) { - long[][] array = new long[DETAIL_OPTIONS][]; - for (int i = 1; i < DETAIL_OPTIONS; i++) + long[][] array = new long[LodUtil.DETAIL_OPTIONS][]; + for (int i = 1; i < LodUtil.DETAIL_OPTIONS; i++) array[i] = new long[DetailDistanceUtil.getMaxVerticalData(i - 1) * 4]; verticalUpdate.put(Thread.currentThread().getName(), array); } diff --git a/src/main/java/com/seibel/lod/wrappers/Block/BlockPosWrapper.java b/src/main/java/com/seibel/lod/wrappers/Block/BlockPosWrapper.java index 7332a8a22..a5e89fd81 100644 --- a/src/main/java/com/seibel/lod/wrappers/Block/BlockPosWrapper.java +++ b/src/main/java/com/seibel/lod/wrappers/Block/BlockPosWrapper.java @@ -1,64 +1,67 @@ package com.seibel.lod.wrappers.Block; -import com.seibel.lod.util.ColorUtil; -import net.minecraft.block.*; -import net.minecraft.client.renderer.model.BakedQuad; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; -import net.minecraftforge.client.model.data.ModelDataMap; - -import java.util.List; import java.util.Objects; -import java.util.Random; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; + +public class BlockPosWrapper { + private final BlockPos.Mutable blockPos; -//This class wraps the minecraft BlockPos.Mutable (and BlockPos) class -public class BlockPosWrapper -{ - private final BlockPos.Mutable blockPos; - - - public BlockPosWrapper() - { - this.blockPos = new BlockPos.Mutable(0,0,0); - } - - public void set(int x, int y, int z) - { - blockPos.set(x, y, z); - } - - public int getX() - { - return blockPos.getX(); - } - - public int getY() - { - return blockPos.getY(); - } - - public int getZ() - { - return blockPos.getZ(); - } - - public BlockPos.Mutable getBlockPos() - { - return blockPos; - } - - @Override public boolean equals(Object o) - { - return blockPos.equals(o); - } - - @Override public int hashCode() - { - return Objects.hash(blockPos); - } - + public BlockPosWrapper() + { + this.blockPos = new BlockPos.Mutable(0,0,0); + } + + public BlockPosWrapper(int x, int y, int z) + { + this.blockPos = new BlockPos.Mutable(x, y, z); + } + + public void set(int x, int y, int z) + { + blockPos.set(x, y, z); + } + + public int getX() + { + return blockPos.getX(); + } + + public int getY() + { + return blockPos.getY(); + } + + public int getZ() + { + return blockPos.getZ(); + } + + public int get(Direction.Axis axis) + { + return axis.choose(getX(), getY(), getZ()); + } + + public BlockPos.Mutable getBlockPos() + { + return blockPos; + } + + @Override public boolean equals(Object o) + { + return blockPos.equals(o); + } + + @Override public int hashCode() + { + return Objects.hash(blockPos); + } + + public BlockPosWrapper offset(int x, int y, int z) + { + blockPos.set(blockPos.getX() + x, blockPos.getY() + y, blockPos.getZ() + z); + return this; + } + } diff --git a/src/main/java/com/seibel/lod/wrappers/Chunk/ChunkPosWrapper.java b/src/main/java/com/seibel/lod/wrappers/Chunk/ChunkPosWrapper.java index ed93576ce..2e6ff6723 100644 --- a/src/main/java/com/seibel/lod/wrappers/Chunk/ChunkPosWrapper.java +++ b/src/main/java/com/seibel/lod/wrappers/Chunk/ChunkPosWrapper.java @@ -1,5 +1,7 @@ package com.seibel.lod.wrappers.Chunk; +import com.seibel.lod.wrappers.Block.BlockPosWrapper; + import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; @@ -11,9 +13,30 @@ public class ChunkPosWrapper { private final ChunkPos chunkPos; - public ChunkPosWrapper(ChunkPos chunkPos) + public ChunkPosWrapper(ChunkPos newChunkPos) + { + this.chunkPos = newChunkPos; + } + + public ChunkPosWrapper(BlockPos blockPos) + { + this.chunkPos = new ChunkPos(blockPos); + } + + + public ChunkPosWrapper(ChunkPosWrapper newChunkPos) + { + this.chunkPos = newChunkPos.chunkPos; + } + + public ChunkPosWrapper(BlockPosWrapper blockPos) { - this.chunkPos = chunkPos; + this.chunkPos = new ChunkPos(blockPos.getBlockPos()); + } + + public ChunkPosWrapper(int chunkX, int chunkZ) + { + this.chunkPos = new ChunkPos(chunkX, chunkZ); } public int getX() @@ -61,4 +84,9 @@ public class ChunkPosWrapper return Objects.hash(chunkPos); } + public BlockPosWrapper getWorldPosition() + { + BlockPos blockPos = chunkPos.getWorldPosition(); + return new BlockPosWrapper(blockPos.getX(), blockPos.getY(), blockPos.getZ()); + } } diff --git a/src/main/java/com/seibel/lod/wrappers/MinecraftWrapper.java b/src/main/java/com/seibel/lod/wrappers/MinecraftWrapper.java index 8c7c2fcd6..777e2eb26 100644 --- a/src/main/java/com/seibel/lod/wrappers/MinecraftWrapper.java +++ b/src/main/java/com/seibel/lod/wrappers/MinecraftWrapper.java @@ -26,6 +26,8 @@ import com.seibel.lod.ModInfo; import com.seibel.lod.proxy.ClientProxy; import com.seibel.lod.util.LodUtil; +import com.seibel.lod.wrappers.Block.BlockPosWrapper; +import com.seibel.lod.wrappers.Chunk.ChunkPosWrapper; import com.seibel.lod.wrappers.World.WorldWrapper; import net.minecraft.client.GameSettings; import net.minecraft.client.MainWindow; @@ -44,6 +46,8 @@ import net.minecraft.entity.Entity; import net.minecraft.profiler.IProfiler; import net.minecraft.server.integrated.IntegratedServer; import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.DimensionType; import net.minecraft.world.server.ServerWorld; @@ -170,6 +174,17 @@ public class MinecraftWrapper return mc.player; } + public BlockPosWrapper getPlayerBlockPos() + { + BlockPos playerPos = getPlayer().blockPosition(); + return new BlockPosWrapper(playerPos.getX(), playerPos.getY(), playerPos.getZ()); + } + + public ChunkPosWrapper getPlayerChunkPos() + { + return new ChunkPosWrapper(getPlayer().xChunk, getPlayer().zChunk); + } + public GameSettings getOptions() { return mc.options;