From 709180de13ddd354c362e1175583c201953b3af2 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 21 Mar 2021 22:25:19 -0700 Subject: [PATCH] multithread structure and cave population --- .../fabric/world/features/PopulatorFeature.java | 3 --- .../generator/FabricChunkGeneratorWrapper.java | 14 +++++--------- .../terra/fabric/world/handles/FabricWorld.java | 2 +- .../fabric/world/handles/chunk/FabricChunk.java | 11 ++++++++--- .../world/handles/world/FabricWorldHandle.java | 3 ++- 5 files changed, 16 insertions(+), 17 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java index 7e680de95..886b0f99c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java @@ -4,7 +4,6 @@ import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.world.handles.FabricWorld; import com.dfsek.terra.fabric.world.handles.chunk.FabricChunkWorldAccess; -import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; import com.mojang.serialization.Codec; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; @@ -29,8 +28,6 @@ public class PopulatorFeature extends Feature { FabricChunkGeneratorWrapper gen = (FabricChunkGeneratorWrapper) chunkGenerator; FabricChunkWorldAccess chunk = new FabricChunkWorldAccess(world, pos.getX() >> 4, pos.getZ() >> 4); FabricWorld world1 = new FabricWorld(world.toServerWorld(), new FabricChunkGenerator(chunkGenerator)); - gen.getCavePopulator().populate(new FabricWorldAccess(world), chunk); - gen.getStructurePopulator().populate(new FabricWorldAccess(world), chunk); gen.getOrePopulator().populate(world1, chunk); gen.getTreePopulator().populate(world1, chunk); gen.getFloraPopulator().populate(world1, chunk); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index 658e8b799..cb0eb1092 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -7,6 +7,7 @@ import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.mixin.StructureAccessorAccessor; import com.dfsek.terra.fabric.world.TerraBiomeSource; +import com.dfsek.terra.fabric.world.handles.chunk.FabricChunk; import com.dfsek.terra.fabric.world.handles.world.FabricSeededWorldAccess; import com.dfsek.terra.world.generation.generators.DefaultChunkGenerator3D; import com.dfsek.terra.world.population.CavePopulator; @@ -34,7 +35,6 @@ import net.minecraft.world.gen.chunk.VerticalBlockSample; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; -import java.util.concurrent.Executors; public class FabricChunkGeneratorWrapper extends ChunkGenerator implements GeneratorWrapper { private final long seed; @@ -72,14 +72,6 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener return floraPopulator; } - public StructurePopulator getStructurePopulator() { - return structurePopulator; - } - - public CavePopulator getCavePopulator() { - return cavePopulator; - } - public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed, ConfigPack configPack) { super(biomeSource, new StructuresConfig(false)); this.pack = configPack; @@ -126,7 +118,11 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener public CompletableFuture populateNoise(Executor executor, StructureAccessor accessor, Chunk chunk) { return CompletableFuture.supplyAsync(() -> { FabricSeededWorldAccess worldAccess = new FabricSeededWorldAccess(((StructureAccessorAccessor) accessor).getWorld(), seed, this); + com.dfsek.terra.api.platform.world.Chunk c = new FabricChunk(worldAccess, chunk); + delegate.generateChunkData(worldAccess, new FastRandom(), chunk.getPos().x, chunk.getPos().z, new FabricChunkData(chunk)); + cavePopulator.populate(worldAccess, c); + structurePopulator.populate(worldAccess, c); return chunk; }, executor); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java index 54609e286..272cd6760 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java @@ -60,7 +60,7 @@ public class FabricWorld implements World, FabricWorldHandle { @Override public Chunk getChunkAt(int x, int z) { - return new FabricChunk(delegate.world.getChunk(x, z)); + return new FabricChunk(this, delegate.world.getChunk(x, z)); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java index f9b488fdf..bc78f34c8 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java @@ -4,14 +4,18 @@ import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.block.FabricBlockData; +import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle; import net.minecraft.util.math.BlockPos; import org.jetbrains.annotations.NotNull; public class FabricChunk implements Chunk { private final net.minecraft.world.chunk.Chunk chunk; + private final FabricWorldHandle worldHandle; - public FabricChunk(net.minecraft.world.chunk.Chunk chunk) { + public FabricChunk(FabricWorldHandle worldHandle, net.minecraft.world.chunk.Chunk chunk) { + this.worldHandle = worldHandle; this.chunk = chunk; } @@ -27,12 +31,13 @@ public class FabricChunk implements Chunk { @Override public World getWorld() { - return null; + return worldHandle; } @Override public Block getBlock(int x, int y, int z) { - return null; + BlockPos pos = new BlockPos(x + (chunk.getPos().x << 4), y, z + (chunk.getPos().z << 4)); + return new FabricBlock(pos, worldHandle.getWorld()); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldHandle.java index 7565201aa..223b0c07f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldHandle.java @@ -1,7 +1,8 @@ package com.dfsek.terra.fabric.world.handles.world; +import com.dfsek.terra.api.platform.world.World; import net.minecraft.world.WorldAccess; -public interface FabricWorldHandle { +public interface FabricWorldHandle extends World { WorldAccess getWorld(); }