Implement layer samplers

This commit is contained in:
Astrash
2022-07-16 17:03:28 +10:00
parent 809a6422a1
commit 698725c921
7 changed files with 121 additions and 18 deletions

View File

@@ -6,19 +6,22 @@ import org.slf4j.LoggerFactory;
import java.util.function.Supplier;
import com.dfsek.terra.addons.chunkgenerator.config.palette.BlockLayerPaletteTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPalettePackConfigTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPredicatePackConfigTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredicateTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerResolverPackConfigTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.resolve.PaletteLayerResolverTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.resolve.PredicateLayerResolverTemplate;
import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPalettePackConfigTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPredicatePackConfigTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerResolverPackConfigTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerSamplerPackConfigTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.palette.BlockLayerPaletteTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredicateTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.resolve.PaletteLayerResolverTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.resolve.PredicateLayerResolverTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.sampler.SimpleLayerSamplerTemplate;
import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator;
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
import com.dfsek.terra.api.Platform;
@@ -35,6 +38,12 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer {
private static final Logger logger = LoggerFactory.getLogger(LayeredChunkGenerator.class);
public static final TypeKey<Supplier<ObjectTemplate<LayerSampler>>> LAYER_SAMPLER_TYPE_TOKEN = new TypeKey<>() {
};
public static final TypeKey<InstanceWrapper<LayerSampler>> LAYER_SAMPLER_TOKEN = new TypeKey<>() {
};
public static final TypeKey<Supplier<ObjectTemplate<LayerPalette>>> LAYER_PALETTE_TYPE_TOKEN = new TypeKey<>() {
};
@@ -63,6 +72,14 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer {
.getHandler(FunctionalEventHandler.class)
.register(addon, ConfigPackPreLoadEvent.class)
.priority(1000)
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<LayerSampler>>> samplerTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TYPE_TOKEN);
CheckedRegistry<InstanceWrapper<LayerSampler>> samplerRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TOKEN);
samplerTypeRegistry.register(addon.key("SIMPLE"), SimpleLayerSamplerTemplate::new);
event.loadTemplate(new LayerSamplerPackConfigTemplate()).getSamplers().forEach((key, sampler) -> {
samplerRegistry.register(addon.key(key), new InstanceWrapper<>(sampler));
});
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<LayerPalette>>> paletteTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TYPE_TOKEN);
paletteTypeRegistry.register(addon.key("BLOCK"), BlockLayerPaletteTemplate::new);

View File

@@ -0,0 +1,11 @@
package com.dfsek.terra.addons.chunkgenerator.api;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.world.biome.Biome;
public interface LayerSampler {
double sample(long seed, Biome biome, int x, int y, int z);
NoiseSampler getSampler();
}

View File

@@ -0,0 +1,21 @@
package com.dfsek.terra.addons.chunkgenerator.config.pack;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import java.util.Map;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.api.config.meta.Meta;
public class LayerSamplerPackConfigTemplate implements ConfigTemplate {
@Value("generation.samplers")
private @Meta Map<String, LayerSampler> samplers;
public Map<String, LayerSampler> getSamplers() {
return samplers;
}
}

View File

@@ -1,21 +1,27 @@
package com.dfsek.terra.addons.chunkgenerator.config.predicate;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.terra.api.noise.NoiseSampler;
public class SamplerLayerPredicateTemplate implements ObjectTemplate<LayerPredicate> {
@Value("sampler")
private @Meta NoiseSampler sampler;
private @Meta InstanceWrapper<LayerSampler> sampler;
@Value("threshold")
@Default
private double threshold = 0;
@Override
public LayerPredicate get() {
return new SamplerLayerPredicate(sampler);
return new SamplerLayerPredicate(sampler.get(), threshold);
}
}

View File

@@ -0,0 +1,21 @@
package com.dfsek.terra.addons.chunkgenerator.config.sampler;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.SimpleLayerSampler;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.terra.api.noise.NoiseSampler;
public class SimpleLayerSamplerTemplate implements ObjectTemplate<LayerSampler> {
@Value("sampler")
private @Meta NoiseSampler sampler;
@Override
public LayerSampler get() {
return new SimpleLayerSampler(sampler);
}
}

View File

@@ -1,21 +1,23 @@
package com.dfsek.terra.addons.chunkgenerator.layer.predicate;
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.api.world.biome.Biome;
public class SamplerLayerPredicate implements LayerPredicate {
private final NoiseSampler sampler;
private final LayerSampler sampler;
public SamplerLayerPredicate(NoiseSampler sampler) {
private final double threshold;
public SamplerLayerPredicate(LayerSampler sampler, double threshold) {
this.sampler = sampler;
this.threshold = threshold;
}
@Override
public boolean test(long seed, Biome biome, int x, int y, int z) {
return sampler.noise(seed, x, y, z) > 0;
return sampler.sample(seed, biome, x, y, z) > threshold;
}
}

View File

@@ -0,0 +1,25 @@
package com.dfsek.terra.addons.chunkgenerator.layer.sampler;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.world.biome.Biome;
public class SimpleLayerSampler implements LayerSampler {
private NoiseSampler sampler;
public SimpleLayerSampler(NoiseSampler sampler) {
this.sampler = sampler;
}
@Override
public double sample(long seed, Biome biome, int x, int y, int z) {
return sampler.noise(seed, x, y, z);
}
@Override
public NoiseSampler getSampler() {
return sampler;
}
}