diff --git a/src/main/java/com/backsun/lod/builders/LodBufferBuilder.java b/src/main/java/com/backsun/lod/builders/LodBufferBuilder.java index 724a5cabb..762e8cb4f 100644 --- a/src/main/java/com/backsun/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/backsun/lod/builders/LodBufferBuilder.java @@ -8,6 +8,7 @@ import org.lwjgl.opengl.GL11; import com.backsun.lod.enums.ColorDirection; import com.backsun.lod.enums.LodCorner; import com.backsun.lod.objects.LodChunk; +import com.backsun.lod.objects.LodDimension; import com.backsun.lod.objects.NearFarBuffer; import com.backsun.lod.renderer.LodRenderer; @@ -75,7 +76,7 @@ public class LodBufferBuilder * After the buildable buffers have been generated they must be * swapped with the drawable buffers in the LodRenderer to be drawn. */ - public void generateLodBuffersAsync(LodRenderer renderer, + public void generateLodBuffersAsync(LodRenderer renderer, LodDimension lodDim, double playerX, double playerZ, int numbChunksWide) { // only allow one generation process to happen at a time @@ -148,7 +149,7 @@ public class LodBufferBuilder int chunkX = i + (startX / LodChunk.WIDTH); int chunkZ = j + (startZ / LodChunk.WIDTH); - LodChunk lod = renderer.lodDimension.getLodFromCoordinates(chunkX, chunkZ); + LodChunk lod = lodDim.getLodFromCoordinates(chunkX, chunkZ); if (lod == null || lod.isLodEmpty()) { // note: for some reason if any color or lod objects are set here @@ -247,11 +248,11 @@ public class LodBufferBuilder LodChunk placeholder = new LodChunk(); placeholder.x = chunkPos.x; placeholder.z = chunkPos.z; - renderer.lodDimension.addLod(placeholder); + lodDim.addLod(placeholder); numChunksWaitingToGen++; - LodChunkGenWorker genWorker = new LodChunkGenWorker(chunkPos, renderer, lodBuilder, this, renderer.lodDimension); + LodChunkGenWorker genWorker = new LodChunkGenWorker(chunkPos, renderer, lodBuilder, this, lodDim); WorldWorkerManager.addWorker(genWorker); } diff --git a/src/main/java/com/backsun/lod/builders/LodBuilder.java b/src/main/java/com/backsun/lod/builders/LodBuilder.java index 2968efaa4..a7f8e3594 100644 --- a/src/main/java/com/backsun/lod/builders/LodBuilder.java +++ b/src/main/java/com/backsun/lod/builders/LodBuilder.java @@ -6,7 +6,6 @@ import java.util.concurrent.Executors; import com.backsun.lod.enums.ColorDirection; import com.backsun.lod.enums.LodLocation; -import com.backsun.lod.handlers.LodDimensionFileHandler; import com.backsun.lod.objects.LodChunk; import com.backsun.lod.objects.LodDimension; import com.backsun.lod.objects.LodWorld; @@ -33,7 +32,6 @@ import net.minecraft.world.server.ServerWorld; public class LodBuilder { private ExecutorService lodGenThreadPool = Executors.newSingleThreadExecutor(); - public volatile LodWorld lodWorld; /** Default size of any LOD regions we use */ public int regionWidth = 5; @@ -59,12 +57,7 @@ public class LodBuilder - /** - * Returns LodWorld so that it can be passed - * to the LodRenderer. - * @param dimensionType - */ - public LodWorld generateLodChunkAsync(IChunk chunk, DimensionType dim) + public void generateLodChunkAsync(IChunk chunk, LodWorld lodWorld, DimensionType dim) { if (lodWorld == null) return; @@ -79,16 +72,12 @@ public class LodBuilder // don't try to create an LOD object // if for some reason we aren't // given a valid chunk object - // (Minecraft often gives back empty - // or null chunks in this method) if (chunk == null || !LodUtils.chunkHasBlockData(chunk)) - return lodWorld; + return; ServerWorld world = LodUtils.getServerWorldFromDimension(dim); - - if (world == null) - return lodWorld; + return; Thread thread = new Thread(() -> { @@ -98,12 +87,6 @@ public class LodBuilder LodDimension lodDim; - if (lodWorld == null) - { - lodWorld = new LodWorld(LodDimensionFileHandler.getCurrentWorldID()); - } - - if (lodWorld.getLodDimension(dim) == null) { lodDim = new LodDimension(dim, regionWidth); @@ -125,7 +108,7 @@ public class LodBuilder }); lodGenThreadPool.execute(thread); - return lodWorld; + return; } diff --git a/src/main/java/com/backsun/lod/builders/LodChunkGenWorker.java b/src/main/java/com/backsun/lod/builders/LodChunkGenWorker.java index ffc20cdeb..c10103379 100644 --- a/src/main/java/com/backsun/lod/builders/LodChunkGenWorker.java +++ b/src/main/java/com/backsun/lod/builders/LodChunkGenWorker.java @@ -1,26 +1,8 @@ -/* - * Minecraft Forge - * Copyright (c) 2016-2020. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation version 2.1 - * of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - package com.backsun.lod.builders; import com.backsun.lod.objects.LodDimension; import com.backsun.lod.objects.LodRegion; +import com.backsun.lod.proxy.ClientProxy; import com.backsun.lod.renderer.LodRenderer; import com.backsun.lod.util.LodUtils; @@ -34,7 +16,7 @@ import net.minecraftforge.common.WorldWorkerManager.IWorker; * This is used to generate a LodChunk at a given ChunkPos. * * @author James Seibel - * @version 03-25-2021 + * @version 03-31-2021 */ public class LodChunkGenWorker implements IWorker { @@ -45,7 +27,9 @@ public class LodChunkGenWorker implements IWorker private LodBufferBuilder lodBufferBuilder; private LodRenderer lodRenderer; - public LodChunkGenWorker(ChunkPos newPos, LodRenderer newLodRenderer, LodBuilder newLodBuilder, LodBufferBuilder newLodBufferBuilder, LodDimension newLodDimension) + public LodChunkGenWorker(ChunkPos newPos, LodRenderer newLodRenderer, + LodBuilder newLodBuilder, LodBufferBuilder newLodBufferBuilder, + LodDimension newLodDimension) { serverWorld = LodUtils.getServerWorldFromDimension(newLodDimension.dimension); pos = newPos; @@ -75,7 +59,7 @@ public class LodChunkGenWorker implements IWorker //System.out.println(endTime - startTime + "\t" + lodBuilder.hasBlockData(chunk)); - lodBuilder.generateLodChunkAsync(chunk, serverWorld.getDimensionType()); + lodBuilder.generateLodChunkAsync(chunk, ClientProxy.getLodWorld(), serverWorld.getDimensionType()); // this is called so that the new LOD chunk is drawn // after it is generated lodRenderer.regenerateLODsNextFrame(); diff --git a/src/main/java/com/backsun/lod/proxy/ClientProxy.java b/src/main/java/com/backsun/lod/proxy/ClientProxy.java index a47fba1b6..10ad04e59 100644 --- a/src/main/java/com/backsun/lod/proxy/ClientProxy.java +++ b/src/main/java/com/backsun/lod/proxy/ClientProxy.java @@ -6,6 +6,7 @@ import com.backsun.lod.objects.LodDimension; import com.backsun.lod.objects.LodRegion; import com.backsun.lod.objects.LodWorld; import com.backsun.lod.renderer.LodRenderer; +import com.backsun.lod.util.LodUtils; import net.minecraft.client.Minecraft; import net.minecraftforge.event.world.BlockEvent; @@ -21,20 +22,20 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; * and is the starting point for most of this program. * * @author James_Seibel - * @version 03-27-2021 + * @version 03-31-2021 */ public class ClientProxy { - private LodRenderer renderer; - private LodWorld lodWorld; - private LodBuilder lodBuilder; + private static LodWorld lodWorld = new LodWorld(); + private static LodBuilder lodBuilder = new LodBuilder(); + private static LodRenderer renderer = new LodRenderer(lodBuilder); + Minecraft mc = Minecraft.getInstance(); public ClientProxy() { - lodBuilder = new LodBuilder(); - renderer = new LodRenderer(lodBuilder); + } @@ -98,16 +99,22 @@ public class ClientProxy @SubscribeEvent public void chunkLoadEvent(ChunkEvent.Load event) { - lodWorld = lodBuilder.generateLodChunkAsync(event.getChunk(), event.getWorld().getDimensionType()); + lodBuilder.generateLodChunkAsync(event.getChunk(), lodWorld, event.getWorld().getDimensionType()); } + @SubscribeEvent + public void worldLoadEvent(WorldEvent.Load event) + { + // update the LodWorld to use the new world the player + // is loaded + lodWorld.selectWorld(LodUtils.getCurrentWorldID()); + } + @SubscribeEvent public void worldUnloadEvent(WorldEvent.Unload event) { - // clear the old LodWorld to make sure - // the correct world is used when changing worlds - lodWorld = null; + lodWorld.deselectWorld(); } @@ -121,8 +128,29 @@ public class ClientProxy event.getClass() == BlockEvent.PortalSpawnEvent.class) { // recreate the LOD where the blocks were changed - lodWorld = lodBuilder.generateLodChunkAsync(event.getWorld().getChunk(event.getPos()), event.getWorld().getDimensionType()); + lodBuilder.generateLodChunkAsync(event.getWorld().getChunk(event.getPos()), lodWorld, event.getWorld().getDimensionType()); } } + + + + //================// + // public getters // + //================// + + public static LodWorld getLodWorld() + { + return lodWorld; + } + + public static LodBuilder getLodBuilder() + { + return lodBuilder; + } + + public static LodRenderer getRenderer() + { + return renderer; + } }