From f6967be95fafd99aede55fe5bacf2cf18f245e75 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 26 Jan 2021 21:50:56 -0700 Subject: [PATCH] biome cleanup --- color.yml | 4 + .../math/noise/samplers/FastNoiseLite.java | 20 ++ .../script/functions/BiomeFunction.java | 2 +- .../script/functions/CheckFunction.java | 2 +- .../dfsek/terra/async/AsyncBiomeFinder.java | 2 +- .../dfsek/terra/async/AsyncFeatureFinder.java | 2 +- .../terra/async/AsyncStructureFinder.java | 2 +- .../biome/{ => provider}/BiomeProvider.java | 3 +- .../{ => provider}/ImageBiomeProvider.java | 3 +- .../biome/provider/SingleBiomeProvider.java | 18 ++ .../{ => provider}/StandardBiomeProvider.java | 3 +- .../biome/BiomeProviderBuilderLoader.java | 15 +- .../dfsek/terra/config/pack/ConfigPack.java | 2 +- .../terra/config/pack/ConfigPackTemplate.java | 2 +- .../com/dfsek/terra/world/TerraWorld.java | 2 +- .../generation/MasterChunkGenerator.java | 2 +- .../terra/world/generation/math/Sampler.java | 2 +- .../interpolation/BiomeChunkInterpolator.java | 2 +- .../interpolation/ElevationInterpolator.java | 2 +- .../world/population/FloraPopulator.java | 2 +- .../world/population/StructurePopulator.java | 2 +- .../terra/world/population/TreePopulator.java | 2 +- common/src/test/java/biome/BiomeTest.java | 4 +- .../src/test/java/biome/DistributionTest.java | 94 ++++++++- common/src/test/java/biome/ImageTest.java | 4 +- .../test/java/noise/ColorConfigTemplate.java | 23 +++ .../test/java/noise/NoiseConfigTemplate.java | 16 ++ common/src/test/java/noise/NoiseTool.java | 193 ++++++++++++++++++ common/src/test/resources/config.yml | 10 + .../command/command/biome/BiomeCommand.java | 2 +- .../terra/fabric/world/TerraBiomeSource.java | 2 +- 31 files changed, 414 insertions(+), 30 deletions(-) create mode 100644 color.yml rename common/src/main/java/com/dfsek/terra/biome/{ => provider}/BiomeProvider.java (89%) rename common/src/main/java/com/dfsek/terra/biome/{ => provider}/ImageBiomeProvider.java (96%) create mode 100644 common/src/main/java/com/dfsek/terra/biome/provider/SingleBiomeProvider.java rename common/src/main/java/com/dfsek/terra/biome/{ => provider}/StandardBiomeProvider.java (97%) create mode 100644 common/src/test/java/noise/ColorConfigTemplate.java create mode 100644 common/src/test/java/noise/NoiseConfigTemplate.java create mode 100644 common/src/test/java/noise/NoiseTool.java create mode 100644 common/src/test/resources/config.yml diff --git a/color.yml b/color.yml new file mode 100644 index 000000000..0b89a927d --- /dev/null +++ b/color.yml @@ -0,0 +1,4 @@ +colors: + - 0x000000: 20 + - 0xffffff: 3 +enable: false diff --git a/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/FastNoiseLite.java b/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/FastNoiseLite.java index a50afdb45..81257f964 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/FastNoiseLite.java +++ b/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/FastNoiseLite.java @@ -1483,6 +1483,14 @@ public class FastNoiseLite implements NoiseSampler { return distance0 / distance1 - 1; case NoiseLookup: return cellularNoiseLookup.getNoise(center.getX(), center.getZ()); + case Distance3: + return distance2 - 1; + case Distance3Add: + return (distance2 + distance0) * 0.5 - 1; + case Distance3Sub: + return distance2 - distance0 - 1; + case Distance3Mul: + return distance2 * distance0 - 1; case Distance3Div: return distance0 / distance2 - 1; default: @@ -1649,6 +1657,14 @@ public class FastNoiseLite implements NoiseSampler { return distance0 / distance1 - 1; case NoiseLookup: return cellularNoiseLookup.getNoise(center.getX(), center.getY(), center.getZ()); + case Distance3: + return distance2 - 1; + case Distance3Add: + return (distance2 + distance0) * 0.5 - 1; + case Distance3Sub: + return distance2 - distance0 - 1; + case Distance3Mul: + return distance2 * distance0 - 1; case Distance3Div: return distance0 / distance2 - 1; default: @@ -2630,6 +2646,10 @@ public class FastNoiseLite implements NoiseSampler { Distance2Mul, Distance2Div, NoiseLookup, + Distance3, + Distance3Add, + Distance3Sub, + Distance3Mul, Distance3Div } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BiomeFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BiomeFunction.java index 232414024..dd6a5bc0b 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BiomeFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BiomeFunction.java @@ -10,8 +10,8 @@ import com.dfsek.terra.api.structures.parser.lang.variables.Variable; import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.RotationUtil; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.provider.BiomeProvider; import net.jafama.FastMath; import java.util.Map; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index 0e9073c2b..e82053b84 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -12,8 +12,8 @@ import com.dfsek.terra.api.structures.parser.lang.variables.Variable; import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.RotationUtil; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.provider.BiomeProvider; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.generation.math.SamplerCache; diff --git a/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java b/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java index 66ab3b350..3fd723abb 100644 --- a/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java +++ b/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java @@ -3,8 +3,8 @@ package com.dfsek.terra.async; import com.dfsek.terra.api.core.TerraPlugin; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; -import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.TerraBiome; +import com.dfsek.terra.biome.provider.BiomeProvider; import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; diff --git a/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java b/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java index 4497709ce..69869a861 100644 --- a/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java +++ b/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java @@ -4,7 +4,7 @@ import com.dfsek.terra.api.core.TerraPlugin; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.biome.BiomeProvider; +import com.dfsek.terra.biome.provider.BiomeProvider; import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; diff --git a/common/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java b/common/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java index be61a0ebd..89aa90344 100644 --- a/common/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java +++ b/common/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java @@ -6,8 +6,8 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.util.FastRandom; -import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.provider.BiomeProvider; import com.dfsek.terra.world.population.items.TerraStructure; import net.jafama.FastMath; import org.jetbrains.annotations.NotNull; diff --git a/common/src/main/java/com/dfsek/terra/biome/BiomeProvider.java b/common/src/main/java/com/dfsek/terra/biome/provider/BiomeProvider.java similarity index 89% rename from common/src/main/java/com/dfsek/terra/biome/BiomeProvider.java rename to common/src/main/java/com/dfsek/terra/biome/provider/BiomeProvider.java index ecfe07453..3369a931a 100644 --- a/common/src/main/java/com/dfsek/terra/biome/BiomeProvider.java +++ b/common/src/main/java/com/dfsek/terra/biome/provider/BiomeProvider.java @@ -1,8 +1,9 @@ -package com.dfsek.terra.biome; +package com.dfsek.terra.biome.provider; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.biome.TerraBiome; public interface BiomeProvider { TerraBiome getBiome(int x, int z); diff --git a/common/src/main/java/com/dfsek/terra/biome/ImageBiomeProvider.java b/common/src/main/java/com/dfsek/terra/biome/provider/ImageBiomeProvider.java similarity index 96% rename from common/src/main/java/com/dfsek/terra/biome/ImageBiomeProvider.java rename to common/src/main/java/com/dfsek/terra/biome/provider/ImageBiomeProvider.java index 3462495db..50cbd137c 100644 --- a/common/src/main/java/com/dfsek/terra/biome/ImageBiomeProvider.java +++ b/common/src/main/java/com/dfsek/terra/biome/provider/ImageBiomeProvider.java @@ -1,5 +1,6 @@ -package com.dfsek.terra.biome; +package com.dfsek.terra.biome.provider; +import com.dfsek.terra.biome.TerraBiome; import com.dfsek.terra.registry.TerraRegistry; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/biome/provider/SingleBiomeProvider.java b/common/src/main/java/com/dfsek/terra/biome/provider/SingleBiomeProvider.java new file mode 100644 index 000000000..8ede312a1 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/biome/provider/SingleBiomeProvider.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.biome.provider; + +import com.dfsek.terra.biome.TerraBiome; + +public class SingleBiomeProvider implements BiomeProvider { + private final TerraBiome biome; + + public SingleBiomeProvider(TerraBiome biome) { + this.biome = biome; + } + + @Override + public TerraBiome getBiome(int x, int z) { + return biome; + } + + +} diff --git a/common/src/main/java/com/dfsek/terra/biome/StandardBiomeProvider.java b/common/src/main/java/com/dfsek/terra/biome/provider/StandardBiomeProvider.java similarity index 97% rename from common/src/main/java/com/dfsek/terra/biome/StandardBiomeProvider.java rename to common/src/main/java/com/dfsek/terra/biome/provider/StandardBiomeProvider.java index 30ed73b6e..f2a41e72f 100644 --- a/common/src/main/java/com/dfsek/terra/biome/StandardBiomeProvider.java +++ b/common/src/main/java/com/dfsek/terra/biome/provider/StandardBiomeProvider.java @@ -1,9 +1,10 @@ -package com.dfsek.terra.biome; +package com.dfsek.terra.biome.provider; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.terra.api.core.TerraPlugin; import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.biome.TerraBiome; import com.dfsek.terra.biome.pipeline.BiomeHolder; import com.dfsek.terra.biome.pipeline.BiomePipeline; import com.dfsek.terra.world.generation.config.NoiseBuilder; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/biome/BiomeProviderBuilderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/biome/BiomeProviderBuilderLoader.java index 835d79cbd..315f122fc 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/biome/BiomeProviderBuilderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/biome/BiomeProviderBuilderLoader.java @@ -4,13 +4,14 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.core.TerraPlugin; -import com.dfsek.terra.biome.BiomeProvider; -import com.dfsek.terra.biome.ImageBiomeProvider; -import com.dfsek.terra.biome.StandardBiomeProvider; import com.dfsek.terra.biome.TerraBiome; import com.dfsek.terra.biome.pipeline.BiomePipeline; import com.dfsek.terra.biome.pipeline.source.BiomeSource; import com.dfsek.terra.biome.pipeline.stages.SeededBuilder; +import com.dfsek.terra.biome.provider.BiomeProvider; +import com.dfsek.terra.biome.provider.ImageBiomeProvider; +import com.dfsek.terra.biome.provider.SingleBiomeProvider; +import com.dfsek.terra.biome.provider.StandardBiomeProvider; import com.dfsek.terra.config.fileloaders.Loader; import com.dfsek.terra.config.loaders.config.NoiseBuilderLoader; import com.dfsek.terra.registry.TerraRegistry; @@ -86,6 +87,14 @@ public class BiomeProviderBuilderLoader implements TypeLoader { + try { + return new SingleBiomeProvider((TerraBiome) loader.loadType(TerraBiome.class, map.get("biome"))); + } catch(LoadException e) { + throw new RuntimeException(e); + } + }; } throw new LoadException("No such biome provider type: " + map.get("type")); 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 9d573e4b9..9ca57ae16 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 @@ -12,8 +12,8 @@ import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.tree.Tree; -import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.TerraBiome; +import com.dfsek.terra.biome.provider.BiomeProvider; import com.dfsek.terra.config.exception.FileMissingException; import com.dfsek.terra.config.factories.BiomeFactory; import com.dfsek.terra.config.factories.FloraFactory; diff --git a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPackTemplate.java b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPackTemplate.java index 0008b3911..1559305ae 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPackTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPackTemplate.java @@ -3,7 +3,7 @@ package com.dfsek.terra.config.pack; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; -import com.dfsek.terra.biome.BiomeProvider; +import com.dfsek.terra.biome.provider.BiomeProvider; import com.dfsek.terra.world.generation.config.NoiseBuilder; import java.util.HashMap; diff --git a/common/src/main/java/com/dfsek/terra/world/TerraWorld.java b/common/src/main/java/com/dfsek/terra/world/TerraWorld.java index 5b560a151..79c25cdeb 100644 --- a/common/src/main/java/com/dfsek/terra/world/TerraWorld.java +++ b/common/src/main/java/com/dfsek/terra/world/TerraWorld.java @@ -7,8 +7,8 @@ import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; import com.dfsek.terra.api.world.palette.Palette; -import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.provider.BiomeProvider; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.profiler.WorldProfiler; import com.dfsek.terra.world.generation.math.Sampler; diff --git a/common/src/main/java/com/dfsek/terra/world/generation/MasterChunkGenerator.java b/common/src/main/java/com/dfsek/terra/world/generation/MasterChunkGenerator.java index 3cc98c4ad..8bb1124a1 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/MasterChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/MasterChunkGenerator.java @@ -16,9 +16,9 @@ import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.SinglePalette; -import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.TerraBiome; import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.provider.BiomeProvider; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.profiler.ProfileFuture; diff --git a/common/src/main/java/com/dfsek/terra/world/generation/math/Sampler.java b/common/src/main/java/com/dfsek/terra/world/generation/math/Sampler.java index 25e4237ce..a80beac6d 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/math/Sampler.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/math/Sampler.java @@ -1,7 +1,7 @@ package com.dfsek.terra.world.generation.math; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.biome.BiomeProvider; +import com.dfsek.terra.biome.provider.BiomeProvider; import com.dfsek.terra.world.generation.math.interpolation.BiomeChunkInterpolator; import com.dfsek.terra.world.generation.math.interpolation.ElevationInterpolator; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/world/generation/math/interpolation/BiomeChunkInterpolator.java b/common/src/main/java/com/dfsek/terra/world/generation/math/interpolation/BiomeChunkInterpolator.java index 2fbda7e22..fdb8fe31d 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/math/interpolation/BiomeChunkInterpolator.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/math/interpolation/BiomeChunkInterpolator.java @@ -4,7 +4,7 @@ import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.util.mutable.MutableInteger; import com.dfsek.terra.api.world.biome.Generator; -import com.dfsek.terra.biome.BiomeProvider; +import com.dfsek.terra.biome.provider.BiomeProvider; import net.jafama.FastMath; import java.util.HashMap; diff --git a/common/src/main/java/com/dfsek/terra/world/generation/math/interpolation/ElevationInterpolator.java b/common/src/main/java/com/dfsek/terra/world/generation/math/interpolation/ElevationInterpolator.java index 389e4c324..5e2d05910 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/math/interpolation/ElevationInterpolator.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/math/interpolation/ElevationInterpolator.java @@ -2,7 +2,7 @@ package com.dfsek.terra.world.generation.math.interpolation; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.biome.Generator; -import com.dfsek.terra.biome.BiomeProvider; +import com.dfsek.terra.biome.provider.BiomeProvider; import com.dfsek.terra.world.generation.WorldGenerator; public class ElevationInterpolator { diff --git a/common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java b/common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java index c940c57df..c1318f92b 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java @@ -5,8 +5,8 @@ import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; -import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.provider.BiomeProvider; import com.dfsek.terra.profiler.ProfileFuture; import com.dfsek.terra.util.PopulationUtil; import com.dfsek.terra.world.TerraWorld; diff --git a/common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java b/common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java index 1504387a1..a266de3dd 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java @@ -8,8 +8,8 @@ import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; -import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.provider.BiomeProvider; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.profiler.ProfileFuture; import com.dfsek.terra.world.TerraWorld; diff --git a/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java b/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java index 61348ec06..c88476971 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java @@ -5,8 +5,8 @@ import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; -import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.provider.BiomeProvider; import com.dfsek.terra.profiler.ProfileFuture; import com.dfsek.terra.util.PopulationUtil; import com.dfsek.terra.world.TerraWorld; diff --git a/common/src/test/java/biome/BiomeTest.java b/common/src/test/java/biome/BiomeTest.java index 567169980..8dac47745 100644 --- a/common/src/test/java/biome/BiomeTest.java +++ b/common/src/test/java/biome/BiomeTest.java @@ -6,8 +6,6 @@ import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; import com.dfsek.terra.api.platform.world.Biome; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.biome.Generator; -import com.dfsek.terra.biome.BiomeProvider; -import com.dfsek.terra.biome.StandardBiomeProvider; import com.dfsek.terra.biome.TerraBiome; import com.dfsek.terra.biome.pipeline.BiomePipeline; import com.dfsek.terra.biome.pipeline.expand.FractalExpander; @@ -19,6 +17,8 @@ import com.dfsek.terra.biome.pipeline.source.RandomSource; import com.dfsek.terra.biome.pipeline.stages.ExpanderStage; import com.dfsek.terra.biome.pipeline.stages.MutatorStage; import com.dfsek.terra.biome.pipeline.stages.SeededBuilder; +import com.dfsek.terra.biome.provider.BiomeProvider; +import com.dfsek.terra.biome.provider.StandardBiomeProvider; import org.junit.jupiter.api.Test; import javax.swing.*; diff --git a/common/src/test/java/biome/DistributionTest.java b/common/src/test/java/biome/DistributionTest.java index 020a63d71..1a96e3c86 100644 --- a/common/src/test/java/biome/DistributionTest.java +++ b/common/src/test/java/biome/DistributionTest.java @@ -8,19 +8,28 @@ 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.core.TerraPlugin; import com.dfsek.terra.api.math.ProbabilityCollection; +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.world.biome.Generator; -import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.TerraBiome; +import com.dfsek.terra.biome.provider.BiomeProvider; import com.dfsek.terra.config.GenericLoaders; +import com.dfsek.terra.config.PluginConfig; 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.biome.BiomeProviderBuilderLoader; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.AbstractableTemplate; +import com.dfsek.terra.debug.DebugLogger; import com.dfsek.terra.registry.BiomeRegistry; +import com.dfsek.terra.registry.ConfigRegistry; +import com.dfsek.terra.world.TerraWorld; import javax.swing.*; import java.awt.*; @@ -36,8 +45,87 @@ 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 boolean isEnabled() { + return false; + } + + @Override + public TerraWorld getWorld(World world) { + return null; + } + + @Override + public Logger getLogger() { + return 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 ConfigRegistry getRegistry() { + return null; + } + + @Override + public void reload() { + + } + + @Override + public ItemHandle getItemHandle() { + return null; + } + + @Override + public void saveDefaultConfig() { + + } + + @Override + public String platformName() { + return null; + } + + @Override + public DebugLogger getDebugLogger() { + return new DebugLogger(Logger.getLogger("Terra")); + } + + @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/"); @@ -46,11 +134,11 @@ public class DistributionTest { AbstractConfigLoader loader = new AbstractConfigLoader(); BiomeRegistry biomeRegistry = new BiomeRegistry(); - folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, biomeRegistry, loader.load(inputStreams, TestBiome::new), null)); + 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(null, biomeRegistry, folderLoader)) + .registerLoader(BiomeProvider.BiomeProviderBuilder.class, new BiomeProviderBuilderLoader(MAIN, biomeRegistry, folderLoader)) .registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader()) .registerLoader(TerraBiome.class, biomeRegistry); new GenericLoaders(null).register(pipeLoader); diff --git a/common/src/test/java/biome/ImageTest.java b/common/src/test/java/biome/ImageTest.java index 8ed0214ff..c93348b58 100644 --- a/common/src/test/java/biome/ImageTest.java +++ b/common/src/test/java/biome/ImageTest.java @@ -11,9 +11,9 @@ import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.platform.world.Biome; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.biome.Generator; -import com.dfsek.terra.biome.BiomeProvider; -import com.dfsek.terra.biome.ImageBiomeProvider; import com.dfsek.terra.biome.TerraBiome; +import com.dfsek.terra.biome.provider.BiomeProvider; +import com.dfsek.terra.biome.provider.ImageBiomeProvider; import com.dfsek.terra.config.fileloaders.FolderLoader; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.AbstractableTemplate; diff --git a/common/src/test/java/noise/ColorConfigTemplate.java b/common/src/test/java/noise/ColorConfigTemplate.java new file mode 100644 index 000000000..0a8c88556 --- /dev/null +++ b/common/src/test/java/noise/ColorConfigTemplate.java @@ -0,0 +1,23 @@ +package noise; + +import com.dfsek.tectonic.annotations.Default; +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.config.ConfigTemplate; +import com.dfsek.terra.api.math.ProbabilityCollection; + +public class ColorConfigTemplate implements ConfigTemplate { + @Value("colors") + private ProbabilityCollection colors; + + @Value("enable") + @Default + private boolean enable = false; + + public boolean enable() { + return enable; + } + + public ProbabilityCollection getColors() { + return colors; + } +} diff --git a/common/src/test/java/noise/NoiseConfigTemplate.java b/common/src/test/java/noise/NoiseConfigTemplate.java new file mode 100644 index 000000000..357eec176 --- /dev/null +++ b/common/src/test/java/noise/NoiseConfigTemplate.java @@ -0,0 +1,16 @@ +package noise; + +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.config.ConfigTemplate; +import com.dfsek.terra.world.generation.config.NoiseBuilder; + + +@SuppressWarnings("unused") +public class NoiseConfigTemplate implements ConfigTemplate { + @Value(".") + private NoiseBuilder builder; + + public NoiseBuilder getBuilder() { + return builder; + } +} diff --git a/common/src/test/java/noise/NoiseTool.java b/common/src/test/java/noise/NoiseTool.java new file mode 100644 index 000000000..71ec51efb --- /dev/null +++ b/common/src/test/java/noise/NoiseTool.java @@ -0,0 +1,193 @@ +package noise; + +import com.dfsek.tectonic.exception.ConfigException; +import com.dfsek.tectonic.loading.ConfigLoader; +import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; +import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader; +import com.dfsek.terra.config.loaders.config.NoiseBuilderLoader; +import com.dfsek.terra.world.generation.config.NoiseBuilder; +import org.apache.commons.io.FileUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.atomic.AtomicInteger; + +public class NoiseTool { + public static void main(String... args) throws ConfigException, IOException { + JFrame frame = new JFrame("Noise Viewer"); + + AtomicInteger seed = new AtomicInteger(2403); + JLabel label = new JLabel(new ImageIcon(load(seed.get(), false, false))); + frame.add(label); + frame.pack(); + frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + + + frame.addKeyListener(new KeyListener() { + @Override + public void keyTyped(KeyEvent e) { + if(e.getKeyChar() == 'r') { + try { + label.setIcon(new ImageIcon(load(seed.get(), false, false))); + } catch(ConfigException | IOException configException) { + configException.printStackTrace(); + } + } else if(e.getKeyChar() == 's') { + try { + seed.set(ThreadLocalRandom.current().nextInt()); + label.setIcon(new ImageIcon(load(seed.get(), false, false))); + } catch(ConfigException | IOException configException) { + configException.printStackTrace(); + } + } else if(e.getKeyChar() == 'd') { + try { + label.setIcon(new ImageIcon(load(seed.get(), true, false))); + } catch(ConfigException | IOException configException) { + configException.printStackTrace(); + } + } else if(e.getKeyChar() == 'c') { + try { + label.setIcon(new ImageIcon(load(seed.get(), false, true))); + } catch(ConfigException | IOException configException) { + configException.printStackTrace(); + } + } + } + + @Override + public void keyPressed(KeyEvent e) { + } + + @Override + public void keyReleased(KeyEvent e) { + } + }); + + frame.setVisible(true); + } + + private static int normal(double in, double out, double min, double max) { + double range = max - min; + return (int) (((in - min) * out) / range); + } + + private static int buildRGBA(int in) { + return (255 << 24) + + (in << 16) + + (in << 8) + + in; + } + + private static BufferedImage load(int seed, boolean distribution, boolean chunk) throws ConfigException, IOException { + long s = System.nanoTime(); + + ConfigLoader loader = new ConfigLoader(); + loader.registerLoader(NoiseBuilder.class, new NoiseBuilderLoader()) + .registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader()); + NoiseConfigTemplate template = new NoiseConfigTemplate(); + + File file = new File("./config.yml"); + + System.out.println(file.getAbsolutePath()); + + File colorFile = new File("./color.yml"); + + + System.out.println(file.getAbsolutePath()); + if(!file.exists()) { + file.getParentFile().mkdirs(); + FileUtils.copyInputStreamToFile(NoiseTool.class.getResourceAsStream("/config.yml"), file); + } + + + boolean colors = false; + ColorConfigTemplate color = new ColorConfigTemplate(); + if(colorFile.exists()) { + loader.load(color, new FileInputStream(colorFile)); + colors = color.enable(); + } + ProbabilityCollection colorCollection = color.getColors(); + + loader.load(template, new FileInputStream(file)); + NoiseSampler noise = template.getBuilder().build(seed); + + int size = 1024; + + BufferedImage image = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB); + + double[][] noiseVals = new double[size][size]; + int[][] rgbVals = new int[size][size]; + double max = Double.MIN_VALUE; + double min = Double.MAX_VALUE; + + int[] buckets = new int[1024]; + + for(int x = 0; x < noiseVals.length; x++) { + for(int z = 0; z < noiseVals[x].length; z++) { + double n = template.getBuilder().getDimensions() == 2 ? noise.getNoise(x, z) : noise.getNoise(x, 0, z); + noiseVals[x][z] = n; + max = Math.max(n, max); + min = Math.min(n, min); + if(colors) rgbVals[x][z] = colorCollection.get(noise, x, z); + } + } + + for(int x = 0; x < noiseVals.length; x++) { + for(int z = 0; z < noiseVals[x].length; z++) { + if(colors) image.setRGB(x, z, rgbVals[x][z] + (255 << 24)); + else image.setRGB(x, z, buildRGBA(normal(noiseVals[x][z], 255, min, max))); + buckets[normal(noiseVals[x][z], size - 1, min, max)]++; + } + } + + long time = System.nanoTime() - s; + + double ms = time / 1000000d; + + + if(chunk) { + for(int x = 0; x < image.getWidth(); x += 16) { + for(int y = 0; y < image.getHeight(); y++) image.setRGB(x, y, buildRGBA(0)); + } + for(int y = 0; y < image.getWidth(); y += 16) { + for(int x = 0; x < image.getHeight(); x++) image.setRGB(x, y, buildRGBA(0)); + } + } + + Graphics graphics = image.getGraphics(); + graphics.setColor(Color.WHITE); + graphics.fillRect(0, 0, 325, 90); + graphics.setColor(Color.BLACK); + graphics.setFont(new Font("Monospace", Font.BOLD, 20)); + graphics.drawString("min: " + min, 0, 20); + graphics.drawString("max: " + max, 0, 40); + graphics.drawString("seed: " + seed, 0, 60); + graphics.drawString("time: " + ms + "ms", 0, 80); + + if(distribution) { + graphics.setColor(Color.WHITE); + graphics.fillRect(0, size - (size / 4) - 1, size, (size / 4) - 1); + int highestBucket = Integer.MIN_VALUE; + for(int i : buckets) highestBucket = Math.max(highestBucket, i); + graphics.setColor(Color.BLACK); + graphics.drawString("" + highestBucket, 0, size - (size / 4) - 1 + 20); + + for(int x = 0; x < size; x++) { + for(int y = 0; y < ((double) buckets[x] / highestBucket) * ((double) size / 4); y++) { + image.setRGB(x, size - y - 1, buildRGBA(0)); + } + } + + } + + return image; + } +} diff --git a/common/src/test/resources/config.yml b/common/src/test/resources/config.yml new file mode 100644 index 000000000..d2a7fb934 --- /dev/null +++ b/common/src/test/resources/config.yml @@ -0,0 +1,10 @@ +dimensions: 2 +type: Cellular +frequency: 0.01 +cellular: + return: Distance3Div +normalize: + type: LINEAR + linear: + min: -1 + max: 0 \ No newline at end of file diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeCommand.java index d43e16bb8..254550157 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeCommand.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit.command.command.biome; -import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.provider.BiomeProvider; import com.dfsek.terra.bukkit.command.WorldCommand; import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.config.lang.LangUtil; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java index 64d9849cd..452fd222b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java @@ -1,7 +1,7 @@ package com.dfsek.terra.fabric.world; -import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.provider.BiomeProvider; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.mojang.serialization.Codec;