Finish initial layered generator implementation

This commit is contained in:
Astrash
2022-07-12 13:15:27 +10:00
parent e831f85d45
commit 2a9d94094c
8 changed files with 105 additions and 64 deletions

View File

@@ -1,12 +1,18 @@
package com.dfsek.terra.addons.chunkgenerator;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.function.Supplier;
import com.dfsek.terra.addons.chunkgenerator.config.LayeredChunkGeneratorPackConfigTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.palette.BlockLayerPaletteTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.palette.LayerPalettePackConfigTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate;
import com.dfsek.terra.addons.chunkgenerator.config.predicate.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.resolve.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;
@@ -19,16 +25,10 @@ import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.util.reflection.TypeKey;
import com.dfsek.terra.api.world.chunk.generation.util.provider.ChunkGeneratorProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.function.Supplier;
public class LayeredChunkGeneratorAddon implements AddonInitializer {
@@ -51,34 +51,38 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer {
@Override
public void initialize() {
LayerPalettePackConfigTemplate paletteConfig = new LayerPalettePackConfigTemplate();
LayerPredicatePackConfigTemplate predicateConfig = new LayerPredicatePackConfigTemplate();
LayerResolverPackConfigTemplate resolverConfig = new LayerResolverPackConfigTemplate();
platform.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(addon, ConfigPackPreLoadEvent.class)
.priority(50)
.priority(1000)
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<LayerPalette>>> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN);
paletteRegistry.register(addon.key("BLOCK"), BlockLayerPaletteTemplate::new);
})
.then(event -> {
logger.info("Registering LayerResolvers..");
LayeredChunkGeneratorPackConfigTemplate config = event.loadTemplate(new LayeredChunkGeneratorPackConfigTemplate());
CheckedRegistry<Supplier<ObjectTemplate<LayerResolver>>> resolverRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TOKEN);
resolverRegistry.register(addon.key("PREDICATE"), PredicateLayerResolverTemplate::new);
resolverRegistry.register(addon.key("PALETTE"), () -> new PaletteLayerResolverTemplate(config.getPalettes()));
event.loadTemplate(paletteConfig);
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<LayerPredicate>>> predicateRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TOKEN);
predicateRegistry.register(addon.key("BELOW"), BelowLayerPredicateTemplate::new);
predicateRegistry.register(addon.key("RANGE"), RangeLayerPredicateTemplate::new);
predicateRegistry.register(addon.key("SAMPLER"), SamplerLayerPredicateTemplate::new);
event.loadTemplate(predicateConfig);
})
.then(event -> {
CheckedRegistry<Supplier<ObjectTemplate<LayerResolver>>> resolverRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TOKEN);
resolverRegistry.register(addon.key("TEST_PREDICATE"), () -> new PredicateLayerResolverTemplate(predicateConfig.getPredicates()));
resolverRegistry.register(addon.key("USE_PALETTE"), () -> new PaletteLayerResolverTemplate(paletteConfig.getPalettes()));
event.loadTemplate(resolverConfig);
})
.then(event -> {
LayeredChunkGeneratorPackConfigTemplate config = event.loadTemplate(new LayeredChunkGeneratorPackConfigTemplate());
event.getPack()
.getOrCreateRegistry(ChunkGeneratorProvider.class)
.register(addon.key("LAYERED"),
pack -> new LayeredChunkGenerator(platform, config.getResolver()));
pack -> new LayeredChunkGenerator(platform, resolverConfig.getResolver()));
})
.failThrough();
}

View File

@@ -1,36 +0,0 @@
package com.dfsek.terra.addons.chunkgenerator.config;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver;
import com.dfsek.terra.api.config.meta.Meta;
import com.dfsek.terra.api.noise.NoiseSampler;
import java.util.Map;
public class LayeredChunkGeneratorPackConfigTemplate implements ConfigTemplate {
@Value("generation.sampler")
private @Meta NoiseSampler sampler;
@Value("generation.resolver")
private @Meta LayerResolver resolver;
@Value("generation.palettes")
private @Meta Map<String, LayerPalette> palettes;
public Map<String, LayerPalette> getPalettes() {
return palettes;
}
public NoiseSampler getSampler() {
return sampler;
}
public LayerResolver getResolver() {
return resolver;
}
}

View File

@@ -0,0 +1,21 @@
package com.dfsek.terra.addons.chunkgenerator.config.palette;
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.layer.palette.LayerPalette;
import com.dfsek.terra.api.config.meta.Meta;
public class LayerPalettePackConfigTemplate implements ConfigTemplate {
@Value("generation.palettes")
private @Meta Map<String, LayerPalette> palettes;
public Map<String, LayerPalette> getPalettes() {
return palettes;
}
}

View File

@@ -0,0 +1,21 @@
package com.dfsek.terra.addons.chunkgenerator.config.predicate;
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.layer.predicate.LayerPredicate;
import com.dfsek.terra.api.config.meta.Meta;
public class LayerPredicatePackConfigTemplate implements ConfigTemplate {
@Value("generation.predicates")
private @Meta Map<String, LayerPredicate> predicates;
public Map<String, LayerPredicate> getPredicates() {
return predicates;
}
}

View File

@@ -0,0 +1,18 @@
package com.dfsek.terra.addons.chunkgenerator.config.resolve;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver;
import com.dfsek.terra.api.config.meta.Meta;
public class LayerResolverPackConfigTemplate implements ConfigTemplate {
@Value("generation.resolver")
private @Meta LayerResolver resolver;
public LayerResolver getResolver() {
return resolver;
}
}

View File

@@ -1,8 +1,11 @@
package com.dfsek.terra.addons.chunkgenerator.config.resolve;
import com.dfsek.tectonic.api.config.template.ValidatedConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import com.dfsek.tectonic.api.exception.ValidationException;
import java.util.Map;
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate;
import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver;
@@ -10,10 +13,16 @@ import com.dfsek.terra.addons.chunkgenerator.layer.resolve.PredicateLayerResolve
import com.dfsek.terra.api.config.meta.Meta;
public class PredicateLayerResolverTemplate implements ObjectTemplate<LayerResolver> {
public class PredicateLayerResolverTemplate implements ObjectTemplate<LayerResolver>, ValidatedConfigTemplate {
private final Map<String, LayerPredicate> predicates;
public PredicateLayerResolverTemplate(Map<String, LayerPredicate> predicates) {
this.predicates = predicates;
}
@Value("if")
private @Meta LayerPredicate predicate;
private @Meta String predicate;
@Value("then")
private @Meta LayerResolver trueResolver;
@@ -24,6 +33,12 @@ public class PredicateLayerResolverTemplate implements ObjectTemplate<LayerResol
@Override
public PredicateLayerResolver get() {
return new PredicateLayerResolver(predicate, trueResolver, falseResolver);
return new PredicateLayerResolver(predicates.get(predicate), trueResolver, falseResolver);
}
@Override
public boolean validate() throws ValidationException {
if (!predicates.containsKey(predicate)) throw new ValidationException("The predicate " + predicate + " does not exist!");
return true;
}
}

View File

@@ -1,5 +1,7 @@
package com.dfsek.terra.addons.chunkgenerator.generation;
import org.jetbrains.annotations.NotNull;
import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette;
import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver;
import com.dfsek.terra.api.Platform;
@@ -12,8 +14,6 @@ import com.dfsek.terra.api.world.chunk.generation.ProtoChunk;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
import com.dfsek.terra.api.world.info.WorldProperties;
import org.jetbrains.annotations.NotNull;
public class LayeredChunkGenerator implements ChunkGenerator {
@@ -48,7 +48,7 @@ public class LayeredChunkGenerator implements ChunkGenerator {
Biome biome = biomeColumn.get(y);
LayerPalette layerPalette = resolver.resolve(seed, biome, x, y, z);
LayerPalette layerPalette = resolver.resolve(seed, biome, cx, y, cz);
if (previousLayerPalette == layerPalette) {
paletteLevel++;
@@ -57,9 +57,9 @@ public class LayeredChunkGenerator implements ChunkGenerator {
}
previousLayerPalette = layerPalette;
Palette palette = layerPalette.get(seed, biome, x, y, z);
Palette palette = layerPalette.get(seed, biome, cx, y, cz);
chunk.setBlock(cx, y, cz, palette.get(paletteLevel, x, y, z, seed));
chunk.setBlock(cx, y, cz, palette.get(paletteLevel, cx, y, cz, seed));
}
}

View File

@@ -2,8 +2,6 @@ package com.dfsek.terra.addons.chunkgenerator.layer.palette;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
import com.dfsek.terra.api.world.info.WorldProperties;
public interface LayerPalette {