mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-04-07 16:26:13 +00:00
Implement layer samplers
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user