Implement biome defined layer samplers

This commit is contained in:
Astrash
2022-07-18 12:00:28 +10:00
parent 7baace047b
commit c733c21e3c
4 changed files with 104 additions and 2 deletions
@@ -23,11 +23,13 @@ import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredic
import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerListLayerPredicateTemplate;
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.BiomeDefinedLayerSamplerTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.sampler.SimpleLayerSamplerTemplate;
import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator;
import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette;
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerListLayerPredicate.CoordinateTest;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler;
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
import com.dfsek.terra.api.Platform;
@@ -83,6 +85,7 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer {
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);
samplerTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerSamplerTemplate::new);
event.loadTemplate(new LayerSamplerPackConfigTemplate()).getSamplers().forEach((key, sampler) -> {
samplerRegistry.register(addon.key(key), new InstanceWrapper<>(sampler));
@@ -134,6 +137,7 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer {
.getHandler(FunctionalEventHandler.class)
.register(addon, ConfigurationLoadEvent.class)
.priority(1000)
.then(BiomeDefinedLayerPalette.injectLayerPalettes);
.then(BiomeDefinedLayerPalette.injectLayerPalettes)
.then(BiomeDefinedLayerSampler.injectLayerSamplers);
}
}
@@ -0,0 +1,23 @@
package com.dfsek.terra.addons.chunkgenerator.config.sampler;
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.LayerSampler;
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.terra.api.noise.NoiseSampler;
public class BiomeDefinedLayerSamplerTemplate implements ObjectTemplate<LayerSampler> {
@Value("default")
@Default
private @Meta NoiseSampler defaultSampler = null;
@Override
public LayerSampler get() {
return new BiomeDefinedLayerSampler(defaultSampler);
}
}
@@ -49,7 +49,7 @@ public class BiomeDefinedLayerPalette extends LayerPalette {
String id = registryKey.getID();
String fieldName = id + "LayerPalette";
paletteFields.put(biomeLayerPalette, fieldName);
DynamicValue.Builder<Palette> value = DynamicValue.builder("layers." + id, Palette.class);
DynamicValue.Builder<Palette> value = DynamicValue.builder("generation.layers." + id, Palette.class);
biomeLayerPalette.getDefaultPalette().ifPresent(value::setDefault);
templateBuilder.value(fieldName, value.build());
}
@@ -0,0 +1,75 @@
package com.dfsek.terra.addons.chunkgenerator.layer.sampler;
import com.dfsek.tectonic.api.config.template.dynamic.DynamicTemplate;
import com.dfsek.tectonic.api.config.template.dynamic.DynamicValue;
import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import com.dfsek.terra.addons.chunkgenerator.LayeredChunkGeneratorAddon;
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.properties.Properties;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.info.WorldProperties;
public class BiomeDefinedLayerSampler implements LayerSampler {
private final NoiseSampler defaultSampler;
public BiomeDefinedLayerSampler(@Nullable NoiseSampler defaultSampler) {
this.defaultSampler = defaultSampler;
}
@Override
public double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
return biomeProvider.getBiome(x, y, z, world.getSeed())
.getContext()
.get(BiomeLayerSamplers.class)
.samplers()
.get(this)
.noise(world.getSeed(), x, y, z);
}
private Optional<NoiseSampler> getDefaultSampler() {
return Optional.ofNullable(defaultSampler);
}
public static Consumer<ConfigurationLoadEvent> injectLayerSamplers = event -> {
if(event.is(Biome.class)) {
Map<BiomeDefinedLayerSampler, String> samplerFields = new HashMap<>();
DynamicTemplate.Builder templateBuilder = DynamicTemplate.builder();
event.getPack().getRegistry(LayeredChunkGeneratorAddon.LAYER_SAMPLER_TOKEN).forEach((registryKey, registryEntry) -> {
LayerSampler layerSampler = registryEntry.get();
if (layerSampler instanceof BiomeDefinedLayerSampler biomeLayerSampler) {
String id = registryKey.getID();
String fieldName = id + "LayerSampler";
samplerFields.put(biomeLayerSampler, fieldName);
DynamicValue.Builder<NoiseSampler> value = DynamicValue.builder("generation.samplers." + id, NoiseSampler.class);
biomeLayerSampler.getDefaultSampler().ifPresent(value::setDefault);
templateBuilder.value(fieldName, value.build());
}
});
DynamicTemplate layerSamplerBiomeTemplate = event.load(templateBuilder.build());
Map<BiomeDefinedLayerSampler, NoiseSampler> samplerMap = samplerFields.entrySet().stream().collect(
Collectors.toMap(Entry::getKey, entry -> layerSamplerBiomeTemplate.get(entry.getValue(), NoiseSampler.class)));
event.getLoadedObject(Biome.class).getContext().put(new BiomeLayerSamplers(samplerMap));
}
};
public record BiomeLayerSamplers(Map<BiomeDefinedLayerSampler, NoiseSampler> samplers) implements Properties {
}
}