registered chunk generators in impl

This commit is contained in:
dfsek
2021-07-07 11:22:47 -07:00
parent 43395fef08
commit 2f55206cf0
5 changed files with 16 additions and 37 deletions

View File

@@ -27,6 +27,7 @@ import com.dfsek.terra.api.registry.meta.RegistryFactory;
import com.dfsek.terra.api.util.generic.pair.ImmutablePair;
import com.dfsek.terra.api.world.TerraWorld;
import com.dfsek.terra.api.util.seeded.BiomeProviderBuilder;
import com.dfsek.terra.api.world.generator.ChunkGeneratorProvider;
import com.dfsek.terra.config.dummy.DummyWorld;
import com.dfsek.terra.config.fileloaders.FolderLoader;
import com.dfsek.terra.config.fileloaders.ZIPLoader;
@@ -362,4 +363,9 @@ public class ConfigPackImpl implements ConfigPack {
public RegistryFactory getRegistryFactory() {
return registryFactory;
}
@Override
public ChunkGeneratorProvider getGeneratorProvider() {
return template.getGeneratorProvider();
}
}

View File

@@ -5,6 +5,7 @@ import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.config.ConfigTemplate;
import com.dfsek.terra.api.addon.TerraAddon;
import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import com.dfsek.terra.api.world.generator.ChunkGeneratorProvider;
import java.util.HashMap;
import java.util.HashSet;
@@ -84,6 +85,13 @@ public class ConfigPackTemplate implements ConfigTemplate {
@Default
private boolean disableFlora = false;
@Value("generator")
private ChunkGeneratorProvider generatorProvider;
public ChunkGeneratorProvider getGeneratorProvider() {
return generatorProvider;
}
public boolean disableCarvers() {
return disableCarvers;
}

View File

@@ -11,7 +11,7 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.generator.SamplerCache;
import com.dfsek.terra.registry.LockedRegistryImpl;
import com.dfsek.terra.registry.OpenRegistryImpl;
import com.dfsek.terra.world.generation.math.SamplerCacheImpl;
import com.dfsek.terra.world.SamplerCacheImpl;
import java.util.HashMap;
import java.util.Map;

View File

@@ -0,0 +1,46 @@
package com.dfsek.terra.world;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.util.MathUtil;
import com.dfsek.terra.api.world.TerraWorld;
import com.dfsek.terra.api.world.generator.Sampler;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import net.jafama.FastMath;
import org.jetbrains.annotations.NotNull;
public class SamplerCacheImpl implements com.dfsek.terra.api.world.generator.SamplerCache {
private final LoadingCache<Long, Sampler> cache;
public SamplerCacheImpl(TerraPlugin main, TerraWorld world) {
cache = CacheBuilder.newBuilder().maximumSize(main.getTerraConfig().getSamplerCache())
.build(new CacheLoader<Long, Sampler>() {
@Override
public Sampler load(@NotNull Long key) {
int cx = (int) (key >> 32);
int cz = (int) key.longValue();
return world.getWorld().getTerraGenerator().createSampler(cx, cz, world.getBiomeProvider(), world.getWorld(), world.getConfig().elevationBlend());
}
});
}
@Override
public Sampler get(int x, int z) {
int cx = FastMath.floorDiv(x, 16);
int cz = FastMath.floorDiv(z, 16);
return getChunk(cx, cz);
}
@Override
public Sampler getChunk(int cx, int cz) {
long key = MathUtil.squash(cx, cz);
return cache.getUnchecked(key);
}
@Override
public void clear() {
cache.invalidateAll();
cache.cleanUp();
}
}

View File

@@ -1,35 +0,0 @@
package com.dfsek.terra.world.carving;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.world.ChunkAccess;
import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.Carver;
import com.dfsek.terra.api.world.generator.ChunkInterpolator;
import com.dfsek.terra.world.generation.math.interpolation.ChunkInterpolator3D;
public class NoiseCarver implements Carver {
private final Range range;
private final BlockState data;
private final TerraPlugin main;
public NoiseCarver(Range range, BlockState data, TerraPlugin main) {
this.range = range;
this.data = data;
this.main = main;
}
@Override
public void carve(World world, int chunkX, int chunkZ, ChunkAccess chunk) {
ChunkInterpolator interpolator = new ChunkInterpolator3D(world, chunkX, chunkZ, main.getWorld(world).getBiomeProvider(), (gen, coord) -> gen.getCarver().getNoise(coord.setY(coord.getY())));
for(int y : range) {
for(int x = 0; x < 16; x++) {
for(int z = 0; z < 16; z++) {
double n = interpolator.getNoise(x, y, z);
if(n > 0) chunk.setBlock(x, y, z, data);
}
}
}
}
}