From 5f60cd8d4d022296e8b51ffb3d130b6c22035af2 Mon Sep 17 00:00:00 2001 From: tom lee Date: Mon, 20 Dec 2021 14:31:32 +0800 Subject: [PATCH] WorldGen: Added thread timeout failsafe --- .../java/com/seibel/lod/common/Config.java | 3 +- .../ExperimentalGenerator.java | 57 ++----- .../worldGeneration/WorldGenerationStep.java | 141 ++++++++++++------ 3 files changed, 115 insertions(+), 86 deletions(-) diff --git a/common/src/main/java/com/seibel/lod/common/Config.java b/common/src/main/java/com/seibel/lod/common/Config.java index 3b61b6069..ea7b66a19 100644 --- a/common/src/main/java/com/seibel/lod/common/Config.java +++ b/common/src/main/java/com/seibel/lod/common/Config.java @@ -121,9 +121,10 @@ public class Config extends ConfigGui @Entry public static FogDrawMode fogDrawMode = IFogQuality.FOG_DRAW_MODE_DEFAULT; + // FIXME: Currently worldFogColor gives black. @Category("client.graphics.fogQuality") @Entry - public static FogColorMode fogColorMode = IFogQuality.FOG_COLOR_MODE_DEFAULT; + public static FogColorMode fogColorMode = FogColorMode.USE_SKY_COLOR; //IFogQuality.FOG_COLOR_MODE_DEFAULT; @Category("client.graphics.fogQuality") @Entry diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/ExperimentalGenerator.java b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/ExperimentalGenerator.java index 0028c0b2b..cdf5e1dc5 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/ExperimentalGenerator.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/ExperimentalGenerator.java @@ -4,8 +4,10 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; import com.seibel.lod.common.wrappers.world.WorldWrapper; +import com.seibel.lod.common.wrappers.worldGeneration.WorldGenerationStep.GenerationEvent; import com.seibel.lod.common.wrappers.worldGeneration.WorldGenerationStep.Steps; import com.seibel.lod.core.builders.lodBuilding.LodBuilder; import com.seibel.lod.core.enums.config.DistanceGenerationMode; @@ -21,44 +23,14 @@ import com.seibel.lod.core.wrapperInterfaces.worldGeneration.AbstractExperimenta import net.minecraft.world.level.ChunkPos; public class ExperimentalGenerator extends AbstractExperimentalWorldGeneratorWrapper { - private static class GenerationEvent { - private static int generationFutureDebugIDs = 0; - ChunkPos p; - int r; - Future f; - public GenerationEvent(ChunkPos pos, int range, WorldGenerationStep generationGroup) { - p = pos; - r = range; - f = generationGroup.executors.submit(() -> { - generationGroup.generateLodFromList(generationFutureDebugIDs++, pos, range, - Steps.Features); - }); - } - public boolean isCompleted() { - return f.isDone(); - } - public void join() { - try { - f.get(); - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - } - public boolean tooClose(int cx, int cz, int cr) { - int dist = Math.min(Math.abs(cx - p.x), Math.abs(cz - p.z)); - return dist future; + long nanotime; + int id; + Steps target; + + public GenerationEvent(ChunkPos pos, int range, WorldGenerationStep generationGroup, Steps target) { + nanotime = System.nanoTime(); + this.pos = pos; + this.range = range; + id = generationFutureDebugIDs++; + this.target = target; + future = generationGroup.executors.submit(() -> { + generationGroup.generateLodFromList(this); + }); + } + public boolean isCompleted() { + return future.isDone(); + } + public boolean hasTimeout(int duration, TimeUnit unit) { + long currentTime = System.nanoTime(); + long delta = currentTime - nanotime; + return (delta > TimeUnit.NANOSECONDS.convert(duration, unit)); + } + public void terminate() { + future.cancel(true); + } + public void join() { + try { + future.get(); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + public boolean tooClose(int cx, int cz, int cr) { + int dist = Math.min(Math.abs(cx - pos.x), Math.abs(cz - pos.z)); + return dist T joinAsync(CompletableFuture f) { //while (!f.isDone()) Thread.yield(); @@ -155,39 +216,41 @@ public class WorldGenerationStep { return chunk; } - public void generateLodFromList(int i, ChunkPos pos, int range, Steps step) { - System.out.println(i+": generateLodFromList("+pos.toString()+", "+range+", "+step+")"); + public void generateLodFromList(GenerationEvent event) { + + System.out.println("Started event: "+event); GridList referencedChunks; DistanceGenerationMode generationMode; - switch (step) { + Runnable lambda = () -> {event.refreshTimeout();}; + switch (event.target) { case Empty: return; case StructureStart: - referencedChunks = generateStructureStart(pos, range); + referencedChunks = generateStructureStart(lambda, event.pos, event.range); generationMode = DistanceGenerationMode.NONE; break; case StructureReference: - referencedChunks = generateStructureReference(pos, range); + referencedChunks = generateStructureReference(lambda, event.pos, event.range); generationMode = DistanceGenerationMode.NONE; break; case Biomes: - referencedChunks = generateBiomes(pos, range); + referencedChunks = generateBiomes(lambda, event.pos, event.range); generationMode = DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT; break; case Noise: - referencedChunks = generateNoise(pos, range); + referencedChunks = generateNoise(lambda, event.pos, event.range); generationMode = DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT; break; case Surface: - referencedChunks = generateSurface(pos, range); + referencedChunks = generateSurface(lambda, event.pos, event.range); generationMode = DistanceGenerationMode.SURFACE; break; case Carvers: - referencedChunks = generateCarvers(pos, range); + referencedChunks = generateCarvers(lambda, event.pos, event.range); generationMode = DistanceGenerationMode.SURFACE; break; case Features: - referencedChunks = generateFeatures(pos, range); + referencedChunks = generateFeatures(lambda, event.pos, event.range); generationMode = DistanceGenerationMode.FEATURES; break; case LiquidCarvers: @@ -199,27 +262,25 @@ public class WorldGenerationStep { } int centreIndex = referencedChunks.size() / 2; - for (int ox = -range; ox <= range; ox++) { - for (int oy = -range; oy <= range; oy++) { + for (int ox = -event.range; ox <= event.range; ox++) { + for (int oy = -event.range; oy <= event.range; oy++) { int targetIndex = referencedChunks.offsetOf(centreIndex, ox, oy); ChunkSynconizer target = referencedChunks.get(targetIndex); lodBuilder.generateLodNodeFromChunk(lodDim, new ChunkWrapper(target.chunk), new LodBuilderConfig(generationMode)); } } + lambda.run(); for (ChunkSynconizer sync : referencedChunks) { chunks.remove(sync.chunk.getPos().toLong()); } - - System.out.println(i+": EXIT: generateLodFromList("+pos.toString()+", "+range+", "+step+")"); + System.out.println("Ended event: "+event); } - public GridList generateStructureStart(ChunkPos pos, int range) { - //System.out.println("generateStructureStart("+pos.toString()+", "+range+")"); + public GridList generateStructureStart(Runnable r, ChunkPos pos, int range) { int cx = pos.x; int cy = pos.z; GridList chunks = new GridList(range); - for (int ox = -range; ox <= range; ox++) { for (int oy = -range; oy <= range; oy++) { ChunkSynconizer target = getChunkSynconizer(toLongPos(cx + ox, cy + oy)); @@ -242,14 +303,13 @@ public class WorldGenerationStep { } } } - //System.out.println("EXIT: generateStructureStart("+pos.toString()+", "+range+") -> "+chunks); + r.run(); return chunks; } - public GridList generateStructureReference(ChunkPos pos, int range) { + public GridList generateStructureReference(Runnable r, ChunkPos pos, int range) { int prestepRange = range + StepStructureReference.RANGE; - GridList referencedChunks = generateStructureStart(pos, prestepRange); - //System.out.println("generateStructureReference(" + pos.toString() + ", " + range + ")"); + GridList referencedChunks = generateStructureStart(r, pos, prestepRange); int centreIndex = referencedChunks.size() / 2; for (int ox = -range; ox <= range; ox++) { @@ -275,15 +335,13 @@ public class WorldGenerationStep { } } } - //System.out.println( - // "EXIT: generateStructureReference(" + pos.toString() + ", " + range + ") -> " + referencedChunks); + r.run(); return referencedChunks; } - public GridList generateBiomes(ChunkPos pos, int range) { + public GridList generateBiomes(Runnable r, ChunkPos pos, int range) { int prestepRange = range + 1; - GridList referencedChunks = generateStructureReference(pos, prestepRange); - //System.out.println("generateBiomes("+pos.toString()+", "+range+")"); + GridList referencedChunks = generateStructureReference(r, pos, prestepRange); int centreIndex = referencedChunks.size() / 2; for (int ox = -range; ox <= range; ox++) { @@ -308,15 +366,13 @@ public class WorldGenerationStep { } } } - //System.out.println("EXIT: generateBiomes("+pos.toString()+", "+range+") -> "+referencedChunks); + r.run(); return referencedChunks; } - public GridList generateNoise(ChunkPos pos, int range) { - // System.out.println("generateNoise("+pos.toString()+", "+range+")"); + public GridList generateNoise(Runnable r, ChunkPos pos, int range) { int prestepRange = range + 1; - GridList referencedChunks = generateBiomes(pos, prestepRange); - //System.out.println("generateNoise("+pos.toString()+", "+range+")"); + GridList referencedChunks = generateBiomes(r, pos, prestepRange); int centreIndex = referencedChunks.size() / 2; for (int ox = -range; ox <= range; ox++) { @@ -342,14 +398,13 @@ public class WorldGenerationStep { } } } - //System.out.println("EXIT: generateNoise(" + pos.toString() + ", " + range + ") -> " + referencedChunks); + r.run(); return referencedChunks; } - public GridList generateSurface(ChunkPos pos, int range) { + public GridList generateSurface(Runnable r, ChunkPos pos, int range) { int prestepRange = range + 1; - GridList referencedChunks = generateNoise(pos, prestepRange); - //System.out.println("generateSurface("+pos.toString()+", "+range+")"); + GridList referencedChunks = generateNoise(r, pos, prestepRange); int centreIndex = referencedChunks.size() / 2; for (int ox = -range; ox <= range; ox++) { @@ -376,15 +431,14 @@ public class WorldGenerationStep { } } } - //System.out.println("EXIT: generateNoise(" + pos.toString() + ", " + range + ") -> " + referencedChunks); + r.run(); return referencedChunks; } - public GridList generateCarvers(ChunkPos pos, int range) { + public GridList generateCarvers(Runnable r, ChunkPos pos, int range) { int prestepRange = range + 1; - GridList referencedChunks = generateSurface(pos, prestepRange); - //System.out.println("generateCarvers("+pos.toString()+", "+range+")"); + GridList referencedChunks = generateSurface(r, pos, prestepRange); int centreIndex = referencedChunks.size() / 2; for (int ox = -range; ox <= range; ox++) { @@ -410,15 +464,14 @@ public class WorldGenerationStep { } } } - //System.out.println("EXIT: generateNoise(" + pos.toString() + ", " + range + ") -> " + referencedChunks); + r.run(); return referencedChunks; } - public GridList generateFeatures(ChunkPos pos, int range) { + public GridList generateFeatures(Runnable r, ChunkPos pos, int range) { int prestepRange = range + 1; - GridList referencedChunks = generateCarvers(pos, prestepRange); - //System.out.println("generateFeatures("+pos.toString()+", "+range+")"); + GridList referencedChunks = generateCarvers(r, pos, prestepRange); int centreIndex = referencedChunks.size() / 2; for (int ox = -range; ox <= range; ox++) { @@ -444,7 +497,7 @@ public class WorldGenerationStep { } } } - //System.out.println("EXIT: generateNoise(" + pos.toString() + ", " + range + ") -> " + referencedChunks); + r.run(); return referencedChunks; }