Improve how LodWorld, LodBuilder, and LodRenderer objects are handled to prevent multiple references

There was a problem where upon changing worlds the LodWorld wouldn't reflect the commit along with 6c515350 and fccd1db0 should fix that problem.
This commit is contained in:
James Seibel
2021-03-31 14:22:35 -05:00
parent fccd1db045
commit 5ca5764c0e
4 changed files with 54 additions and 58 deletions
@@ -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);
}
@@ -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;
}
@@ -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();
@@ -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;
}
}