From e671ef783f48341194b57cc463c35885cc6241a7 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 11 Apr 2021 20:56:15 -0700 Subject: [PATCH] completely dynamic registries --- .../structures/script/StructureScript.java | 8 +- .../script/builders/LootFunctionBuilder.java | 7 +- .../builders/StructureFunctionBuilder.java | 7 +- .../script/functions/LootFunction.java | 6 +- .../script/functions/StructureFunction.java | 6 +- .../terra/api/util/seeded/NoiseProvider.java | 9 + .../argument/ScriptArgumentParser.java | 2 +- .../structure/completer/ScriptCompleter.java | 2 +- .../sampler/NoiseSamplerBuilderLoader.java | 7 +- .../dfsek/terra/config/pack/ConfigPack.java | 70 ++-- .../dfsek/terra/config/pack/WorldConfig.java | 7 - .../terra/registry/config/NoiseRegistry.java | 7 +- .../src/test/java/biome/DistributionTest.java | 352 ------------------ common/src/test/java/biome/ImageTest.java | 218 ----------- 14 files changed, 73 insertions(+), 635 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/util/seeded/NoiseProvider.java delete mode 100644 common/src/test/java/biome/DistributionTest.java delete mode 100644 common/src/test/java/biome/ImageTest.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 108b3b101..b4f9439a6 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -3,10 +3,13 @@ package com.dfsek.terra.api.structures.script; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.registry.Registry; +import com.dfsek.terra.api.structures.loot.LootTable; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.script.builders.BinaryNumberFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.BiomeFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; @@ -29,9 +32,6 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.structure.buffer.DirectBuffer; import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer; -import com.dfsek.terra.registry.config.FunctionRegistry; -import com.dfsek.terra.registry.config.LootRegistry; -import com.dfsek.terra.registry.config.ScriptRegistry; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import net.jafama.FastMath; @@ -49,7 +49,7 @@ public class StructureScript { private final TerraPlugin main; private String tempID; - public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry, LootRegistry lootRegistry, FunctionRegistry functionRegistry) throws ParseException { + public StructureScript(InputStream inputStream, TerraPlugin main, Registry registry, Registry lootRegistry, Registry> functionRegistry) throws ParseException { Parser parser; try { parser = new Parser(IOUtils.toString(inputStream)); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/LootFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/LootFunctionBuilder.java index d5e46d9d3..b894743a7 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/LootFunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/LootFunctionBuilder.java @@ -1,21 +1,22 @@ package com.dfsek.terra.api.structures.script.builders; import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.registry.Registry; +import com.dfsek.terra.api.structures.loot.LootTable; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.structures.script.functions.LootFunction; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.registry.config.LootRegistry; import java.util.List; public class LootFunctionBuilder implements FunctionBuilder { private final TerraPlugin main; - private final LootRegistry registry; + private final Registry registry; private final StructureScript script; - public LootFunctionBuilder(TerraPlugin main, LootRegistry registry, StructureScript script) { + public LootFunctionBuilder(TerraPlugin main, Registry registry, StructureScript script) { this.main = main; this.registry = registry; this.script = script; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java index 2b0be8468..918fec245 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java @@ -1,21 +1,22 @@ package com.dfsek.terra.api.structures.script.builders; import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.structures.script.functions.StructureFunction; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.registry.config.ScriptRegistry; import java.util.List; import java.util.stream.Collectors; public class StructureFunctionBuilder implements FunctionBuilder { - private final ScriptRegistry registry; + private final Registry registry; private final TerraPlugin main; - public StructureFunctionBuilder(ScriptRegistry registry, TerraPlugin main) { + public StructureFunctionBuilder(Registry registry, TerraPlugin main) { this.registry = registry; this.main = main; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java index 42add8070..ddbc064cd 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java @@ -3,6 +3,7 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structures.loot.LootTable; import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; @@ -13,20 +14,19 @@ import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.RotationUtil; import com.dfsek.terra.api.structures.structure.buffer.items.BufferedLootApplication; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.registry.config.LootRegistry; import net.jafama.FastMath; import java.util.Map; public class LootFunction implements Function { - private final LootRegistry registry; + private final Registry registry; private final Returnable data; private final Returnable x, y, z; private final Position position; private final TerraPlugin main; private final StructureScript script; - public LootFunction(LootRegistry registry, Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position, StructureScript script) { + public LootFunction(Registry registry, Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position, StructureScript script) { this.registry = registry; this.position = position; this.data = data; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java index 7b9b38830..c0378d60e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java @@ -3,6 +3,7 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; @@ -13,21 +14,20 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.RotationUtil; import com.dfsek.terra.api.structures.structure.buffer.IntermediateBuffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.registry.config.ScriptRegistry; import net.jafama.FastMath; import java.util.List; import java.util.Map; public class StructureFunction implements Function { - private final ScriptRegistry registry; + private final Registry registry; private final Returnable id; private final Returnable x, y, z; private final Position position; private final TerraPlugin main; private final List> rotations; - public StructureFunction(Returnable x, Returnable y, Returnable z, Returnable id, List> rotations, ScriptRegistry registry, Position position, TerraPlugin main) { + public StructureFunction(Returnable x, Returnable y, Returnable z, Returnable id, List> rotations, Registry registry, Position position, TerraPlugin main) { this.registry = registry; this.id = id; this.position = position; diff --git a/common/src/main/java/com/dfsek/terra/api/util/seeded/NoiseProvider.java b/common/src/main/java/com/dfsek/terra/api/util/seeded/NoiseProvider.java new file mode 100644 index 000000000..90b04c3f1 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/util/seeded/NoiseProvider.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.api.util.seeded; + +import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.function.Supplier; + +@FunctionalInterface +public interface NoiseProvider extends Supplier> { +} diff --git a/common/src/main/java/com/dfsek/terra/commands/structure/argument/ScriptArgumentParser.java b/common/src/main/java/com/dfsek/terra/commands/structure/argument/ScriptArgumentParser.java index 3797c08cd..f7d23dee8 100644 --- a/common/src/main/java/com/dfsek/terra/commands/structure/argument/ScriptArgumentParser.java +++ b/common/src/main/java/com/dfsek/terra/commands/structure/argument/ScriptArgumentParser.java @@ -13,6 +13,6 @@ public class ScriptArgumentParser implements ArgumentParser { @Override public StructureScript parse(CommandSender sender, String arg) { - return main.getWorld(((Player) sender).getWorld()).getConfig().getScriptRegistry().get(arg); + return main.getWorld(((Player) sender).getWorld()).getConfig().getRegistry(StructureScript.class).get(arg); } } diff --git a/common/src/main/java/com/dfsek/terra/commands/structure/completer/ScriptCompleter.java b/common/src/main/java/com/dfsek/terra/commands/structure/completer/ScriptCompleter.java index 24f927baa..81e6eba02 100644 --- a/common/src/main/java/com/dfsek/terra/commands/structure/completer/ScriptCompleter.java +++ b/common/src/main/java/com/dfsek/terra/commands/structure/completer/ScriptCompleter.java @@ -16,6 +16,6 @@ public class ScriptCompleter implements TabCompleter { @Override public List complete(CommandSender sender) { - return main.getWorld(((Player) sender).getWorld()).getConfig().getScriptRegistry().entries().stream().map(StructureScript::getId).collect(Collectors.toList()); + return main.getWorld(((Player) sender).getWorld()).getConfig().getRegistry(StructureScript.class).entries().stream().map(StructureScript::getId).collect(Collectors.toList()); } } diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/NoiseSamplerBuilderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/NoiseSamplerBuilderLoader.java index 65ebf9d38..919ace8f7 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/NoiseSamplerBuilderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/NoiseSamplerBuilderLoader.java @@ -6,8 +6,9 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.tectonic.loading.object.ObjectTemplate; +import com.dfsek.terra.api.registry.Registry; +import com.dfsek.terra.api.util.seeded.NoiseProvider; import com.dfsek.terra.api.util.seeded.NoiseSeeded; -import com.dfsek.terra.registry.config.NoiseRegistry; import java.lang.reflect.Type; import java.util.Locale; @@ -15,9 +16,9 @@ import java.util.Map; @SuppressWarnings("unchecked") public class NoiseSamplerBuilderLoader implements TypeLoader { - private final NoiseRegistry noiseRegistry; + private final Registry noiseRegistry; - public NoiseSamplerBuilderLoader(NoiseRegistry noiseRegistry) { + public NoiseSamplerBuilderLoader(Registry noiseRegistry) { this.noiseRegistry = noiseRegistry; } diff --git a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java index d9d1e2be9..07ea5b52a 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java @@ -13,14 +13,16 @@ import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.event.events.config.ConfigPackPostLoadEvent; import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structures.loot.LootTable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.util.generic.pair.ImmutablePair; +import com.dfsek.terra.api.util.seeded.NoiseProvider; import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; import com.dfsek.terra.config.builder.BiomeBuilder; import com.dfsek.terra.config.dummy.DummyWorld; -import com.dfsek.terra.config.factories.ConfigFactory; import com.dfsek.terra.config.fileloaders.FolderLoader; import com.dfsek.terra.config.fileloaders.Loader; import com.dfsek.terra.config.fileloaders.ZIPLoader; @@ -32,7 +34,6 @@ import com.dfsek.terra.config.loaders.config.sampler.NoiseSamplerBuilderLoader; import com.dfsek.terra.config.loaders.config.sampler.templates.ImageSamplerTemplate; import com.dfsek.terra.config.prototype.ConfigType; import com.dfsek.terra.config.prototype.ProtoConfig; -import com.dfsek.terra.config.templates.AbstractableTemplate; import com.dfsek.terra.registry.OpenRegistry; import com.dfsek.terra.registry.config.ConfigTypeRegistry; import com.dfsek.terra.registry.config.FunctionRegistry; @@ -68,33 +69,21 @@ import java.util.zip.ZipFile; public class ConfigPack implements LoaderRegistrar { private final ConfigPackTemplate template = new ConfigPackTemplate(); - private final Map, ImmutablePair, CheckedRegistry>> registryMap = new HashMap<>(); - - - private final ScriptRegistry scriptRegistry = new ScriptRegistry(); - private final LootRegistry lootRegistry = new LootRegistry(); - - private final NoiseRegistry noiseRegistry = new NoiseRegistry(); - private final FunctionRegistry functionRegistry = new FunctionRegistry(); - private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader(); private final ConfigLoader selfLoader = new ConfigLoader(); private final Scope varScope = new Scope(); - private final TerraPlugin main; private final Loader loader; - private final BiomeProvider.BiomeProviderBuilder biomeProviderBuilder; - private final ConfigTypeRegistry configTypeRegistry; + private final ConfigTypeRegistry configTypeRegistry; + private final Map, ImmutablePair, CheckedRegistry>> registryMap = newRegistryMap(); public ConfigPack(File folder, TerraPlugin main) throws ConfigException { try { this.configTypeRegistry = new ConfigTypeRegistry(this, main, (id, configType) -> { OpenRegistry openRegistry = configType.registrySupplier().get(); - selfLoader.registerLoader(configType.getTypeClass(), openRegistry); - abstractConfigLoader.registerLoader(configType.getTypeClass(), openRegistry); registryMap.put(configType.getTypeClass(), ImmutablePair.of(openRegistry, new CheckedRegistry<>(openRegistry))); }); this.loader = new FolderLoader(folder.toPath()); @@ -134,8 +123,6 @@ public class ConfigPack implements LoaderRegistrar { try { this.configTypeRegistry = new ConfigTypeRegistry(this, main, (id, configType) -> { OpenRegistry openRegistry = configType.registrySupplier().get(); - selfLoader.registerLoader(configType.getTypeClass(), openRegistry); - abstractConfigLoader.registerLoader(configType.getTypeClass(), openRegistry); registryMap.put(configType.getTypeClass(), ImmutablePair.of(openRegistry, new CheckedRegistry<>(openRegistry))); }); this.loader = new ZIPLoader(file); @@ -177,15 +164,35 @@ public class ConfigPack implements LoaderRegistrar { toWorldConfig(new TerraWorld(new DummyWorld(), this, main)); // Build now to catch any errors immediately. } - public static void buildAll(ConfigFactory factory, OpenRegistry registry, List configTemplates, TerraPlugin main) throws LoadException { - for(C template : configTemplates) registry.add(template.getID(), factory.build(template, main)); + @SuppressWarnings({"unchecked", "rawtypes"}) + private Map, ImmutablePair, CheckedRegistry>> newRegistryMap() { + Map, ImmutablePair, CheckedRegistry>> map = new HashMap, ImmutablePair, CheckedRegistry>>() { + private static final long serialVersionUID = 4015855819914064466L; + + @Override + public ImmutablePair, CheckedRegistry> put(Class key, ImmutablePair, CheckedRegistry> value) { + selfLoader.registerLoader(key, value.getLeft()); + abstractConfigLoader.registerLoader(key, value.getLeft()); + return super.put(key, value); + } + }; + + putPair(map, NoiseProvider.class, new NoiseRegistry()); + putPair(map, FunctionBuilder.class, (OpenRegistry) (Object) new FunctionRegistry()); + putPair(map, LootTable.class, new LootRegistry()); + putPair(map, StructureScript.class, new ScriptRegistry()); + + return map; + } + + private void putPair(Map, ImmutablePair, CheckedRegistry>> map, Class key, OpenRegistry l) { + map.put(key, ImmutablePair.of(l, new CheckedRegistry<>(l))); } private void checkDeadEntries(TerraPlugin main) { registryMap.forEach((clazz, pair) -> pair.getLeft().getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in '" + clazz + "' registry: '" + id + "'"))); } - @SuppressWarnings({"unchecked", "rawtypes"}) private void load(long start, TerraPlugin main) throws ConfigException { main.getEventManager().callEvent(new ConfigPackPreLoadEvent(this)); @@ -197,8 +204,8 @@ public class ConfigPack implements LoaderRegistrar { loader.open("structures/data", ".tesf").thenEntries(entries -> { for(Map.Entry entry : entries) { try(InputStream stream = entry.getValue()) { - StructureScript structureScript = new StructureScript(stream, main, scriptRegistry, lootRegistry, functionRegistry); - scriptRegistry.add(structureScript.getId(), structureScript); + StructureScript structureScript = new StructureScript(stream, main, getRegistry(StructureScript.class), getRegistry(LootTable.class), (Registry>) (Object) getRegistry(FunctionBuilder.class)); + getOpenRegistry(StructureScript.class).add(structureScript.getId(), structureScript); } catch(com.dfsek.terra.api.structures.parser.exceptions.ParseException | IOException e) { throw new LoadException("Unable to load script \"" + entry.getKey() + "\"", e); } @@ -206,7 +213,7 @@ public class ConfigPack implements LoaderRegistrar { }).close().open("structures/loot", ".json").thenEntries(entries -> { for(Map.Entry entry : entries) { try { - lootRegistry.add(entry.getKey(), new LootTable(IOUtils.toString(entry.getValue(), StandardCharsets.UTF_8), main)); + getOpenRegistry(LootTable.class).add(entry.getKey(), new LootTable(IOUtils.toString(entry.getValue(), StandardCharsets.UTF_8), main)); } catch(ParseException | IOException | NullPointerException e) { throw new LoadException("Unable to load loot table \"" + entry.getKey() + "\"", e); } @@ -253,29 +260,28 @@ public class ConfigPack implements LoaderRegistrar { return (CheckedRegistry) registryMap.getOrDefault(clazz, ImmutablePair.ofNull()).getRight(); } + @SuppressWarnings("unchecked") + protected OpenRegistry getOpenRegistry(Class clazz) { + return (OpenRegistry) registryMap.getOrDefault(clazz, ImmutablePair.ofNull()).getLeft(); + } + @Override public void register(TypeRegistry registry) { registry .registerLoader(ConfigType.class, configTypeRegistry) - .registerLoader(StructureScript.class, scriptRegistry) - .registerLoader(LootTable.class, lootRegistry) .registerLoader(BufferedImage.class, new BufferedImageLoader(loader)) - .registerLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(noiseRegistry)) .registerLoader(SingleBiomeProviderTemplate.class, SingleBiomeProviderTemplate::new) .registerLoader(BiomePipelineTemplate.class, () -> new BiomePipelineTemplate(main)) .registerLoader(ImageProviderTemplate.class, () -> new ImageProviderTemplate(getRegistry(BiomeBuilder.class))) - .registerLoader(ImageSamplerTemplate.class, () -> new ImageProviderTemplate(getRegistry(BiomeBuilder.class))); + .registerLoader(ImageSamplerTemplate.class, () -> new ImageProviderTemplate(getRegistry(BiomeBuilder.class))) + .registerLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(getOpenRegistry(NoiseProvider.class))); } public BiomeProvider.BiomeProviderBuilder getBiomeProviderBuilder() { return biomeProviderBuilder; } - public CheckedRegistry getScriptRegistry() { - return new CheckedRegistry<>(scriptRegistry); - } - public WorldConfig toWorldConfig(TerraWorld world) { return new WorldConfig(world, this, main); diff --git a/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java b/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java index a9fddf712..11f473efd 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java @@ -2,7 +2,6 @@ package com.dfsek.terra.config.pack; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.registry.LockedRegistry; -import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; import com.dfsek.terra.carving.UserDefinedCarver; @@ -18,7 +17,6 @@ import java.util.Map; import java.util.Set; public class WorldConfig { - private final LockedRegistry scriptRegistry; private final SamplerCache samplerCache; private final BiomeProvider provider; @@ -35,7 +33,6 @@ public class WorldConfig { pack.getConfigTypeRegistry().forEach(configType -> registryMap.put(configType.getTypeClass(), new LockedRegistry<>(pack.getRegistry(configType.getTypeClass())))); - this.scriptRegistry = new LockedRegistry<>(pack.getScriptRegistry()); OpenRegistry biomeOpenRegistry = new OpenRegistry<>(); pack.getRegistry(BiomeBuilder.class).forEach((id, biome) -> biomeOpenRegistry.add(id, biome.apply(world.getWorld().getSeed()))); @@ -61,10 +58,6 @@ public class WorldConfig { return new HashSet<>(getRegistry(UserDefinedCarver.class).entries()); } - public LockedRegistry getScriptRegistry() { - return scriptRegistry; - } - public BiomeProvider getProvider() { return provider; } diff --git a/common/src/main/java/com/dfsek/terra/registry/config/NoiseRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/NoiseRegistry.java index ccbfee9ca..ac0bc4b48 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/NoiseRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/NoiseRegistry.java @@ -1,6 +1,5 @@ package com.dfsek.terra.registry.config; -import com.dfsek.tectonic.loading.object.ObjectTemplate; import com.dfsek.terra.api.math.noise.samplers.noise.random.GaussianNoiseSampler; import com.dfsek.terra.api.math.noise.samplers.noise.random.WhiteNoiseSampler; import com.dfsek.terra.api.math.noise.samplers.noise.simplex.OpenSimplex2SSampler; @@ -9,7 +8,7 @@ import com.dfsek.terra.api.math.noise.samplers.noise.simplex.PerlinSampler; import com.dfsek.terra.api.math.noise.samplers.noise.simplex.SimplexSampler; import com.dfsek.terra.api.math.noise.samplers.noise.value.ValueCubicSampler; import com.dfsek.terra.api.math.noise.samplers.noise.value.ValueSampler; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; +import com.dfsek.terra.api.util.seeded.NoiseProvider; import com.dfsek.terra.config.loaders.config.sampler.templates.DomainWarpTemplate; import com.dfsek.terra.config.loaders.config.sampler.templates.ImageSamplerTemplate; import com.dfsek.terra.config.loaders.config.sampler.templates.KernelTemplate; @@ -26,9 +25,7 @@ import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.Linear import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.NormalNormalizerTemplate; import com.dfsek.terra.registry.OpenRegistry; -import java.util.function.Supplier; - -public class NoiseRegistry extends OpenRegistry>> { +public class NoiseRegistry extends OpenRegistry { public NoiseRegistry() { add("LINEAR", LinearNormalizerTemplate::new); add("NORMAL", NormalNormalizerTemplate::new); diff --git a/common/src/test/java/biome/DistributionTest.java b/common/src/test/java/biome/DistributionTest.java deleted file mode 100644 index 711aba9c7..000000000 --- a/common/src/test/java/biome/DistributionTest.java +++ /dev/null @@ -1,352 +0,0 @@ -package biome; - -import com.dfsek.tectonic.abstraction.AbstractConfigLoader; -import com.dfsek.tectonic.annotations.Abstractable; -import com.dfsek.tectonic.annotations.Default; -import com.dfsek.tectonic.annotations.Value; -import com.dfsek.tectonic.config.ConfigTemplate; -import com.dfsek.tectonic.config.ValidatedConfigTemplate; -import com.dfsek.tectonic.exception.ConfigException; -import com.dfsek.tectonic.loading.ConfigLoader; -import com.dfsek.tectonic.loading.TypeRegistry; -import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.addons.TerraAddon; -import com.dfsek.terra.api.event.EventManager; -import com.dfsek.terra.api.platform.handle.ItemHandle; -import com.dfsek.terra.api.platform.handle.WorldHandle; -import com.dfsek.terra.api.platform.world.Biome; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.registry.CheckedRegistry; -import com.dfsek.terra.api.registry.LockedRegistry; -import com.dfsek.terra.api.util.collections.ProbabilityCollection; -import com.dfsek.terra.api.util.logging.DebugLogger; -import com.dfsek.terra.api.util.logging.JavaLogger; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; -import com.dfsek.terra.api.world.biome.Generator; -import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.api.world.biome.provider.BiomeProvider; -import com.dfsek.terra.config.GenericLoaders; -import com.dfsek.terra.config.PluginConfig; -import com.dfsek.terra.config.builder.BiomeBuilder; -import com.dfsek.terra.config.fileloaders.FolderLoader; -import com.dfsek.terra.config.lang.Language; -import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader; -import com.dfsek.terra.config.loaders.config.BufferedImageLoader; -import com.dfsek.terra.config.loaders.config.biome.BiomeProviderBuilderLoader; -import com.dfsek.terra.config.loaders.config.biome.templates.provider.BiomePipelineTemplate; -import com.dfsek.terra.config.loaders.config.biome.templates.provider.ImageProviderTemplate; -import com.dfsek.terra.config.loaders.config.biome.templates.provider.SingleBiomeProviderTemplate; -import com.dfsek.terra.config.loaders.config.sampler.NoiseSamplerBuilderLoader; -import com.dfsek.terra.config.pack.ConfigPack; -import com.dfsek.terra.config.templates.AbstractableTemplate; -import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.registry.config.BiomeRegistry; -import com.dfsek.terra.registry.config.NoiseRegistry; -import com.dfsek.terra.world.TerraWorld; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.image.BufferedImage; -import java.awt.image.ColorModel; -import java.awt.image.WritableRaster; -import java.io.File; -import java.io.IOException; -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.ThreadLocalRandom; -import java.util.logging.Logger; - -public class DistributionTest { - private static final TerraPlugin MAIN = new TerraPlugin() { - @Override - public WorldHandle getWorldHandle() { - return null; - } - - @Override - public TerraWorld getWorld(World world) { - return null; - } - - @Override - public com.dfsek.terra.api.util.logging.Logger logger() { - return new JavaLogger(Logger.getLogger("Terra")); - } - - @Override - public PluginConfig getTerraConfig() { - return new PluginConfig(); - } - - @Override - public File getDataFolder() { - return null; - } - - @Override - public boolean isDebug() { - return false; - } - - @Override - public Language getLanguage() { - return null; - } - - @Override - public CheckedRegistry getConfigRegistry() { - return null; - } - - @Override - public LockedRegistry getAddons() { - return null; - } - - @Override - public boolean reload() { - return true; - } - - @Override - public ItemHandle getItemHandle() { - return null; - } - - @Override - public void saveDefaultConfig() { - - } - - @Override - public String platformName() { - return null; - } - - @Override - public DebugLogger getDebugLogger() { - return new DebugLogger(new JavaLogger(Logger.getLogger("Terra"))); - } - - @Override - public EventManager getEventManager() { - return null; - } - - @Override - public void register(TypeRegistry registry) { - - } - }; - - - private static BiomeProvider getProvider(long seed) throws ConfigException, IOException { - System.out.println(seed); - File pack = new File("/home/dfsek/Documents/Terra/platforms/bukkit/target/server/plugins/Terra/packs/default/"); - FolderLoader folderLoader = new FolderLoader(pack.toPath()); - - AbstractConfigLoader loader = new AbstractConfigLoader(); - new GenericLoaders(MAIN).register(loader); - - BiomeRegistry biomeRegistry = new BiomeRegistry(); - folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, biomeRegistry, loader.load(inputStreams, TestBiome::new), MAIN)); - - BiomeProviderTemplate template = new BiomeProviderTemplate(); - ConfigLoader pipeLoader = new ConfigLoader() - .registerLoader(BiomeProvider.BiomeProviderBuilder.class, new BiomeProviderBuilderLoader()) - .registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader()) - .registerLoader(BiomeBuilder.class, biomeRegistry) - .registerLoader(BufferedImage.class, new BufferedImageLoader(folderLoader)) - .registerLoader(SingleBiomeProviderTemplate.class, SingleBiomeProviderTemplate::new) - .registerLoader(BiomePipelineTemplate.class, () -> new BiomePipelineTemplate(MAIN)) - .registerLoader(ImageProviderTemplate.class, () -> new ImageProviderTemplate(biomeRegistry)); - new GenericLoaders(MAIN).register(pipeLoader); - - pipeLoader.registerLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(new NoiseRegistry())); - - pipeLoader.load(template, folderLoader.get("pack.yml")); - return template.getBiomeProviderBuilder().build(seed); - } - - public static void main(String... args) throws ConfigException, IOException { - JFrame testFrame = new JFrame("Biome Viewer"); - - - final BiomeProvider[] provider = {getProvider(2403)}; - - - int size = 1024; - final BufferedImage[] image = {new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB)}; - for(int x = 0; x < size; x++) { - for(int z = 0; z < size; z++) { - image[0].setRGB(x, z, provider[0].getBiome(x, z).getColor()); - } - } - - JLabel img = new JLabel(new ImageIcon(image[0])); - - testFrame.add(img); - testFrame.pack(); - img.addMouseListener(new MouseListener() { - @Override - public void mouseClicked(MouseEvent e) { - BufferedImage newImage = deepCopy(image[0]); - Graphics graphics = newImage.getGraphics(); - graphics.setColor(Color.WHITE); - graphics.fillRect(0, 0, 512, 24); - graphics.setColor(Color.BLACK); - graphics.setFont(new Font("Monospace", Font.BOLD, 20)); - graphics.drawString(provider[0].getBiome(e.getX(), e.getY()).toString(), 0, 20); - - graphics.setColor(Color.WHITE); - graphics.fillOval(e.getX() - 2, e.getY() - 2, 12, 12); - graphics.setColor(Color.BLACK); - graphics.fillOval(e.getX(), e.getY(), 8, 8); - - img.setIcon(new ImageIcon(newImage)); - } - - @Override - public void mousePressed(MouseEvent e) { - - } - - @Override - public void mouseReleased(MouseEvent e) { - - } - - @Override - public void mouseEntered(MouseEvent e) { - - } - - @Override - public void mouseExited(MouseEvent e) { - - } - }); - - testFrame.addKeyListener(new KeyListener() { - @Override - public void keyTyped(KeyEvent e) { - if(e.getKeyChar() == 's') { - long l = System.nanoTime(); - try { - provider[0] = getProvider(ThreadLocalRandom.current().nextLong()); - } catch(ConfigException | IOException configException) { - configException.printStackTrace(); - } - image[0] = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB); - for(int x = 0; x < size; x++) { - for(int z = 0; z < size; z++) { - image[0].setRGB(x, z, provider[0].getBiome(x, z).getColor()); - } - } - long n = System.nanoTime(); - double t = n - l; - System.out.println("Time: " + t / 1000000 + "ms"); - img.setIcon(new ImageIcon(image[0])); - } - } - - @Override - public void keyPressed(KeyEvent e) { - - } - - @Override - public void keyReleased(KeyEvent e) { - - } - }); - - testFrame.setResizable(false); - testFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - testFrame.setVisible(true); - - } - - private static BufferedImage deepCopy(BufferedImage bi) { - ColorModel cm = bi.getColorModel(); - boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); - WritableRaster raster = bi.copyData(null); - return new BufferedImage(cm, raster, isAlphaPremultiplied, null); - } - - private static final class BiomeProviderTemplate implements ConfigTemplate { - @Value("biomes") - BiomeProvider.BiomeProviderBuilder biomeProviderBuilder; - - public BiomeProvider.BiomeProviderBuilder getBiomeProviderBuilder() { - return biomeProviderBuilder; - } - } - - private static final class TestBiome extends AbstractableTemplate implements TerraBiome, ValidatedConfigTemplate, BiomeBuilder { - - @Value("color") - @Default - @Abstractable - private int color; - - @Value("tags") - @Abstractable - @Default - private Set tags = new HashSet<>(); - - @Value("id") - private String id; - - @Override - public ProbabilityCollection getVanillaBiomes() { - return null; - } - - @Override - public BiomeTemplate getTemplate() { - return null; - } - - @Override - public Generator getGenerator(World w) { - return null; - } - - @Override - public int getColor() { - return color; - } - - @Override - public Set getTags() { - return tags; - } - - @Override - public boolean validate() { - color += (255 << 24); // Alpha adjustment - tags.add("BIOME:" + id); - return true; - } - - @Override - public String getID() { - return id; - } - - @Override - public String toString() { - return id; - } - - @Override - public TestBiome apply(Long aLong) { - return this; - } - } -} diff --git a/common/src/test/java/biome/ImageTest.java b/common/src/test/java/biome/ImageTest.java deleted file mode 100644 index ddc96dafc..000000000 --- a/common/src/test/java/biome/ImageTest.java +++ /dev/null @@ -1,218 +0,0 @@ -package biome; - -import com.dfsek.tectonic.abstraction.AbstractConfigLoader; -import com.dfsek.tectonic.annotations.Abstractable; -import com.dfsek.tectonic.annotations.Default; -import com.dfsek.tectonic.annotations.Value; -import com.dfsek.tectonic.config.ConfigTemplate; -import com.dfsek.tectonic.config.ValidatedConfigTemplate; -import com.dfsek.tectonic.exception.ConfigException; -import com.dfsek.terra.api.platform.world.Biome; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.util.collections.ProbabilityCollection; -import com.dfsek.terra.api.world.biome.Generator; -import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.api.world.biome.provider.BiomeProvider; -import com.dfsek.terra.api.world.biome.provider.ImageBiomeProvider; -import com.dfsek.terra.config.fileloaders.FolderLoader; -import com.dfsek.terra.config.pack.ConfigPack; -import com.dfsek.terra.config.templates.AbstractableTemplate; -import com.dfsek.terra.registry.OpenRegistry; -import org.junit.jupiter.api.Test; - -import javax.imageio.ImageIO; -import javax.swing.*; -import java.awt.*; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.image.BufferedImage; -import java.awt.image.ColorModel; -import java.awt.image.WritableRaster; -import java.io.File; -import java.io.IOException; -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.ThreadLocalRandom; - -public class ImageTest { - private static ImageBiomeProvider getProvider(long seed) throws ConfigException, IOException { - System.out.println(seed); - File pack = new File("/home/dfsek/Documents/Terra/platforms/bukkit/target/server/plugins/Terra/packs/default/"); - FolderLoader folderLoader = new FolderLoader(pack.toPath()); - - AbstractConfigLoader loader = new AbstractConfigLoader(); - - OpenRegistry biomeRegistry = new OpenRegistry() { - }; - folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, biomeRegistry, loader.load(inputStreams, TestBiome::new), null)); - - return new ImageBiomeProvider(biomeRegistry.entries(), ImageIO.read(ImageTest.class.getResourceAsStream("/map.jpg")), 1, ImageBiomeProvider.Align.CENTER); - } - - @Test - public static void main(String... args) throws ConfigException, IOException { - JFrame testFrame = new JFrame("Biome Viewer"); - - - final BiomeProvider[] provider = {getProvider(2403)}; - - - int size = 1024; - final BufferedImage[] image = {new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB)}; - for(int x = 0; x < size; x++) { - for(int z = 0; z < size; z++) { - image[0].setRGB(x, z, provider[0].getBiome(x, z).getColor()); - } - } - - JLabel img = new JLabel(new ImageIcon(image[0])); - - testFrame.add(img); - testFrame.pack(); - img.addMouseListener(new MouseListener() { - @Override - public void mouseClicked(MouseEvent e) { - BufferedImage newImage = deepCopy(image[0]); - Graphics graphics = newImage.getGraphics(); - graphics.setColor(Color.WHITE); - graphics.fillRect(0, 0, 512, 24); - graphics.setColor(Color.BLACK); - graphics.setFont(new Font("Monospace", Font.BOLD, 20)); - graphics.drawString(provider[0].getBiome(e.getX(), e.getY()).toString(), 0, 20); - - graphics.setColor(Color.WHITE); - graphics.fillOval(e.getX() - 2, e.getY() - 2, 12, 12); - graphics.setColor(Color.BLACK); - graphics.fillOval(e.getX(), e.getY(), 8, 8); - - img.setIcon(new ImageIcon(newImage)); - } - - @Override - public void mousePressed(MouseEvent e) { - - } - - @Override - public void mouseReleased(MouseEvent e) { - - } - - @Override - public void mouseEntered(MouseEvent e) { - - } - - @Override - public void mouseExited(MouseEvent e) { - - } - }); - - testFrame.addKeyListener(new KeyListener() { - @Override - public void keyTyped(KeyEvent e) { - if(e.getKeyChar() == 's') { - try { - provider[0] = getProvider(ThreadLocalRandom.current().nextLong()); - } catch(ConfigException | IOException configException) { - configException.printStackTrace(); - } - image[0] = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB); - for(int x = 0; x < size; x++) { - for(int z = 0; z < size; z++) { - image[0].setRGB(x, z, provider[0].getBiome(x, z).getColor()); - } - } - img.setIcon(new ImageIcon(image[0])); - } - } - - @Override - public void keyPressed(KeyEvent e) { - - } - - @Override - public void keyReleased(KeyEvent e) { - - } - }); - - testFrame.setResizable(false); - testFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - testFrame.setVisible(true); - - } - - private static BufferedImage deepCopy(BufferedImage bi) { - ColorModel cm = bi.getColorModel(); - boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); - WritableRaster raster = bi.copyData(null); - return new BufferedImage(cm, raster, isAlphaPremultiplied, null); - } - - private static final class BiomeProviderTemplate implements ConfigTemplate { - @Value("biome-pipeline") - BiomeProvider.BiomeProviderBuilder biomeProviderBuilder; - - public BiomeProvider.BiomeProviderBuilder getBiomeProviderBuilder() { - return biomeProviderBuilder; - } - } - - private static final class TestBiome extends AbstractableTemplate implements TerraBiome, ValidatedConfigTemplate { - - @Value("color") - @Default - @Abstractable - private int color; - - @Value("tags") - @Abstractable - @Default - private Set tags = new HashSet<>(); - - @Value("id") - private String id; - - @Override - public ProbabilityCollection getVanillaBiomes() { - return null; - } - - @Override - public Generator getGenerator(World w) { - return null; - } - - @Override - public int getColor() { - return color; - } - - @Override - public Set getTags() { - return tags; - } - - @Override - public boolean validate() { - color += (255 << 24); // Alpha adjustment - tags.add("BIOME:" + id); - return true; - } - - @Override - public String getID() { - return id; - } - - @Override - public String toString() { - return id; - } - } -}