mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-24 13:31:33 +00:00
Merge branch 'dev/pseudoerosion-duplex' into dev/pseudo-erosion
This commit is contained in:
@@ -11,9 +11,9 @@ object Versions {
|
|||||||
|
|
||||||
object Internal {
|
object Internal {
|
||||||
const val apacheText = "1.9"
|
const val apacheText = "1.9"
|
||||||
const val jafama = "2.3.2"
|
|
||||||
const val apacheIO = "2.6"
|
const val apacheIO = "2.6"
|
||||||
const val fastutil = "8.5.6"
|
const val fastutil = "8.5.6"
|
||||||
|
const val cpuFeaturesJava = "1.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,10 +3,6 @@ version = version("1.0.0")
|
|||||||
dependencies {
|
dependencies {
|
||||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
compileOnlyApi(project(":common:addons:library-image"))
|
compileOnlyApi(project(":common:addons:library-image"))
|
||||||
implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
|
|
||||||
relocate("net.jafama", "com.dfsek.terra.addons.biome.image.lib.jafama")
|
|
||||||
}
|
}
|
||||||
+1
-1
@@ -9,8 +9,8 @@ package com.dfsek.terra.addons.biome.image.v2;
|
|||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.image.converter.ColorConverter;
|
|
||||||
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
||||||
|
import com.dfsek.terra.addons.image.converter.ColorConverter;
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -13,8 +13,8 @@ import com.dfsek.tectonic.api.config.template.annotations.Value;
|
|||||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.image.v2.ImageBiomeProvider;
|
import com.dfsek.terra.addons.biome.image.v2.ImageBiomeProvider;
|
||||||
import com.dfsek.terra.addons.image.converter.ColorConverter;
|
|
||||||
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
||||||
|
import com.dfsek.terra.addons.image.converter.ColorConverter;
|
||||||
import com.dfsek.terra.api.world.biome.Biome;
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,6 @@ version = version("1.0.0")
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
|
|
||||||
relocate("net.jafama", "com.dfsek.terra.addons.biome.image.lib.jafama")
|
|
||||||
}
|
}
|
||||||
+4
-6
@@ -7,8 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.biome.image;
|
package com.dfsek.terra.addons.biome.image;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -34,7 +32,7 @@ public class ImageBiomeProvider implements BiomeProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static int distance(Color a, Color b) {
|
private static int distance(Color a, Color b) {
|
||||||
return FastMath.abs(a.getRed() - b.getRed()) + FastMath.abs(a.getGreen() - b.getGreen()) + FastMath.abs(a.getBlue() - b.getBlue());
|
return Math.abs(a.getRed() - b.getRed()) + Math.abs(a.getGreen() - b.getGreen()) + Math.abs(a.getBlue() - b.getBlue());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -70,14 +68,14 @@ public class ImageBiomeProvider implements BiomeProvider {
|
|||||||
CENTER {
|
CENTER {
|
||||||
@Override
|
@Override
|
||||||
public Color getColor(BufferedImage image, int x, int z) {
|
public Color getColor(BufferedImage image, int x, int z) {
|
||||||
return new Color(image.getRGB(FastMath.floorMod(x - image.getWidth() / 2, image.getWidth()),
|
return new Color(image.getRGB(Math.floorMod(x - image.getWidth() / 2, image.getWidth()),
|
||||||
FastMath.floorMod(z - image.getHeight() / 2, image.getHeight())));
|
Math.floorMod(z - image.getHeight() / 2, image.getHeight())));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
NONE {
|
NONE {
|
||||||
@Override
|
@Override
|
||||||
public Color getColor(BufferedImage image, int x, int z) {
|
public Color getColor(BufferedImage image, int x, int z) {
|
||||||
return new Color(image.getRGB(FastMath.floorMod(x, image.getWidth()), FastMath.floorMod(z, image.getHeight())));
|
return new Color(image.getRGB(Math.floorMod(x, image.getWidth()), Math.floorMod(z, image.getHeight())));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,4 @@ version = version("1.0.0")
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
|
|
||||||
implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
|
|
||||||
relocate("net.jafama", "com.dfsek.terra.addons.biome.pipeline.lib.jafama")
|
|
||||||
}
|
}
|
||||||
+3
-3
@@ -11,6 +11,9 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
|||||||
|
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.Source;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.BiomePipelineTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.v2.config.BiomePipelineTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.PipelineBiomeLoader;
|
import com.dfsek.terra.addons.biome.pipeline.v2.config.PipelineBiomeLoader;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.source.SamplerSourceTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.v2.config.source.SamplerSourceTemplate;
|
||||||
@@ -20,9 +23,6 @@ import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator.BorderStage
|
|||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator.ReplaceListStageTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator.ReplaceListStageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator.ReplaceStageTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator.ReplaceStageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator.SmoothStageTemplate;
|
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator.SmoothStageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Source;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
|
||||||
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
||||||
import com.dfsek.terra.api.Platform;
|
import com.dfsek.terra.api.Platform;
|
||||||
import com.dfsek.terra.api.addon.BaseAddon;
|
import com.dfsek.terra.api.addon.BaseAddon;
|
||||||
|
|||||||
+7
-8
@@ -1,13 +1,7 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2;
|
package com.dfsek.terra.addons.biome.pipeline.v2;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.BiomeChunk;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Pipeline;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.SeededVector;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
|
||||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||||
import com.github.benmanes.caffeine.cache.LoadingCache;
|
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@@ -15,6 +9,11 @@ import java.util.Optional;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.StreamSupport;
|
import java.util.stream.StreamSupport;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.BiomeChunk;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.Pipeline;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.SeededVector;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
import com.dfsek.terra.api.registry.key.StringIdentifiable;
|
import com.dfsek.terra.api.registry.key.StringIdentifiable;
|
||||||
import com.dfsek.terra.api.util.Column;
|
import com.dfsek.terra.api.util.Column;
|
||||||
@@ -81,8 +80,8 @@ public class PipelineBiomeProvider implements BiomeProvider {
|
|||||||
x /= resolution;
|
x /= resolution;
|
||||||
z /= resolution;
|
z /= resolution;
|
||||||
|
|
||||||
int chunkX = FastMath.floorDiv(x, chunkSize);
|
int chunkX = Math.floorDiv(x, chunkSize);
|
||||||
int chunkZ = FastMath.floorDiv(z, chunkSize);
|
int chunkZ = Math.floorDiv(z, chunkSize);
|
||||||
|
|
||||||
int chunkWorldX = chunkX * chunkSize;
|
int chunkWorldX = chunkX * chunkSize;
|
||||||
int chunkWorldZ = chunkZ * chunkSize;
|
int chunkWorldZ = chunkZ * chunkSize;
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.api;
|
package com.dfsek.terra.addons.biome.pipeline.v2.api;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl.ViewPoint;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl.ViewPoint;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.api;
|
package com.dfsek.terra.addons.biome.pipeline.v2.api;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl.ViewPoint;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.BiomeChunkImpl.ViewPoint;
|
||||||
|
|
||||||
|
|
||||||
public interface Stage {
|
public interface Stage {
|
||||||
|
|||||||
+1
-1
@@ -15,9 +15,9 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.PipelineBiomeProvider;
|
import com.dfsek.terra.addons.biome.pipeline.v2.PipelineBiomeProvider;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.PipelineImpl;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Source;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.Source;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.pipeline.PipelineImpl;
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
|||||||
+1
-1
@@ -7,8 +7,8 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.expander;
|
package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.expander;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Expander;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.Expander;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.stage.expander.FractalExpander;
|
import com.dfsek.terra.addons.biome.pipeline.v2.stage.expander.FractalExpander;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -11,9 +11,9 @@ import com.dfsek.tectonic.api.config.template.annotations.Value;
|
|||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.BorderListStage;
|
import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.BorderListStage;
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|||||||
+1
-1
@@ -9,9 +9,9 @@ package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator;
|
|||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.BorderStage;
|
import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.BorderStage;
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|||||||
+1
-1
@@ -11,9 +11,9 @@ import com.dfsek.tectonic.api.config.template.annotations.Value;
|
|||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.ReplaceListStage;
|
import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.ReplaceListStage;
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|||||||
+1
-1
@@ -9,9 +9,9 @@ package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator;
|
|||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.ReplaceStage;
|
import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.ReplaceStage;
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|||||||
+1
-1
@@ -7,8 +7,8 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator;
|
package com.dfsek.terra.addons.biome.pipeline.v2.config.stage.mutator;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.config.stage.StageTemplate;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.SmoothStage;
|
import com.dfsek.terra.addons.biome.pipeline.v2.stage.mutators.SmoothStage;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+3
-4
@@ -1,13 +1,12 @@
|
|||||||
package com.dfsek.terra.addons.biome.pipeline.v2.pipeline;
|
package com.dfsek.terra.addons.biome.pipeline.v2.pipeline;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.BiomeChunk;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.BiomeChunk;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Expander;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.Expander;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.SeededVector;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.SeededVector;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.Stage;
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
|
|
||||||
public class BiomeChunkImpl implements BiomeChunk {
|
public class BiomeChunkImpl implements BiomeChunk {
|
||||||
@@ -111,7 +110,7 @@ public class BiomeChunkImpl implements BiomeChunk {
|
|||||||
// chunk samples points on the same overall grid.
|
// chunk samples points on the same overall grid.
|
||||||
// Without this, shared chunk borders (required because of adjacent cell reads) will not be identical
|
// Without this, shared chunk borders (required because of adjacent cell reads) will not be identical
|
||||||
// because points would be sampled on grids at different offsets, resulting in artifacts at borders.
|
// because points would be sampled on grids at different offsets, resulting in artifacts at borders.
|
||||||
return FastMath.ceilToInt((double) finalGridOrigin / initialGridInterval) * initialGridInterval;
|
return (int) Math.ceil((double) finalGridOrigin / initialGridInterval) * initialGridInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int calculateFinalGridOrigin(int totalExpanderCount, List<Stage> stages) {
|
private static int calculateFinalGridOrigin(int totalExpanderCount, List<Stage> stages) {
|
||||||
|
|||||||
+1
-1
@@ -3,8 +3,8 @@ package com.dfsek.terra.addons.biome.pipeline.v2.source;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
|
||||||
import com.dfsek.terra.addons.biome.pipeline.v2.api.Source;
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.Source;
|
||||||
|
import com.dfsek.terra.addons.biome.pipeline.v2.api.biome.PipelineBiome;
|
||||||
|
|
||||||
|
|
||||||
public class SingleSource implements Source {
|
public class SingleSource implements Source {
|
||||||
|
|||||||
@@ -2,11 +2,4 @@ version = version("1.0.1")
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
|
|
||||||
implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
|
|
||||||
relocate("net.jafama", "com.dfsek.terra.addons.biome.pipeline.lib.jafama")
|
|
||||||
}
|
}
|
||||||
+2
-3
@@ -9,7 +9,6 @@ package com.dfsek.terra.addons.biome.pipeline;
|
|||||||
|
|
||||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||||
import com.github.benmanes.caffeine.cache.LoadingCache;
|
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@@ -86,8 +85,8 @@ public class BiomePipelineProvider implements BiomeProvider {
|
|||||||
x /= resolution;
|
x /= resolution;
|
||||||
z /= resolution;
|
z /= resolution;
|
||||||
|
|
||||||
int fdX = FastMath.floorDiv(x, pipeline.getSize());
|
int fdX = Math.floorDiv(x, pipeline.getSize());
|
||||||
int fdZ = FastMath.floorDiv(z, pipeline.getSize());
|
int fdZ = Math.floorDiv(z, pipeline.getSize());
|
||||||
return holderCache.get(new SeededVector(fdX, fdZ, seed)).getBiome(x - fdX * pipeline.getSize(),
|
return holderCache.get(new SeededVector(fdX, fdZ, seed)).getBiome(x - fdX * pipeline.getSize(),
|
||||||
z - fdZ * pipeline.getSize()).getBiome();
|
z - fdZ * pipeline.getSize()).getBiome();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,4 @@ version = version("1.2.0")
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
|
|
||||||
implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
|
|
||||||
relocate("net.jafama", "com.dfsek.terra.addons.chunkgenerator.lib.jafama")
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -16,8 +16,8 @@ import java.util.Collections;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder;
|
|
||||||
import com.dfsek.terra.addons.chunkgenerator.palette.BiomePaletteInfo;
|
import com.dfsek.terra.addons.chunkgenerator.palette.BiomePaletteInfo;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.palette.PaletteHolder;
|
||||||
import com.dfsek.terra.addons.chunkgenerator.palette.slant.SlantHolder;
|
import com.dfsek.terra.addons.chunkgenerator.palette.slant.SlantHolder;
|
||||||
import com.dfsek.terra.api.Platform;
|
import com.dfsek.terra.api.Platform;
|
||||||
import com.dfsek.terra.api.block.state.BlockState;
|
import com.dfsek.terra.api.block.state.BlockState;
|
||||||
|
|||||||
+5
-6
@@ -8,15 +8,14 @@
|
|||||||
package com.dfsek.terra.addons.chunkgenerator.generation;
|
package com.dfsek.terra.addons.chunkgenerator.generation;
|
||||||
|
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties;
|
import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties;
|
||||||
import com.dfsek.terra.addons.chunkgenerator.palette.BiomePaletteInfo;
|
|
||||||
import com.dfsek.terra.addons.chunkgenerator.generation.math.PaletteUtil;
|
import com.dfsek.terra.addons.chunkgenerator.generation.math.PaletteUtil;
|
||||||
import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.LazilyEvaluatedInterpolator;
|
import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.LazilyEvaluatedInterpolator;
|
||||||
import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D;
|
import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D;
|
||||||
import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.SamplerProvider;
|
import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.SamplerProvider;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.palette.BiomePaletteInfo;
|
||||||
import com.dfsek.terra.api.Platform;
|
import com.dfsek.terra.api.Platform;
|
||||||
import com.dfsek.terra.api.block.state.BlockState;
|
import com.dfsek.terra.api.block.state.BlockState;
|
||||||
import com.dfsek.terra.api.config.ConfigPack;
|
import com.dfsek.terra.api.config.ConfigPack;
|
||||||
@@ -133,8 +132,8 @@ public class NoiseChunkGenerator3D implements ChunkGenerator {
|
|||||||
|
|
||||||
BiomePaletteInfo paletteInfo = biome.getContext().get(paletteInfoPropertyKey);
|
BiomePaletteInfo paletteInfo = biome.getContext().get(paletteInfoPropertyKey);
|
||||||
|
|
||||||
int fdX = FastMath.floorMod(x, 16);
|
int fdX = Math.floorMod(x, 16);
|
||||||
int fdZ = FastMath.floorMod(z, 16);
|
int fdZ = Math.floorMod(z, 16);
|
||||||
|
|
||||||
Palette palette = PaletteUtil.getPalette(fdX, y, fdZ, sampler, paletteInfo, 0);
|
Palette palette = PaletteUtil.getPalette(fdX, y, fdZ, sampler, paletteInfo, 0);
|
||||||
double noise = sampler.sample(fdX, y, fdZ);
|
double noise = sampler.sample(fdX, y, fdZ);
|
||||||
@@ -156,8 +155,8 @@ public class NoiseChunkGenerator3D implements ChunkGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public double getSlant(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
|
public double getSlant(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
|
||||||
int fdX = FastMath.floorMod(x, 16);
|
int fdX = Math.floorMod(x, 16);
|
||||||
int fdZ = FastMath.floorMod(z, 16);
|
int fdZ = Math.floorMod(z, 16);
|
||||||
return biomeProvider.getBiome(x, y, z, world.getSeed())
|
return biomeProvider.getBiome(x, y, z, world.getSeed())
|
||||||
.getContext()
|
.getContext()
|
||||||
.get(paletteInfoPropertyKey)
|
.get(paletteInfoPropertyKey)
|
||||||
|
|||||||
+1
-1
@@ -7,8 +7,8 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.chunkgenerator.generation.math;
|
package com.dfsek.terra.addons.chunkgenerator.generation.math;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.chunkgenerator.palette.BiomePaletteInfo;
|
|
||||||
import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D;
|
import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.Sampler3D;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.palette.BiomePaletteInfo;
|
||||||
import com.dfsek.terra.addons.chunkgenerator.palette.slant.SlantHolder;
|
import com.dfsek.terra.addons.chunkgenerator.palette.slant.SlantHolder;
|
||||||
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
||||||
|
|
||||||
|
|||||||
+2
-4
@@ -7,8 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation;
|
package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties;
|
import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties;
|
||||||
import com.dfsek.terra.api.properties.PropertyKey;
|
import com.dfsek.terra.api.properties.PropertyKey;
|
||||||
import com.dfsek.terra.api.util.Column;
|
import com.dfsek.terra.api.util.Column;
|
||||||
@@ -134,7 +132,7 @@ public class ChunkInterpolator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static int reRange(int value, int high) {
|
private static int reRange(int value, int high) {
|
||||||
return FastMath.max(FastMath.min(value, high), 0);
|
return Math.max(Math.min(value, high), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -146,7 +144,7 @@ public class ChunkInterpolator {
|
|||||||
* @return double - The interpolated noise at the coordinates.
|
* @return double - The interpolated noise at the coordinates.
|
||||||
*/
|
*/
|
||||||
public double getNoise(double x, double y, double z) {
|
public double getNoise(double x, double y, double z) {
|
||||||
return interpGrid[reRange(((int) x) / 4, 3)][(FastMath.max(FastMath.min(((int) y), max), min) - min) / 4][reRange(((int) z) / 4,
|
return interpGrid[reRange(((int) x) / 4, 3)][(Math.max(Math.min(((int) y), max), min) - min) / 4][reRange(((int) z) / 4,
|
||||||
3)].trilerp(
|
3)].trilerp(
|
||||||
(x % 4) / 4, (y % 4) / 4, (z % 4) / 4);
|
(x % 4) / 4, (y % 4) / 4, (z % 4) / 4);
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-6
@@ -1,7 +1,5 @@
|
|||||||
package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation;
|
package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties;
|
import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties;
|
||||||
import com.dfsek.terra.api.properties.PropertyKey;
|
import com.dfsek.terra.api.properties.PropertyKey;
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
@@ -30,8 +28,8 @@ public class LazilyEvaluatedInterpolator {
|
|||||||
PropertyKey<BiomeNoiseProperties> noisePropertiesKey, int min, int horizontalRes, int verticalRes,
|
PropertyKey<BiomeNoiseProperties> noisePropertiesKey, int min, int horizontalRes, int verticalRes,
|
||||||
long seed) {
|
long seed) {
|
||||||
this.noisePropertiesKey = noisePropertiesKey;
|
this.noisePropertiesKey = noisePropertiesKey;
|
||||||
int hSamples = FastMath.ceilToInt(16.0 / horizontalRes);
|
int hSamples = (int) Math.ceil(16.0 / horizontalRes);
|
||||||
int vSamples = FastMath.ceilToInt((double) (max - min) / verticalRes);
|
int vSamples = (int) Math.ceil((double) (max - min) / verticalRes);
|
||||||
this.zMul = (hSamples + 1);
|
this.zMul = (hSamples + 1);
|
||||||
this.yMul = zMul * zMul;
|
this.yMul = zMul * zMul;
|
||||||
samples = new Double[yMul * (vSamples + 1)];
|
samples = new Double[yMul * (vSamples + 1)];
|
||||||
@@ -52,7 +50,7 @@ public class LazilyEvaluatedInterpolator {
|
|||||||
int xi = ox + chunkX;
|
int xi = ox + chunkX;
|
||||||
int zi = oz + chunkZ;
|
int zi = oz + chunkZ;
|
||||||
|
|
||||||
int y = FastMath.min(max, oy);
|
int y = Math.min(max, oy);
|
||||||
|
|
||||||
sample = biomeProvider
|
sample = biomeProvider
|
||||||
.getBiome(xi, y, zi, seed)
|
.getBiome(xi, y, zi, seed)
|
||||||
@@ -93,7 +91,7 @@ public class LazilyEvaluatedInterpolator {
|
|||||||
return lerp_bottom;
|
return lerp_bottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
double yFrac = (double) FastMath.floorMod(y, verticalRes) / verticalRes;
|
double yFrac = (double) Math.floorMod(y, verticalRes) / verticalRes;
|
||||||
|
|
||||||
|
|
||||||
double sample_0_1_0 = sample(xIndex, yIndex + 1, zIndex, x, y + verticalRes, z);
|
double sample_0_1_0 = sample(xIndex, yIndex + 1, zIndex, x, y + verticalRes, z);
|
||||||
|
|||||||
+2
-4
@@ -7,8 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.chunkgenerator.generation.math.samplers;
|
package com.dfsek.terra.addons.chunkgenerator.generation.math.samplers;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties;
|
import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties;
|
||||||
import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.ChunkInterpolator;
|
import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.ChunkInterpolator;
|
||||||
import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.ElevationInterpolator;
|
import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.ElevationInterpolator;
|
||||||
@@ -28,10 +26,10 @@ public class Sampler3D {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public double sample(double x, double y, double z) {
|
public double sample(double x, double y, double z) {
|
||||||
return interpolator.getNoise(x, y, z) + elevationInterpolator.getElevation(FastMath.roundToInt(x), FastMath.roundToInt(z));
|
return interpolator.getNoise(x, y, z) + elevationInterpolator.getElevation((int) Math.round(x), (int) Math.round(z));
|
||||||
}
|
}
|
||||||
|
|
||||||
public double sample(int x, int y, int z) {
|
public double sample(int x, int y, int z) {
|
||||||
return interpolator.getNoise(x, y, z) + elevationInterpolator.getElevation(FastMath.roundToInt(x), FastMath.roundToInt(z));
|
return interpolator.getNoise(x, y, z) + elevationInterpolator.getElevation(x, z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-3
@@ -19,7 +19,6 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math.samplers;
|
|||||||
|
|
||||||
import com.github.benmanes.caffeine.cache.Cache;
|
import com.github.benmanes.caffeine.cache.Cache;
|
||||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties;
|
import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties;
|
||||||
import com.dfsek.terra.api.Platform;
|
import com.dfsek.terra.api.Platform;
|
||||||
@@ -45,8 +44,8 @@ public class SamplerProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Sampler3D get(int x, int z, WorldProperties world, BiomeProvider provider) {
|
public Sampler3D get(int x, int z, WorldProperties world, BiomeProvider provider) {
|
||||||
int cx = FastMath.floorDiv(x, 16);
|
int cx = Math.floorDiv(x, 16);
|
||||||
int cz = FastMath.floorDiv(z, 16);
|
int cz = Math.floorDiv(z, 16);
|
||||||
return getChunk(cx, cz, world, provider);
|
return getChunk(cx, cz, world, provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-5
@@ -7,8 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.chunkgenerator.palette;
|
package com.dfsek.terra.addons.chunkgenerator.palette;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
@@ -55,11 +53,11 @@ public class PaletteHolder {
|
|||||||
|
|
||||||
public PaletteHolder build() {
|
public PaletteHolder build() {
|
||||||
|
|
||||||
int min = FastMath.min(paletteMap.keySet().stream().min(Integer::compareTo).orElse(0), 0);
|
int min = Math.min(paletteMap.keySet().stream().min(Integer::compareTo).orElse(0), 0);
|
||||||
int max = FastMath.max(paletteMap.keySet().stream().max(Integer::compareTo).orElse(255), 255);
|
int max = Math.max(paletteMap.keySet().stream().max(Integer::compareTo).orElse(255), 255);
|
||||||
|
|
||||||
Palette[] palettes = new Palette[paletteMap.lastKey() + 1 - min];
|
Palette[] palettes = new Palette[paletteMap.lastKey() + 1 - min];
|
||||||
for(int y = min; y <= FastMath.max(paletteMap.lastKey(), max); y++) {
|
for(int y = min; y <= Math.max(paletteMap.lastKey(), max); y++) {
|
||||||
Palette d = null;
|
Palette d = null;
|
||||||
for(Entry<Integer, Palette> e : paletteMap.entrySet()) {
|
for(Entry<Integer, Palette> e : paletteMap.entrySet()) {
|
||||||
if(e.getKey() >= y) {
|
if(e.getKey() >= y) {
|
||||||
|
|||||||
@@ -2,11 +2,4 @@ version = version("1.0.0")
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
|
|
||||||
implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
|
|
||||||
relocate("net.jafama", "com.dfsek.terra.addons.feature.distributor.lib.jafama")
|
|
||||||
}
|
}
|
||||||
+3
-14
@@ -1,7 +1,5 @@
|
|||||||
package com.dfsek.terra.addons.feature.distributor.distributors;
|
package com.dfsek.terra.addons.feature.distributor.distributors;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import com.dfsek.terra.api.structure.feature.Distributor;
|
import com.dfsek.terra.api.structure.feature.Distributor;
|
||||||
@@ -21,21 +19,12 @@ public class PaddedGridDistributor implements Distributor {
|
|||||||
this.cellWidth = width + padding;
|
this.cellWidth = width + padding;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static long murmur64(long h) {
|
|
||||||
h ^= h >>> 33;
|
|
||||||
h *= 0xff51afd7ed558ccdL;
|
|
||||||
h ^= h >>> 33;
|
|
||||||
h *= 0xc4ceb9fe1a85ec53L;
|
|
||||||
h ^= h >>> 33;
|
|
||||||
return h;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matches(int x, int z, long seed) {
|
public boolean matches(int x, int z, long seed) {
|
||||||
int cellX = FastMath.floorDiv(x, cellWidth);
|
int cellX = Math.floorDiv(x, cellWidth);
|
||||||
int cellZ = FastMath.floorDiv(z, cellWidth);
|
int cellZ = Math.floorDiv(z, cellWidth);
|
||||||
|
|
||||||
Random random = new Random((murmur64(MathUtil.squash(cellX, cellZ)) ^ seed) + salt);
|
Random random = new Random((MathUtil.murmur64(MathUtil.squash(cellX, cellZ)) ^ seed) + salt);
|
||||||
|
|
||||||
int pointX = random.nextInt(width) + cellX * cellWidth;
|
int pointX = random.nextInt(width) + cellX * cellWidth;
|
||||||
int pointZ = random.nextInt(width) + cellZ * cellWidth;
|
int pointZ = random.nextInt(width) + cellZ * cellWidth;
|
||||||
|
|||||||
@@ -2,10 +2,4 @@ version = version("1.0.0")
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
|
|
||||||
relocate("net.jafama", "com.dfsek.terra.addons.flora.lib.jafama")
|
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-5
@@ -7,8 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.flora.flora.gen;
|
package com.dfsek.terra.addons.flora.flora.gen;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -60,7 +58,7 @@ public class TerraFlora implements Structure {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private ProbabilityCollection<BlockState> getStateCollection(int layer) {
|
private ProbabilityCollection<BlockState> getStateCollection(int layer) {
|
||||||
return layers.get(FastMath.max(FastMath.min(layer, layers.size() - 1), 0));
|
return layers.get(Math.max(Math.min(layer, layers.size() - 1), 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
private EnumSet<Direction> getFaces(Vector3Int b, WritableWorld world) {
|
private EnumSet<Direction> getFaces(Vector3Int b, WritableWorld world) {
|
||||||
@@ -82,8 +80,8 @@ public class TerraFlora implements Structure {
|
|||||||
Direction.class);
|
Direction.class);
|
||||||
if(doRotation && faces.size() == 0) return false; // Don't plant if no faces are valid.
|
if(doRotation && faces.size() == 0) return false; // Don't plant if no faces are valid.
|
||||||
|
|
||||||
for(int i = 0; FastMath.abs(i) < size; i += c) { // Down if ceiling, up if floor
|
for(int i = 0; Math.abs(i) < size; i += c) { // Down if ceiling, up if floor
|
||||||
int lvl = (FastMath.abs(i));
|
int lvl = (Math.abs(i));
|
||||||
BlockState data = getStateCollection((ceiling ? lvl : size - lvl - 1)).get(distribution, location.getX(), location.getY(),
|
BlockState data = getStateCollection((ceiling ? lvl : size - lvl - 1)).get(distribution, location.getX(), location.getY(),
|
||||||
location.getZ(), world.getSeed());
|
location.getZ(), world.getSeed());
|
||||||
if(doRotation) {
|
if(doRotation) {
|
||||||
|
|||||||
@@ -2,11 +2,4 @@ version = version("1.1.0")
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
|
|
||||||
implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
|
|
||||||
relocate("net.jafama", "com.dfsek.terra.addons.feature.locator.lib.jafama")
|
|
||||||
}
|
}
|
||||||
+2
-4
@@ -7,8 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.feature.locator.locators;
|
package com.dfsek.terra.addons.feature.locator.locators;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.feature.locator.patterns.Pattern;
|
import com.dfsek.terra.addons.feature.locator.patterns.Pattern;
|
||||||
import com.dfsek.terra.api.structure.feature.BinaryColumn;
|
import com.dfsek.terra.api.structure.feature.BinaryColumn;
|
||||||
import com.dfsek.terra.api.structure.feature.Locator;
|
import com.dfsek.terra.api.structure.feature.Locator;
|
||||||
@@ -27,8 +25,8 @@ public class PatternLocator implements Locator {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BinaryColumn getSuitableCoordinates(Column<?> column) {
|
public BinaryColumn getSuitableCoordinates(Column<?> column) {
|
||||||
int min = FastMath.max(column.getMinY(), search.getMin());
|
int min = Math.max(column.getMinY(), search.getMin());
|
||||||
int max = FastMath.min(column.getMaxY(), search.getMax());
|
int max = Math.min(column.getMaxY(), search.getMax());
|
||||||
if(min >= max) return BinaryColumn.getNull();
|
if(min >= max) return BinaryColumn.getNull();
|
||||||
return new BinaryColumn(min, max, y -> pattern.matches(y, column));
|
return new BinaryColumn(min, max, y -> pattern.matches(y, column));
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-4
@@ -7,8 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.feature.locator.locators;
|
package com.dfsek.terra.addons.feature.locator.locators;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.structure.feature.BinaryColumn;
|
import com.dfsek.terra.api.structure.feature.BinaryColumn;
|
||||||
import com.dfsek.terra.api.structure.feature.Locator;
|
import com.dfsek.terra.api.structure.feature.Locator;
|
||||||
import com.dfsek.terra.api.util.Range;
|
import com.dfsek.terra.api.util.Range;
|
||||||
@@ -26,8 +24,8 @@ public class SurfaceLocator implements Locator {
|
|||||||
@Override
|
@Override
|
||||||
public BinaryColumn getSuitableCoordinates(Column<?> column) {
|
public BinaryColumn getSuitableCoordinates(Column<?> column) {
|
||||||
BinaryColumnBuilder builder = column.newBinaryColumn();
|
BinaryColumnBuilder builder = column.newBinaryColumn();
|
||||||
int max = FastMath.min(search.getMax(), column.getMaxY());
|
int max = Math.min(search.getMax(), column.getMaxY());
|
||||||
int min = FastMath.max(search.getMin(), column.getMinY());
|
int min = Math.max(search.getMin(), column.getMinY());
|
||||||
if(min >= max) return builder.build();
|
if(min >= max) return builder.build();
|
||||||
for(int y = min; y < max; y++) {
|
for(int y = min; y < max; y++) {
|
||||||
if(column.getBlock(y).isAir() && !column.getBlock(y - 1).isAir()) {
|
if(column.getBlock(y).isAir() && !column.getBlock(y - 1).isAir()) {
|
||||||
|
|||||||
+4
-6
@@ -7,8 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.feature.locator.patterns;
|
package com.dfsek.terra.addons.feature.locator.patterns;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
import com.dfsek.terra.api.block.state.BlockState;
|
import com.dfsek.terra.api.block.state.BlockState;
|
||||||
@@ -28,8 +26,8 @@ public class MatchPattern implements Pattern {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matches(int y, Column<?> column) {
|
public boolean matches(int y, Column<?> column) {
|
||||||
int min = FastMath.max(column.getMinY(), range.getMin() + y);
|
int min = Math.max(column.getMinY(), range.getMin() + y);
|
||||||
int max = FastMath.min(column.getMaxY(), range.getMax() + y);
|
int max = Math.min(column.getMaxY(), range.getMax() + y);
|
||||||
if(max <= min) return false;
|
if(max <= min) return false;
|
||||||
for(int i = min; i < max; i++) {
|
for(int i = min; i < max; i++) {
|
||||||
if(!matches.test(column.getBlock(i))) return false;
|
if(!matches.test(column.getBlock(i))) return false;
|
||||||
@@ -39,8 +37,8 @@ public class MatchPattern implements Pattern {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matches(WritableWorld world, int x, int y, int z) {
|
public boolean matches(WritableWorld world, int x, int y, int z) {
|
||||||
int min = FastMath.max(world.getMinHeight(), range.getMin() + y);
|
int min = Math.max(world.getMinHeight(), range.getMin() + y);
|
||||||
int max = FastMath.min(world.getMaxHeight(), range.getMax() + y);
|
int max = Math.min(world.getMaxHeight(), range.getMax() + y);
|
||||||
if(max <= min) return false;
|
if(max <= min) return false;
|
||||||
for(int i = min; i < max; i++) {
|
for(int i = min; i < max; i++) {
|
||||||
if(!matches.test(world.getBlockState(x, i, z))) return false;
|
if(!matches.test(world.getBlockState(x, i, z))) return false;
|
||||||
|
|||||||
@@ -5,12 +5,4 @@ version = version("1.1.0")
|
|||||||
dependencies {
|
dependencies {
|
||||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
api("com.dfsek", "paralithic", Versions.Libraries.paralithic)
|
api("com.dfsek", "paralithic", Versions.Libraries.paralithic)
|
||||||
implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
tasks.named<ShadowJar>("shadowJar") {
|
|
||||||
relocate("com.dfsek.paralithic", "com.dfsek.terra.addons.noise.lib.paralithic")
|
|
||||||
relocate("net.jafama", "com.dfsek.terra.addons.noise.lib.jafama")
|
|
||||||
}
|
}
|
||||||
+4
-5
@@ -11,9 +11,8 @@ 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.annotations.Value;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate;
|
import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate;
|
||||||
import com.dfsek.terra.addons.noise.samplers.noise.random.WhiteNoiseSampler;
|
|
||||||
import com.dfsek.terra.addons.noise.samplers.noise.simplex.OpenSimplex2Sampler;
|
|
||||||
import com.dfsek.terra.addons.noise.samplers.noise.PseudoErosionSampler;
|
import com.dfsek.terra.addons.noise.samplers.noise.PseudoErosionSampler;
|
||||||
|
import com.dfsek.terra.addons.noise.samplers.noise.simplex.OpenSimplex2Sampler;
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
@@ -41,9 +40,9 @@ public class PseudoErosionSamplerTemplate extends SamplerTemplate<PseudoErosionS
|
|||||||
@Override
|
@Override
|
||||||
public NoiseSampler get() {
|
public NoiseSampler get() {
|
||||||
if(lookup == null) {
|
if(lookup == null) {
|
||||||
// OpenSimplex2Sampler l = new OpenSimplex2Sampler();
|
OpenSimplex2Sampler lookup = new OpenSimplex2Sampler();
|
||||||
// l.setFrequency(0.0005);
|
lookup.setFrequency(0.0005);
|
||||||
lookup = new WhiteNoiseSampler();
|
this.lookup = lookup;
|
||||||
}
|
}
|
||||||
return new PseudoErosionSampler(salt, frequency, lookup, jitter);
|
return new PseudoErosionSampler(salt, frequency, lookup, jitter);
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -2,14 +2,14 @@ package com.dfsek.terra.addons.noise.config.templates.normalizer;
|
|||||||
|
|
||||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.noise.math.CubicSpline;
|
import com.dfsek.terra.addons.noise.math.CubicSpline;
|
||||||
import com.dfsek.terra.addons.noise.math.CubicSpline.Point;
|
import com.dfsek.terra.addons.noise.math.CubicSpline.Point;
|
||||||
import com.dfsek.terra.addons.noise.normalizer.CubicSplineNoiseSampler;
|
import com.dfsek.terra.addons.noise.normalizer.CubicSplineNoiseSampler;
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
|
|
||||||
public class CubicSplineNormalizerTemplate extends NormalizerTemplate<CubicSplineNoiseSampler> {
|
public class CubicSplineNormalizerTemplate extends NormalizerTemplate<CubicSplineNoiseSampler> {
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -11,16 +11,16 @@ import com.dfsek.paralithic.eval.tokenizer.ParseException;
|
|||||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
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.annotations.Value;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler;
|
import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler;
|
||||||
import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate;
|
import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate;
|
||||||
import com.dfsek.terra.addons.noise.normalizer.ExpressionNormalizer;
|
import com.dfsek.terra.addons.noise.normalizer.ExpressionNormalizer;
|
||||||
import com.dfsek.terra.api.config.meta.Meta;
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static com.dfsek.terra.addons.noise.paralithic.FunctionUtil.convertFunctionsAndSamplers;
|
import static com.dfsek.terra.addons.noise.paralithic.FunctionUtil.convertFunctionsAndSamplers;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+2
-4
@@ -5,6 +5,8 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static com.dfsek.terra.api.util.MathUtil.lerp;
|
||||||
|
|
||||||
|
|
||||||
public class CubicSpline {
|
public class CubicSpline {
|
||||||
|
|
||||||
@@ -75,10 +77,6 @@ public class CubicSpline {
|
|||||||
return left;
|
return left;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static double lerp(double t, double a, double b) {
|
|
||||||
return a + t * (b - a);
|
|
||||||
}
|
|
||||||
|
|
||||||
public record Point(double from, double to, double gradient) implements Comparable<Point> {
|
public record Point(double from, double to, double gradient) implements Comparable<Point> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+1
-3
@@ -7,8 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.normalizer;
|
package com.dfsek.terra.addons.noise.normalizer;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
|
||||||
@@ -24,6 +22,6 @@ public class ClampNormalizer extends Normalizer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double normalize(double in) {
|
public double normalize(double in) {
|
||||||
return FastMath.max(FastMath.min(in, max), min);
|
return Math.max(Math.min(in, max), min);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -6,10 +6,10 @@ import com.dfsek.paralithic.eval.parser.Scope;
|
|||||||
import com.dfsek.paralithic.eval.tokenizer.ParseException;
|
import com.dfsek.paralithic.eval.tokenizer.ParseException;
|
||||||
import com.dfsek.paralithic.functions.Function;
|
import com.dfsek.paralithic.functions.Function;
|
||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
|
||||||
public class ExpressionNormalizer extends Normalizer {
|
public class ExpressionNormalizer extends Normalizer {
|
||||||
|
|
||||||
|
|||||||
+2
-4
@@ -7,8 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.normalizer;
|
package com.dfsek.terra.addons.noise.normalizer;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
import com.dfsek.terra.api.util.MathUtil;
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
@@ -41,8 +39,8 @@ public class NormalNormalizer extends Normalizer {
|
|||||||
end = mid;
|
end = mid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
double left = FastMath.abs(lookup[start] - in);
|
double left = Math.abs(lookup[start] - in);
|
||||||
double right = FastMath.abs(lookup[end] - in);
|
double right = Math.abs(lookup[end] - in);
|
||||||
|
|
||||||
double fin;
|
double fin;
|
||||||
if(left <= right) {
|
if(left <= right) {
|
||||||
|
|||||||
+4
-2
@@ -9,6 +9,8 @@ package com.dfsek.terra.addons.noise.normalizer;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public abstract class Normalizer implements NoiseSampler {
|
public abstract class Normalizer implements NoiseSampler {
|
||||||
private final NoiseSampler sampler;
|
private final NoiseSampler sampler;
|
||||||
@@ -20,12 +22,12 @@ public abstract class Normalizer implements NoiseSampler {
|
|||||||
public abstract double normalize(double in);
|
public abstract double normalize(double in);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return normalize(sampler.noise(seed, x, y));
|
return normalize(sampler.noise(seed, x, y));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return normalize(sampler.noise(seed, x, y, z));
|
return normalize(sampler.noise(seed, x, y, z));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-3
@@ -7,8 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.normalizer;
|
package com.dfsek.terra.addons.noise.normalizer;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
|
||||||
@@ -22,6 +20,6 @@ public class PosterizationNormalizer extends Normalizer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double normalize(double in) {
|
public double normalize(double in) {
|
||||||
return FastMath.roundToInt((in + 1) / stepSize) * stepSize - 1;
|
return (int) Math.round((in + 1) / stepSize) * stepSize - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -3,15 +3,15 @@ package com.dfsek.terra.addons.noise.paralithic;
|
|||||||
import com.dfsek.paralithic.eval.tokenizer.ParseException;
|
import com.dfsek.paralithic.eval.tokenizer.ParseException;
|
||||||
import com.dfsek.paralithic.functions.Function;
|
import com.dfsek.paralithic.functions.Function;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler;
|
import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler;
|
||||||
import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate;
|
import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate;
|
||||||
import com.dfsek.terra.addons.noise.paralithic.defined.UserDefinedFunction;
|
import com.dfsek.terra.addons.noise.paralithic.defined.UserDefinedFunction;
|
||||||
import com.dfsek.terra.addons.noise.paralithic.noise.NoiseFunction2;
|
import com.dfsek.terra.addons.noise.paralithic.noise.NoiseFunction2;
|
||||||
import com.dfsek.terra.addons.noise.paralithic.noise.NoiseFunction3;
|
import com.dfsek.terra.addons.noise.paralithic.noise.NoiseFunction3;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
|
|
||||||
public class FunctionUtil {
|
public class FunctionUtil {
|
||||||
private FunctionUtil() {}
|
private FunctionUtil() {}
|
||||||
|
|||||||
+4
-2
@@ -9,6 +9,8 @@ package com.dfsek.terra.addons.noise.samplers;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class DomainWarpedSampler implements NoiseSampler {
|
public class DomainWarpedSampler implements NoiseSampler {
|
||||||
private final NoiseSampler function;
|
private final NoiseSampler function;
|
||||||
@@ -22,7 +24,7 @@ public class DomainWarpedSampler implements NoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return function.noise(seed++,
|
return function.noise(seed++,
|
||||||
x + warp.noise(seed++, x, y) * amplitude,
|
x + warp.noise(seed++, x, y) * amplitude,
|
||||||
y + warp.noise(seed, x, y) * amplitude
|
y + warp.noise(seed, x, y) * amplitude
|
||||||
@@ -30,7 +32,7 @@ public class DomainWarpedSampler implements NoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return function.noise(seed++,
|
return function.noise(seed++,
|
||||||
x + warp.noise(seed++, x, y, z) * amplitude,
|
x + warp.noise(seed++, x, y, z) * amplitude,
|
||||||
y + warp.noise(seed++, x, y, z) * amplitude,
|
y + warp.noise(seed++, x, y, z) * amplitude,
|
||||||
|
|||||||
+5
-6
@@ -7,9 +7,8 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.samplers;
|
package com.dfsek.terra.addons.noise.samplers;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
@@ -27,14 +26,14 @@ public class ImageSampler implements NoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return ((channel.getChannel(image.getRGB(FastMath.floorMod(FastMath.floorToInt(x * frequency), image.getWidth()),
|
return ((channel.getChannel(image.getRGB(Math.floorMod((int) Math.floor(x * frequency), image.getWidth()),
|
||||||
FastMath.floorMod(FastMath.floorToInt(y * frequency), image.getHeight()))) / 255D) - 0.5) *
|
Math.floorMod((int) Math.floor(y * frequency), image.getHeight()))) / 255D) - 0.5) *
|
||||||
2;
|
2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return noise(seed, x, y);
|
return noise(seed, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-2
@@ -9,6 +9,8 @@ package com.dfsek.terra.addons.noise.samplers;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class KernelSampler implements NoiseSampler {
|
public class KernelSampler implements NoiseSampler {
|
||||||
private final double[][] kernel;
|
private final double[][] kernel;
|
||||||
@@ -25,7 +27,7 @@ public class KernelSampler implements NoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
x *= frequency;
|
x *= frequency;
|
||||||
y *= frequency;
|
y *= frequency;
|
||||||
double accumulator = 0;
|
double accumulator = 0;
|
||||||
@@ -43,7 +45,7 @@ public class KernelSampler implements NoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
x *= frequency;
|
x *= frequency;
|
||||||
y *= frequency;
|
y *= frequency;
|
||||||
z *= frequency;
|
z *= frequency;
|
||||||
|
|||||||
+4
-2
@@ -2,6 +2,8 @@ package com.dfsek.terra.addons.noise.samplers;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class LinearHeightmapSampler implements NoiseSampler {
|
public class LinearHeightmapSampler implements NoiseSampler {
|
||||||
private final NoiseSampler sampler;
|
private final NoiseSampler sampler;
|
||||||
@@ -16,12 +18,12 @@ public class LinearHeightmapSampler implements NoiseSampler {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return noise(seed, x, 0, y);
|
return noise(seed, x, 0, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return -y + base + sampler.noise(seed, x, y, z) * scale;
|
return -y + base + sampler.noise(seed, x, y, z) * scale;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-2
@@ -2,6 +2,8 @@ package com.dfsek.terra.addons.noise.samplers;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class TranslateSampler implements NoiseSampler {
|
public class TranslateSampler implements NoiseSampler {
|
||||||
|
|
||||||
@@ -16,12 +18,12 @@ public class TranslateSampler implements NoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return sampler.noise(seed, x - dx, y - dz);
|
return sampler.noise(seed, x - dx, y - dz);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return sampler.noise(seed, x - dx, y - dy, z - dz);
|
return sampler.noise(seed, x - dx, y - dy, z - dz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-2
@@ -2,6 +2,8 @@ package com.dfsek.terra.addons.noise.samplers.arithmetic;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public abstract class BinaryArithmeticSampler implements NoiseSampler {
|
public abstract class BinaryArithmeticSampler implements NoiseSampler {
|
||||||
private final NoiseSampler left;
|
private final NoiseSampler left;
|
||||||
@@ -13,12 +15,12 @@ public abstract class BinaryArithmeticSampler implements NoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return operate(left.noise(seed, x, y), right.noise(seed, x, y));
|
return operate(left.noise(seed, x, y), right.noise(seed, x, y));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return operate(left.noise(seed, x, y, z), right.noise(seed, x, y, z));
|
return operate(left.noise(seed, x, y, z), right.noise(seed, x, y, z));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-3
@@ -1,7 +1,5 @@
|
|||||||
package com.dfsek.terra.addons.noise.samplers.arithmetic;
|
package com.dfsek.terra.addons.noise.samplers.arithmetic;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
|
||||||
@@ -12,6 +10,6 @@ public class MaxSampler extends BinaryArithmeticSampler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double operate(double left, double right) {
|
public double operate(double left, double right) {
|
||||||
return FastMath.max(left, right);
|
return Math.max(left, right);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-3
@@ -1,7 +1,5 @@
|
|||||||
package com.dfsek.terra.addons.noise.samplers.arithmetic;
|
package com.dfsek.terra.addons.noise.samplers.arithmetic;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
|
||||||
@@ -12,6 +10,6 @@ public class MinSampler extends BinaryArithmeticSampler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double operate(double left, double right) {
|
public double operate(double left, double right) {
|
||||||
return FastMath.min(left, right);
|
return Math.min(left, right);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+21
-23
@@ -7,11 +7,11 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.samplers.noise;
|
package com.dfsek.terra.addons.noise.samplers.noise;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.noise.samplers.noise.simplex.OpenSimplex2Sampler;
|
import com.dfsek.terra.addons.noise.samplers.noise.simplex.OpenSimplex2Sampler;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NoiseSampler implementation for Cellular (Voronoi/Worley) Noise.
|
* NoiseSampler implementation for Cellular (Voronoi/Worley) Noise.
|
||||||
@@ -221,10 +221,10 @@ public class CellularSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y) {
|
public double getNoiseRaw(long sl, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
int xr = fastRound(x);
|
int xr = (int) Math.round(x);
|
||||||
int yr = fastRound(y);
|
int yr = (int) Math.round(y);
|
||||||
|
|
||||||
double distance0 = Double.MAX_VALUE;
|
double distance0 = Double.MAX_VALUE;
|
||||||
double distance1 = Double.MAX_VALUE;
|
double distance1 = Double.MAX_VALUE;
|
||||||
@@ -251,12 +251,12 @@ public class CellularSampler extends NoiseFunction {
|
|||||||
double vecY = (yi - y) + RAND_VECS_2D[idx | 1] * cellularJitter;
|
double vecY = (yi - y) + RAND_VECS_2D[idx | 1] * cellularJitter;
|
||||||
|
|
||||||
double newDistance = switch(distanceFunction) {
|
double newDistance = switch(distanceFunction) {
|
||||||
case Manhattan -> fastAbs(vecX) + fastAbs(vecY);
|
case Manhattan -> Math.abs(vecX) + Math.abs(vecY);
|
||||||
case Hybrid -> (fastAbs(vecX) + fastAbs(vecY)) + (vecX * vecX + vecY * vecY);
|
case Hybrid -> (Math.abs(vecX) + Math.abs(vecY)) + (vecX * vecX + vecY * vecY);
|
||||||
default -> vecX * vecX + vecY * vecY;
|
default -> vecX * vecX + vecY * vecY;
|
||||||
};
|
};
|
||||||
|
|
||||||
distance1 = fastMax(fastMin(distance1, newDistance), distance0);
|
distance1 = Math.max(Math.min(distance1, newDistance), distance0);
|
||||||
if(newDistance < distance0) {
|
if(newDistance < distance0) {
|
||||||
distance0 = newDistance;
|
distance0 = newDistance;
|
||||||
closestHash = hash;
|
closestHash = hash;
|
||||||
@@ -274,10 +274,8 @@ public class CellularSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(distanceFunction == DistanceFunction.Euclidean && returnType != ReturnType.CellValue) {
|
if(distanceFunction == DistanceFunction.Euclidean && returnType != ReturnType.CellValue) {
|
||||||
distance0 = fastSqrt(distance0);
|
distance0 = Math.sqrt(distance0);
|
||||||
if(returnType != ReturnType.CellValue) {
|
distance1 = Math.sqrt(distance1);
|
||||||
distance1 = fastSqrt(distance1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return switch(returnType) {
|
return switch(returnType) {
|
||||||
@@ -295,16 +293,16 @@ public class CellularSampler extends NoiseFunction {
|
|||||||
case Distance3Sub -> distance2 - distance0 - 1;
|
case Distance3Sub -> distance2 - distance0 - 1;
|
||||||
case Distance3Mul -> distance2 * distance0 - 1;
|
case Distance3Mul -> distance2 * distance0 - 1;
|
||||||
case Distance3Div -> distance0 / distance2 - 1;
|
case Distance3Div -> distance0 / distance2 - 1;
|
||||||
case Angle -> FastMath.atan2(y / frequency - centerY, x / frequency - centerX);
|
case Angle -> Math.atan2(y / frequency - centerY, x / frequency - centerX);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y, double z) {
|
public double getNoiseRaw(long sl, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
int xr = fastRound(x);
|
int xr = (int) Math.round(x);
|
||||||
int yr = fastRound(y);
|
int yr = (int) Math.round(y);
|
||||||
int zr = fastRound(z);
|
int zr = (int) Math.round(z);
|
||||||
|
|
||||||
double distance0 = Double.MAX_VALUE;
|
double distance0 = Double.MAX_VALUE;
|
||||||
double distance1 = Double.MAX_VALUE;
|
double distance1 = Double.MAX_VALUE;
|
||||||
@@ -338,10 +336,10 @@ public class CellularSampler extends NoiseFunction {
|
|||||||
double newDistance = 0;
|
double newDistance = 0;
|
||||||
switch(distanceFunction) {
|
switch(distanceFunction) {
|
||||||
case Euclidean, EuclideanSq -> newDistance = vecX * vecX + vecY * vecY + vecZ * vecZ;
|
case Euclidean, EuclideanSq -> newDistance = vecX * vecX + vecY * vecY + vecZ * vecZ;
|
||||||
case Manhattan -> newDistance = fastAbs(vecX) + fastAbs(vecY) + fastAbs(vecZ);
|
case Manhattan -> newDistance = Math.abs(vecX) + Math.abs(vecY) + Math.abs(vecZ);
|
||||||
case Hybrid -> {
|
case Hybrid -> {
|
||||||
newDistance = (fastAbs(vecX) + fastAbs(vecY) + fastAbs(vecZ)) + (vecX * vecX + vecY * vecY + vecZ * vecZ);
|
newDistance = (Math.abs(vecX) + Math.abs(vecY) + Math.abs(vecZ)) + (vecX * vecX + vecY * vecY + vecZ * vecZ);
|
||||||
distance1 = fastMax(fastMin(distance1, newDistance), distance0);
|
distance1 = Math.max(Math.min(distance1, newDistance), distance0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -365,9 +363,9 @@ public class CellularSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(distanceFunction == DistanceFunction.Euclidean && returnType != ReturnType.CellValue) {
|
if(distanceFunction == DistanceFunction.Euclidean && returnType != ReturnType.CellValue) {
|
||||||
distance0 = fastSqrt(distance0);
|
distance0 = Math.sqrt(distance0);
|
||||||
if(returnType != ReturnType.CellValue) {
|
if(returnType != ReturnType.CellValue) {
|
||||||
distance1 = fastSqrt(distance1);
|
distance1 = Math.sqrt(distance1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -386,7 +384,7 @@ public class CellularSampler extends NoiseFunction {
|
|||||||
case Distance3Sub -> distance2 - distance0 - 1;
|
case Distance3Sub -> distance2 - distance0 - 1;
|
||||||
case Distance3Mul -> distance2 * distance0 - 1;
|
case Distance3Mul -> distance2 * distance0 - 1;
|
||||||
case Distance3Div -> distance0 / distance2 - 1;
|
case Distance3Div -> distance0 / distance2 - 1;
|
||||||
case Angle -> FastMath.atan2(y / frequency - centerY, x / frequency - centerX);
|
case Angle -> Math.atan2(y / frequency - centerY, x / frequency - centerX);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-2
@@ -7,6 +7,9 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.samplers.noise;
|
package com.dfsek.terra.addons.noise.samplers.noise;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sampler3D implementation that returns a constant.
|
* Sampler3D implementation that returns a constant.
|
||||||
*/
|
*/
|
||||||
@@ -18,12 +21,12 @@ public class ConstantSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y) {
|
public double getNoiseRaw(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return constant;
|
return constant;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return constant;
|
return constant;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-10
@@ -1,6 +1,9 @@
|
|||||||
package com.dfsek.terra.addons.noise.samplers.noise;
|
package com.dfsek.terra.addons.noise.samplers.noise;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class DistanceSampler extends NoiseFunction {
|
public class DistanceSampler extends NoiseFunction {
|
||||||
|
|
||||||
private final DistanceFunction distanceFunction;
|
private final DistanceFunction distanceFunction;
|
||||||
@@ -22,39 +25,39 @@ public class DistanceSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y) {
|
public double getNoiseRaw(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double dx = x - ox;
|
double dx = x - ox;
|
||||||
double dy = y - oz;
|
double dy = y - oz;
|
||||||
if (normalize && (fastAbs(dx) > radius || fastAbs(dy) > radius)) return 1;
|
if (normalize && (Math.abs(dx) > radius || Math.abs(dy) > radius)) return 1;
|
||||||
double dist = distance2d(distanceFunction, dx, dy);
|
double dist = distance2d(distanceFunction, dx, dy);
|
||||||
if (normalize) return fastMin(((2*dist)/distanceAtRadius)-1, 1);
|
if (normalize) return Math.min(((2*dist)/distanceAtRadius)-1, 1);
|
||||||
return dist;
|
return dist;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double dx = x - ox;
|
double dx = x - ox;
|
||||||
double dy = y - oy;
|
double dy = y - oy;
|
||||||
double dz = z - oz;
|
double dz = z - oz;
|
||||||
if(normalize && (fastAbs(dx) > radius || fastAbs(dy) > radius || fastAbs(dz) > radius)) return 1;
|
if(normalize && (Math.abs(dx) > radius || Math.abs(dy) > radius || Math.abs(dz) > radius)) return 1;
|
||||||
double dist = distance3d(distanceFunction, dx, dy, dz);
|
double dist = distance3d(distanceFunction, dx, dy, dz);
|
||||||
if (normalize) return fastMin(((2*dist)/distanceAtRadius)-1, 1);
|
if (normalize) return Math.min(((2*dist)/distanceAtRadius)-1, 1);
|
||||||
return dist;
|
return dist;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static double distance2d(DistanceFunction distanceFunction, double x, double z) {
|
private static double distance2d(DistanceFunction distanceFunction, double x, double z) {
|
||||||
return switch(distanceFunction) {
|
return switch(distanceFunction) {
|
||||||
case Euclidean -> fastSqrt(x*x + z*z);
|
case Euclidean -> Math.sqrt(x*x + z*z);
|
||||||
case EuclideanSq -> x*x + z*z;
|
case EuclideanSq -> x*x + z*z;
|
||||||
case Manhattan -> fastAbs(x) + fastAbs(z);
|
case Manhattan -> Math.abs(x) + Math.abs(z);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static double distance3d(DistanceFunction distanceFunction, double x, double y, double z) {
|
private static double distance3d(DistanceFunction distanceFunction, double x, double y, double z) {
|
||||||
return switch(distanceFunction) {
|
return switch(distanceFunction) {
|
||||||
case Euclidean -> fastSqrt(x*x + y*y + z*z);
|
case Euclidean -> Math.sqrt(x*x + y*y + z*z);
|
||||||
case EuclideanSq -> x*x + y*y + z*z;
|
case EuclideanSq -> x*x + y*y + z*z;
|
||||||
case Manhattan -> fastAbs(x) + fastAbs(y) + fastAbs(z);
|
case Manhattan -> Math.abs(x) + Math.abs(y) + Math.abs(z);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-2
@@ -13,6 +13,7 @@ import com.dfsek.paralithic.eval.parser.Scope;
|
|||||||
import com.dfsek.paralithic.eval.tokenizer.ParseException;
|
import com.dfsek.paralithic.eval.tokenizer.ParseException;
|
||||||
import com.dfsek.paralithic.functions.Function;
|
import com.dfsek.paralithic.functions.Function;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.noise.paralithic.noise.SeedContext;
|
import com.dfsek.terra.addons.noise.paralithic.noise.SeedContext;
|
||||||
@@ -41,12 +42,12 @@ public class ExpressionFunction extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y) {
|
public double getNoiseRaw(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return expression.evaluate(new SeedContext(seed), x, 0, y);
|
return expression.evaluate(new SeedContext(seed), x, 0, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return expression.evaluate(new SeedContext(seed), x, y, z);
|
return expression.evaluate(new SeedContext(seed), x, y, z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-12
@@ -7,9 +7,10 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.samplers.noise;
|
package com.dfsek.terra.addons.noise.samplers.noise;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.noise.samplers.noise.random.WhiteNoiseSampler;
|
import com.dfsek.terra.addons.noise.samplers.noise.random.WhiteNoiseSampler;
|
||||||
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class GaborNoiseSampler extends NoiseFunction {
|
public class GaborNoiseSampler extends NoiseFunction {
|
||||||
@@ -17,11 +18,11 @@ public class GaborNoiseSampler extends NoiseFunction {
|
|||||||
private double k = 1.0;
|
private double k = 1.0;
|
||||||
private double a = 0.1;
|
private double a = 0.1;
|
||||||
private double f0 = 0.625;
|
private double f0 = 0.625;
|
||||||
private double kernelRadius = (FastMath.sqrt(-FastMath.log(0.05) / Math.PI) / a);
|
private double kernelRadius = (Math.sqrt(-Math.log(0.05) / Math.PI) / a);
|
||||||
private double impulsesPerKernel = 64d;
|
private double impulsesPerKernel = 64d;
|
||||||
private double impulseDensity = (impulsesPerKernel / (Math.PI * kernelRadius * kernelRadius));
|
private double impulseDensity = (impulsesPerKernel / (Math.PI * kernelRadius * kernelRadius));
|
||||||
private double impulsesPerCell = impulseDensity * kernelRadius * kernelRadius;
|
private double impulsesPerCell = impulseDensity * kernelRadius * kernelRadius;
|
||||||
private double g = FastMath.exp(-impulsesPerCell);
|
private double g = Math.exp(-impulsesPerCell);
|
||||||
|
|
||||||
private double omega0 = Math.PI * 0.25;
|
private double omega0 = Math.PI * 0.25;
|
||||||
private boolean isotropic = true;
|
private boolean isotropic = true;
|
||||||
@@ -32,17 +33,17 @@ public class GaborNoiseSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void recalculateRadiusAndDensity() {
|
private void recalculateRadiusAndDensity() {
|
||||||
kernelRadius = (FastMath.sqrt(-FastMath.log(0.05) / Math.PI) / this.a);
|
kernelRadius = (Math.sqrt(-Math.log(0.05) / Math.PI) / this.a);
|
||||||
impulseDensity = (impulsesPerKernel / (Math.PI * kernelRadius * kernelRadius));
|
impulseDensity = (impulsesPerKernel / (Math.PI * kernelRadius * kernelRadius));
|
||||||
impulsesPerCell = impulseDensity * kernelRadius * kernelRadius;
|
impulsesPerCell = impulseDensity * kernelRadius * kernelRadius;
|
||||||
g = FastMath.exp(-impulsesPerCell);
|
g = Math.exp(-impulsesPerCell);
|
||||||
}
|
}
|
||||||
|
|
||||||
private double gaborNoise(long seed, double x, double y) {
|
private double gaborNoise(long seed, double x, double y) {
|
||||||
x /= kernelRadius;
|
x /= kernelRadius;
|
||||||
y /= kernelRadius;
|
y /= kernelRadius;
|
||||||
int xi = fastFloor(x);
|
int xi = (int) Math.floor(x);
|
||||||
int yi = fastFloor(y);
|
int yi = (int) Math.floor(y);
|
||||||
double xf = x - xi;
|
double xf = x - xi;
|
||||||
double yf = y - yi;
|
double yf = y - yi;
|
||||||
double noise = 0;
|
double noise = 0;
|
||||||
@@ -55,7 +56,7 @@ public class GaborNoiseSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private double calculateCell(long seed, int xi, int yi, double x, double y) {
|
private double calculateCell(long seed, int xi, int yi, double x, double y) {
|
||||||
long mashedSeed = murmur64(31L * xi + yi) + seed;
|
long mashedSeed = MathUtil.murmur64(31L * xi + yi) + seed;
|
||||||
|
|
||||||
double gaussianSource = (rand.getNoiseRaw(mashedSeed++) + 1) / 2;
|
double gaussianSource = (rand.getNoiseRaw(mashedSeed++) + 1) / 2;
|
||||||
int impulses = 0;
|
int impulses = 0;
|
||||||
@@ -73,7 +74,7 @@ public class GaborNoiseSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private double gabor(double omega_0, double x, double y) {
|
private double gabor(double omega_0, double x, double y) {
|
||||||
return k * (FastMath.exp(-Math.PI * (a * a) * (x * x + y * y)) * fastCos(2 * Math.PI * f0 * (x * fastCos(omega_0) + y * fastSin(
|
return k * (Math.exp(-Math.PI * (a * a) * (x * x + y * y)) * MathUtil.cos(2 * Math.PI * f0 * (x * MathUtil.cos(omega_0) + y * MathUtil.sin(
|
||||||
omega_0))));
|
omega_0))));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,12 +105,12 @@ public class GaborNoiseSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double z) {
|
public double getNoiseRaw(long seed, double x, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return gaborNoise(seed, x, z);
|
return gaborNoise(seed, x, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return gaborNoise(seed, x, z);
|
return gaborNoise(seed, x, z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+26
-92
@@ -7,25 +7,18 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.samplers.noise;
|
package com.dfsek.terra.addons.noise.samplers.noise;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("ManualMinMaxCalculation")
|
|
||||||
public abstract class NoiseFunction implements NoiseSampler {
|
public abstract class NoiseFunction implements NoiseSampler {
|
||||||
// Hashing
|
// Hashing
|
||||||
protected static final int PRIME_X = 501125321;
|
protected static final int PRIME_X = 501125321;
|
||||||
protected static final int PRIME_Y = 1136930381;
|
protected static final int PRIME_Y = 1136930381;
|
||||||
protected static final int PRIME_Z = 1720413743;
|
protected static final int PRIME_Z = 1720413743;
|
||||||
static final int precision = 100;
|
|
||||||
static final int modulus = 360 * precision;
|
|
||||||
static final double[] sin = new double[360 * 100]; // lookup table
|
|
||||||
static {
|
|
||||||
for(int i = 0; i < sin.length; i++) {
|
|
||||||
sin[i] = (float) Math.sin((double) (i) / (precision));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
protected double frequency = 0.02d;
|
protected double frequency = 0.02d;
|
||||||
protected long salt;
|
protected long salt;
|
||||||
|
|
||||||
@@ -33,10 +26,6 @@ public abstract class NoiseFunction implements NoiseSampler {
|
|||||||
this.salt = 0;
|
this.salt = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static int fastFloor(double f) {
|
|
||||||
return f >= 0 ? (int) f : (int) f - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static int hash(int seed, int xPrimed, int yPrimed, int zPrimed) {
|
protected static int hash(int seed, int xPrimed, int yPrimed, int zPrimed) {
|
||||||
int hash = seed ^ xPrimed ^ yPrimed ^ zPrimed;
|
int hash = seed ^ xPrimed ^ yPrimed ^ zPrimed;
|
||||||
|
|
||||||
@@ -51,77 +40,6 @@ public abstract class NoiseFunction implements NoiseSampler {
|
|||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static int fastRound(double f) {
|
|
||||||
return f >= 0 ? (int) (f + 0.5f) : (int) (f - 0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static double lerp(double a, double b, double t) {
|
|
||||||
return a + t * (b - a);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static double interpHermite(double t) {
|
|
||||||
return t * t * (3 - 2 * t);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static double interpQuintic(double t) {
|
|
||||||
return t * t * t * (t * (t * 6 - 15) + 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static double cubicLerp(double a, double b, double c, double d, double t) {
|
|
||||||
double p = (d - c) - (a - b);
|
|
||||||
return t * t * t * p + t * t * ((a - b) - p) + t * (c - a) + b;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static double fastMin(double a, double b) {
|
|
||||||
return a < b ? a : b;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static double fastMax(double a, double b) {
|
|
||||||
return a > b ? a : b;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static double fastAbs(double f) {
|
|
||||||
return f < 0 ? -f : f;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static double fastSqrt(double f) {
|
|
||||||
return FastMath.sqrt(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static int fastCeil(double f) {
|
|
||||||
int i = (int) f;
|
|
||||||
if(i < f) i++;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Murmur64 hashing function
|
|
||||||
*
|
|
||||||
* @param h Input value
|
|
||||||
*
|
|
||||||
* @return Hashed value
|
|
||||||
*/
|
|
||||||
protected static long murmur64(long h) {
|
|
||||||
h ^= h >>> 33;
|
|
||||||
h *= 0xff51afd7ed558ccdL;
|
|
||||||
h ^= h >>> 33;
|
|
||||||
h *= 0xc4ceb9fe1a85ec53L;
|
|
||||||
h ^= h >>> 33;
|
|
||||||
return h;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static double fastSin(double a) {
|
|
||||||
return sinLookup((int) (a * precision + 0.5f));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static double fastCos(double a) {
|
|
||||||
return sinLookup((int) ((a + Math.PI / 2) * precision + 0.5f));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static double sinLookup(int a) {
|
|
||||||
return a >= 0 ? sin[a % (modulus)] : -sin[-a % (modulus)];
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSalt(long salt) {
|
public void setSalt(long salt) {
|
||||||
this.salt = salt;
|
this.salt = salt;
|
||||||
}
|
}
|
||||||
@@ -135,16 +53,32 @@ public abstract class NoiseFunction implements NoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return getNoiseRaw(seed + salt, x * frequency, y * frequency);
|
return getNoiseRaw(seed + salt, x * frequency, y * frequency, context, contextLayer, contextRadius);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return getNoiseRaw(seed + salt, x * frequency, y * frequency, z * frequency);
|
return getNoiseRaw(seed + salt, x * frequency, y * frequency, z * frequency, context, contextLayer, contextRadius);
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract double getNoiseRaw(long seed, double x, double y);
|
public double getNoiseRaw(long seed, double x, double y) {
|
||||||
|
int contextRadius = getContextRadius();
|
||||||
|
|
||||||
public abstract double getNoiseRaw(long seed, double x, double y, double z);
|
ArrayList<double[]> list = new ArrayList<>();
|
||||||
|
generateContext(seed, x, y, list, 0, contextRadius);
|
||||||
|
return getNoiseRaw(seed, x, y, list, 0, getContextRadius());
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getNoiseRaw(long seed, double x, double y, double z) {
|
||||||
|
int contextRadius = getContextRadius();
|
||||||
|
|
||||||
|
ArrayList<double[]> list = new ArrayList<>();
|
||||||
|
generateContext(seed, x, y, z, list, 0, contextRadius);
|
||||||
|
return getNoiseRaw(seed, x, y, z, list, 0, getContextRadius());
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract double getNoiseRaw(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius);
|
||||||
|
|
||||||
|
public abstract double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius);
|
||||||
}
|
}
|
||||||
|
|||||||
+115
-58
@@ -8,17 +8,16 @@
|
|||||||
package com.dfsek.terra.addons.noise.samplers.noise;
|
package com.dfsek.terra.addons.noise.samplers.noise;
|
||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
import com.google.errorprone.annotations.InlineMe;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.PRIME_X;
|
import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.PRIME_X;
|
||||||
import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.PRIME_Y;
|
import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.PRIME_Y;
|
||||||
import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.fastAbs;
|
|
||||||
import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.fastFloor;
|
|
||||||
import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.fastMin;
|
|
||||||
import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.fastRound;
|
|
||||||
import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.fastSqrt;
|
|
||||||
import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.hash;
|
import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.hash;
|
||||||
import static net.jafama.FastMath.pow2;
|
|
||||||
import static net.jafama.FastMath.round;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pseudo-erosion algorithm based on <a href="https://www.reddit.com/r/proceduralgeneration/comments/797fgw/iterative_pseudoerosion/">a reddit post</a>
|
* Pseudo-erosion algorithm based on <a href="https://www.reddit.com/r/proceduralgeneration/comments/797fgw/iterative_pseudoerosion/">a reddit post</a>
|
||||||
@@ -31,7 +30,7 @@ import static net.jafama.FastMath.round;
|
|||||||
* The algorithm iterates through the cells near the sample point, calculates the distance between the position and the line segment
|
* The algorithm iterates through the cells near the sample point, calculates the distance between the position and the line segment
|
||||||
* between the cell and its connected cell, and returns the minimum of these distances.
|
* between the cell and its connected cell, and returns the minimum of these distances.
|
||||||
*/
|
*/
|
||||||
public class PseudoErosionSampler implements NoiseSampler {
|
public class PseudoErosionSampler extends NoiseFunction {
|
||||||
private static final double[] RAND_VECS_3D = {
|
private static final double[] RAND_VECS_3D = {
|
||||||
-0.7292736885d, -0.6618439697d, 0.1735581948d, 0, 0.790292081d, -0.5480887466d, -0.2739291014d, 0, 0.7217578935d, 0.6226212466d,
|
-0.7292736885d, -0.6618439697d, 0.1735581948d, 0, 0.790292081d, -0.5480887466d, -0.2739291014d, 0, 0.7217578935d, 0.6226212466d,
|
||||||
-0.3023380997d, 0, 0.565683137d, -0.8208298145d, -0.0790000257d, 0, 0.760049034d, -0.5555979497d, -0.3370999617d, 0,
|
-0.3023380997d, 0, 0.565683137d, -0.8208298145d, -0.0790000257d, 0, 0.760049034d, -0.5555979497d, -0.3370999617d, 0,
|
||||||
@@ -220,6 +219,8 @@ public class PseudoErosionSampler implements NoiseSampler {
|
|||||||
|
|
||||||
private final double frequency;
|
private final double frequency;
|
||||||
|
|
||||||
|
private final double inverseFrequency;
|
||||||
|
|
||||||
private final double cellularJitter;
|
private final double cellularJitter;
|
||||||
|
|
||||||
private final NoiseSampler lookup;
|
private final NoiseSampler lookup;
|
||||||
@@ -227,77 +228,112 @@ public class PseudoErosionSampler implements NoiseSampler {
|
|||||||
public PseudoErosionSampler(long salt, double frequency, NoiseSampler lookup, double jitterModifier) {
|
public PseudoErosionSampler(long salt, double frequency, NoiseSampler lookup, double jitterModifier) {
|
||||||
this.salt = salt;
|
this.salt = salt;
|
||||||
this.frequency = frequency;
|
this.frequency = frequency;
|
||||||
|
this.inverseFrequency = 1 / frequency;
|
||||||
this.lookup = lookup;
|
this.lookup = lookup;
|
||||||
this.cellularJitter = 0.43701595 * jitterModifier;
|
this.cellularJitter = 0.43701595 * jitterModifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getNoiseRaw(long sl, double x, double y) {
|
|
||||||
|
public void generateContextRaw(long sl, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
double finalDistance = Double.MAX_VALUE;
|
|
||||||
|
|
||||||
// Round sampled position to integers to derive grid coordinates
|
// Round sampled position to integers to derive grid coordinates
|
||||||
int gridX = fastRound(x);
|
int gridX = (int) Math.round(x);
|
||||||
int gridY = fastRound(y);
|
int gridY = (int) Math.round(y);
|
||||||
|
|
||||||
|
int nextContextLayer = contextLayer + 1;
|
||||||
|
int nextContextRadius = contextRadius + getContextRadius();
|
||||||
|
|
||||||
|
context.add(contextLayer, new double[0]);
|
||||||
|
this.lookup.generateContext(seed, x, y, context, nextContextLayer, nextContextRadius);
|
||||||
|
|
||||||
|
int contextCircumference = (contextRadius * 2 + 1);
|
||||||
|
int contextSizeArraySize = contextCircumference * contextCircumference * 3;
|
||||||
// Precompute cell positions and lookup values
|
// Precompute cell positions and lookup values
|
||||||
double[][][] cellData = new double[PRECOMPUTE_SIZE][PRECOMPUTE_SIZE][3];
|
double[] cellData = new double[contextSizeArraySize];
|
||||||
for(int xi = -PRECOMPUTE_RADIUS; xi <= PRECOMPUTE_RADIUS; xi++) {
|
int cellDataIndex = 0;
|
||||||
for(int yi = -PRECOMPUTE_RADIUS; yi <= PRECOMPUTE_RADIUS; yi++) {
|
for(int xi = -contextRadius; xi <= contextRadius; xi++) {
|
||||||
int jitterIdx = jitterIdx2D(seed, gridX + xi, gridY + yi);
|
int gridXi = gridX + xi;
|
||||||
double jitterX = RAND_VECS_2D[jitterIdx] * cellularJitter;
|
int gridXiPrimed = gridXi * PRIME_X;
|
||||||
double jitterY = RAND_VECS_2D[jitterIdx | 1] * cellularJitter;
|
|
||||||
double cellX = gridX + xi + jitterX;
|
for(int yi = -contextRadius; yi <= contextRadius; yi++) {
|
||||||
double cellY = gridY + yi + jitterY;
|
int gridYi = gridY + yi;
|
||||||
|
|
||||||
|
int jitterIdx = hash(seed, gridXiPrimed, gridYi * PRIME_Y) & (255 << 1);
|
||||||
|
double cellX = MathUtil.fma(RAND_VECS_2D[jitterIdx], cellularJitter, gridXi);
|
||||||
|
double cellY = MathUtil.fma(RAND_VECS_2D[jitterIdx | 1], cellularJitter, gridYi);
|
||||||
|
|
||||||
// Transform to actual coordinates for lookup
|
// Transform to actual coordinates for lookup
|
||||||
double actualCellX = cellX / frequency;
|
double actualCellX = cellX * inverseFrequency;
|
||||||
double actualCellY = cellY / frequency;
|
double actualCellY = cellY * inverseFrequency;
|
||||||
|
|
||||||
double lookup = this.lookup.noise(seed, actualCellX, actualCellY);
|
double lookup = this.lookup.noise(seed, actualCellX, actualCellY, context, nextContextLayer, nextContextRadius);
|
||||||
|
|
||||||
double[] data = cellData[xi+PRECOMPUTE_RADIUS][yi+PRECOMPUTE_RADIUS];
|
cellData[cellDataIndex++] = cellX;
|
||||||
data[0] = cellX;
|
cellData[cellDataIndex++] = cellY;
|
||||||
data[1] = cellY;
|
cellData[cellDataIndex++] = lookup;
|
||||||
data[2] = lookup;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context.add(contextLayer, cellData);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getNoiseRaw(long sl, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
|
double finalDistance = Double.MAX_VALUE;
|
||||||
|
|
||||||
|
double[] cellData = context.get(contextLayer);
|
||||||
|
|
||||||
|
int xIndexSize = (contextRadius * 6) + 3;
|
||||||
|
|
||||||
|
int deltaRadius = (contextRadius - NEARBY_CELLS_RADIUS);
|
||||||
|
|
||||||
|
int xIndex = xIndexSize * deltaRadius;
|
||||||
|
int yIndex = 3 * deltaRadius;
|
||||||
|
|
||||||
// Iterate over nearby cells
|
// Iterate over nearby cells
|
||||||
|
int cellDataIndex = xIndex;
|
||||||
|
//int cellDataIndex = 21;
|
||||||
for(int xi = -NEARBY_CELLS_RADIUS; xi <= NEARBY_CELLS_RADIUS; xi++) {
|
for(int xi = -NEARBY_CELLS_RADIUS; xi <= NEARBY_CELLS_RADIUS; xi++) {
|
||||||
|
cellDataIndex += yIndex;
|
||||||
|
//cellDataIndex += 3;
|
||||||
for(int yi = -NEARBY_CELLS_RADIUS; yi <= NEARBY_CELLS_RADIUS; yi++) {
|
for(int yi = -NEARBY_CELLS_RADIUS; yi <= NEARBY_CELLS_RADIUS; yi++) {
|
||||||
|
|
||||||
// Find cell position with the lowest lookup value within moore neighborhood of neighbor
|
// Find cell position with the lowest lookup value within moore neighborhood of neighbor
|
||||||
double lowestLookup = Double.MAX_VALUE;
|
double lowestLookup = Double.MAX_VALUE;
|
||||||
double connectedCellX = 0;
|
double connectedCellX = 0;
|
||||||
double connectedCellY = 0;
|
double connectedCellY = 0;
|
||||||
|
//int cellDataIndexN = cellDataIndex - xIndex - 1;
|
||||||
|
int cellDataIndexN = cellDataIndex - 22;
|
||||||
|
int yniMin = yi - MAX_CONNECTION_RADIUS;
|
||||||
|
int yniMax = yi + MAX_CONNECTION_RADIUS;
|
||||||
|
|
||||||
for(int xni = xi - MAX_CONNECTION_RADIUS; xni <= xi + MAX_CONNECTION_RADIUS; xni++) {
|
for(int xni = xi - MAX_CONNECTION_RADIUS; xni <= xi + MAX_CONNECTION_RADIUS; xni++) {
|
||||||
for(int yni = yi - MAX_CONNECTION_RADIUS; yni <= yi + MAX_CONNECTION_RADIUS; yni++) {
|
for(int yni = yniMin; yni <= yniMax; yni++) {
|
||||||
double[] data = cellData[xni+PRECOMPUTE_RADIUS][yni+PRECOMPUTE_RADIUS];
|
double lookup = cellData[cellDataIndexN];
|
||||||
double lookup = data[2];
|
|
||||||
if(lookup < lowestLookup) {
|
if(lookup < lowestLookup) {
|
||||||
lowestLookup = lookup;
|
lowestLookup = lookup;
|
||||||
connectedCellX = data[0];
|
connectedCellX = cellData[cellDataIndexN - 2];
|
||||||
connectedCellY = data[1];
|
connectedCellY = cellData[cellDataIndexN - 1];
|
||||||
}
|
}
|
||||||
|
cellDataIndexN += 3;
|
||||||
}
|
}
|
||||||
|
cellDataIndexN += 12;
|
||||||
}
|
}
|
||||||
|
|
||||||
double[] data = cellData[xi+PRECOMPUTE_RADIUS][yi+PRECOMPUTE_RADIUS];
|
double cellX = cellData[cellDataIndex];
|
||||||
double cellX = data[0];
|
double cellY = cellData[cellDataIndex + 1];
|
||||||
double cellY = data[1];
|
|
||||||
|
|
||||||
// Calculate SDF for line between the current cell position and the surrounding cell with the lowest lookup
|
// Calculate SDF for line between the current cell position and the surrounding cell with the lowest lookup
|
||||||
double distance = lineSdf2D(x, y, cellX, cellY, connectedCellX, connectedCellY);
|
double distance = lineSdf2D(x, y, cellX, cellY, connectedCellX, connectedCellY);
|
||||||
|
|
||||||
// Set final return to the lowest computed distance
|
// Set final return to the lowest computed distance
|
||||||
finalDistance = fastMin(finalDistance, distance);
|
finalDistance = Math.min(finalDistance, distance);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shows grid
|
cellDataIndex += 3;
|
||||||
// if(fastAbs(x-round(x)) > 0.5d - 0.01d || fastAbs(y-round(y)) > 0.5d - 0.01d) {
|
}
|
||||||
// return 0;
|
cellDataIndex += yIndex;
|
||||||
// }
|
//cellDataIndex += 3;
|
||||||
|
}
|
||||||
|
|
||||||
return finalDistance;
|
return finalDistance;
|
||||||
}
|
}
|
||||||
@@ -309,39 +345,60 @@ public class PseudoErosionSampler implements NoiseSampler {
|
|||||||
double x1dx = x - x1;
|
double x1dx = x - x1;
|
||||||
double y1dx = y - y1;
|
double y1dx = y - y1;
|
||||||
|
|
||||||
if(x1 == x2 && y1 == y2) // If positions are the same just return distance from point
|
if (x1 == x2 && y1 == y2) {
|
||||||
return fastSqrt(pow2(x1dx) + pow2(y1dx));
|
// If positions are the same, just return the distance from the point
|
||||||
|
return MathUtil.hypot(x1dx, y1dx);
|
||||||
|
}
|
||||||
|
|
||||||
double ldx = x1 - x2;
|
double ldx = x1 - x2;
|
||||||
double ldy = y1 - y2;
|
double ldy = y1 - y2;
|
||||||
|
|
||||||
|
double invLineLengthSquared = Math.pow((Math.pow(ldx, 2) + Math.pow(ldy, 2)), -1);
|
||||||
|
|
||||||
double x2dx = x - x2;
|
double x2dx = x - x2;
|
||||||
double y2dx = y - y2;
|
double y2dx = y - y2;
|
||||||
double lt = (ldy * y1dx + ldx * x1dx) / (pow2(ldy) + pow2(ldx)); // Position along line
|
|
||||||
if(lt > 0) {
|
double dotProduct = MathUtil.fma(ldy, y1dx, (ldx * x1dx));
|
||||||
return fastSqrt(pow2(x1dx) + pow2(y1dx)); // Distance between point 1 and position
|
double lt = dotProduct * invLineLengthSquared; // Position along the line
|
||||||
} else if(lt < -1) {
|
|
||||||
return fastSqrt(pow2(x2dx) + pow2(y2dx)); // Distance between point 2 and position
|
if (lt > 0) {
|
||||||
|
return MathUtil.hypot(x1dx, y1dx); // Distance between point 1 and position
|
||||||
|
} else if (lt < -1) {
|
||||||
|
return MathUtil.hypot(x2dx, y2dx); // Distance between point 2 and position
|
||||||
} else {
|
} else {
|
||||||
return fastAbs((ldy * x1dx - ldx * y1dx) / fastSqrt(pow2(ldx) + pow2(ldy))); // Distance from line
|
double distance = MathUtil.fma(ldy, x1dx, (-(ldx * y1dx))) * Math.sqrt(invLineLengthSquared);
|
||||||
|
return Math.abs(distance); // Distance from the line
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int jitterIdx2D(int seed, int x, int y) {
|
|
||||||
return hash(seed, x * PRIME_X, y * PRIME_Y) & (255 << 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getNoiseRaw(long sl, double x, double y, double z) {
|
public double getNoiseRaw(long sl, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
// TODO
|
// TODO
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return getNoiseRaw(seed + salt, x * frequency, y * frequency);
|
return getNoiseRaw(seed + salt, x * frequency, y * frequency, context, contextLayer, contextRadius);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return getNoiseRaw(seed + salt, x * frequency, y * frequency, z * frequency);
|
return getNoiseRaw(seed + salt, x * frequency, y * frequency, z * frequency, context, contextLayer, contextRadius);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void generateContext(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
|
generateContextRaw(seed + salt, x * frequency, y * frequency, context, contextLayer, contextRadius);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void generateContext(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
|
//no-op
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getContextRadius() {
|
||||||
|
return PRECOMPUTE_RADIUS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-4
@@ -8,6 +8,9 @@
|
|||||||
package com.dfsek.terra.addons.noise.samplers.noise.fractal;
|
package com.dfsek.terra.addons.noise.samplers.noise.fractal;
|
||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class BrownianMotionSampler extends FractalNoiseFunction {
|
public class BrownianMotionSampler extends FractalNoiseFunction {
|
||||||
@@ -16,14 +19,14 @@ public class BrownianMotionSampler extends FractalNoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y) {
|
public double getNoiseRaw(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double sum = 0;
|
double sum = 0;
|
||||||
double amp = fractalBounding;
|
double amp = fractalBounding;
|
||||||
|
|
||||||
for(int i = 0; i < octaves; i++) {
|
for(int i = 0; i < octaves; i++) {
|
||||||
double noise = input.noise(seed++, x, y);
|
double noise = input.noise(seed++, x, y);
|
||||||
sum += noise * amp;
|
sum += noise * amp;
|
||||||
amp *= lerp(1.0, fastMin(noise + 1, 2) * 0.5, weightedStrength);
|
amp *= MathUtil.lerp(1.0, Math.min(noise + 1, 2) * 0.5, weightedStrength);
|
||||||
|
|
||||||
x *= lacunarity;
|
x *= lacunarity;
|
||||||
y *= lacunarity;
|
y *= lacunarity;
|
||||||
@@ -34,14 +37,14 @@ public class BrownianMotionSampler extends FractalNoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double sum = 0;
|
double sum = 0;
|
||||||
double amp = fractalBounding;
|
double amp = fractalBounding;
|
||||||
|
|
||||||
for(int i = 0; i < octaves; i++) {
|
for(int i = 0; i < octaves; i++) {
|
||||||
double noise = input.noise(seed++, x, y, z);
|
double noise = input.noise(seed++, x, y, z);
|
||||||
sum += noise * amp;
|
sum += noise * amp;
|
||||||
amp *= lerp(1.0, (noise + 1) * 0.5, weightedStrength);
|
amp *= MathUtil.lerp(1.0, (noise + 1) * 0.5, weightedStrength);
|
||||||
|
|
||||||
x *= lacunarity;
|
x *= lacunarity;
|
||||||
y *= lacunarity;
|
y *= lacunarity;
|
||||||
|
|||||||
+1
-1
@@ -25,7 +25,7 @@ public abstract class FractalNoiseFunction extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void calculateFractalBounding() {
|
protected void calculateFractalBounding() {
|
||||||
double gain = fastAbs(this.gain);
|
double gain = Math.abs(this.gain);
|
||||||
double amp = gain;
|
double amp = gain;
|
||||||
double ampFractal = 1.0;
|
double ampFractal = 1.0;
|
||||||
for(int i = 1; i < octaves; i++) {
|
for(int i = 1; i < octaves; i++) {
|
||||||
|
|||||||
+7
-4
@@ -8,6 +8,9 @@
|
|||||||
package com.dfsek.terra.addons.noise.samplers.noise.fractal;
|
package com.dfsek.terra.addons.noise.samplers.noise.fractal;
|
||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class PingPongSampler extends FractalNoiseFunction {
|
public class PingPongSampler extends FractalNoiseFunction {
|
||||||
@@ -28,14 +31,14 @@ public class PingPongSampler extends FractalNoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y) {
|
public double getNoiseRaw(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double sum = 0;
|
double sum = 0;
|
||||||
double amp = fractalBounding;
|
double amp = fractalBounding;
|
||||||
|
|
||||||
for(int i = 0; i < octaves; i++) {
|
for(int i = 0; i < octaves; i++) {
|
||||||
double noise = pingPong((input.noise(seed++, x, y) + 1) * pingPongStrength);
|
double noise = pingPong((input.noise(seed++, x, y) + 1) * pingPongStrength);
|
||||||
sum += (noise - 0.5) * 2 * amp;
|
sum += (noise - 0.5) * 2 * amp;
|
||||||
amp *= lerp(1.0, noise, weightedStrength);
|
amp *= MathUtil.lerp(1.0, noise, weightedStrength);
|
||||||
|
|
||||||
x *= lacunarity;
|
x *= lacunarity;
|
||||||
y *= lacunarity;
|
y *= lacunarity;
|
||||||
@@ -46,14 +49,14 @@ public class PingPongSampler extends FractalNoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double sum = 0;
|
double sum = 0;
|
||||||
double amp = fractalBounding;
|
double amp = fractalBounding;
|
||||||
|
|
||||||
for(int i = 0; i < octaves; i++) {
|
for(int i = 0; i < octaves; i++) {
|
||||||
double noise = pingPong((input.noise(seed++, x, y, z) + 1) * pingPongStrength);
|
double noise = pingPong((input.noise(seed++, x, y, z) + 1) * pingPongStrength);
|
||||||
sum += (noise - 0.5) * 2 * amp;
|
sum += (noise - 0.5) * 2 * amp;
|
||||||
amp *= lerp(1.0, noise, weightedStrength);
|
amp *= MathUtil.lerp(1.0, noise, weightedStrength);
|
||||||
|
|
||||||
x *= lacunarity;
|
x *= lacunarity;
|
||||||
y *= lacunarity;
|
y *= lacunarity;
|
||||||
|
|||||||
+9
-6
@@ -8,6 +8,9 @@
|
|||||||
package com.dfsek.terra.addons.noise.samplers.noise.fractal;
|
package com.dfsek.terra.addons.noise.samplers.noise.fractal;
|
||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class RidgedFractalSampler extends FractalNoiseFunction {
|
public class RidgedFractalSampler extends FractalNoiseFunction {
|
||||||
@@ -17,14 +20,14 @@ public class RidgedFractalSampler extends FractalNoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y) {
|
public double getNoiseRaw(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double sum = 0;
|
double sum = 0;
|
||||||
double amp = fractalBounding;
|
double amp = fractalBounding;
|
||||||
|
|
||||||
for(int i = 0; i < octaves; i++) {
|
for(int i = 0; i < octaves; i++) {
|
||||||
double noise = fastAbs(input.noise(seed++, x, y));
|
double noise = Math.abs(input.noise(seed++, x, y));
|
||||||
sum += (noise * -2 + 1) * amp;
|
sum += (noise * -2 + 1) * amp;
|
||||||
amp *= lerp(1.0, 1 - noise, weightedStrength);
|
amp *= MathUtil.lerp(1.0, 1 - noise, weightedStrength);
|
||||||
|
|
||||||
x *= lacunarity;
|
x *= lacunarity;
|
||||||
y *= lacunarity;
|
y *= lacunarity;
|
||||||
@@ -35,14 +38,14 @@ public class RidgedFractalSampler extends FractalNoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double sum = 0;
|
double sum = 0;
|
||||||
double amp = fractalBounding;
|
double amp = fractalBounding;
|
||||||
|
|
||||||
for(int i = 0; i < octaves; i++) {
|
for(int i = 0; i < octaves; i++) {
|
||||||
double noise = fastAbs(input.noise(seed++, x, y, z));
|
double noise = Math.abs(input.noise(seed++, x, y, z));
|
||||||
sum += (noise * -2 + 1) * amp;
|
sum += (noise * -2 + 1) * amp;
|
||||||
amp *= lerp(1.0, 1 - noise, weightedStrength);
|
amp *= MathUtil.lerp(1.0, 1 - noise, weightedStrength);
|
||||||
|
|
||||||
x *= lacunarity;
|
x *= lacunarity;
|
||||||
y *= lacunarity;
|
y *= lacunarity;
|
||||||
|
|||||||
+4
-2
@@ -9,6 +9,8 @@ package com.dfsek.terra.addons.noise.samplers.noise.random;
|
|||||||
|
|
||||||
import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction;
|
import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NoiseSampler implementation to provide random, normally distributed (Gaussian) noise.
|
* NoiseSampler implementation to provide random, normally distributed (Gaussian) noise.
|
||||||
@@ -21,7 +23,7 @@ public class GaussianNoiseSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y) {
|
public double getNoiseRaw(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double v1, v2, s;
|
double v1, v2, s;
|
||||||
do {
|
do {
|
||||||
v1 = whiteNoiseSampler.noise(seed++, x, y);
|
v1 = whiteNoiseSampler.noise(seed++, x, y);
|
||||||
@@ -33,7 +35,7 @@ public class GaussianNoiseSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double v1, v2, s;
|
double v1, v2, s;
|
||||||
do {
|
do {
|
||||||
v1 = whiteNoiseSampler.noise(seed++, x, y, z);
|
v1 = whiteNoiseSampler.noise(seed++, x, y, z);
|
||||||
|
|||||||
+4
-1
@@ -7,6 +7,9 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.samplers.noise.random;
|
package com.dfsek.terra.addons.noise.samplers.noise.random;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NoiseSampler implementation to produce random, uniformly distributed (white) noise.
|
* NoiseSampler implementation to produce random, uniformly distributed (white) noise.
|
||||||
*/
|
*/
|
||||||
@@ -15,7 +18,7 @@ public class PositiveWhiteNoiseSampler extends WhiteNoiseSampler {
|
|||||||
// Bits that when applied to the exponent/sign section of a double, produce a positive number with a power of 1.
|
// Bits that when applied to the exponent/sign section of a double, produce a positive number with a power of 1.
|
||||||
|
|
||||||
public double getNoiseRaw(long seed) {
|
public double getNoiseRaw(long seed) {
|
||||||
return (Double.longBitsToDouble((murmur64(seed) & 0x000fffffffffffffL) | POSITIVE_POW1) - 1.5) * 2;
|
return (Double.longBitsToDouble((MathUtil.murmur64(seed) & 0x000fffffffffffffL) | POSITIVE_POW1) - 1.5) * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+8
-5
@@ -8,6 +8,9 @@
|
|||||||
package com.dfsek.terra.addons.noise.samplers.noise.random;
|
package com.dfsek.terra.addons.noise.samplers.noise.random;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction;
|
import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction;
|
||||||
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -24,27 +27,27 @@ public class WhiteNoiseSampler extends NoiseFunction {
|
|||||||
long hashX = Double.doubleToRawLongBits(x) ^ seed;
|
long hashX = Double.doubleToRawLongBits(x) ^ seed;
|
||||||
long hashZ = Double.doubleToRawLongBits(y) ^ seed;
|
long hashZ = Double.doubleToRawLongBits(y) ^ seed;
|
||||||
long hash = (((hashX ^ (hashX >>> 32)) + ((hashZ ^ (hashZ >>> 32)) << 32)) ^ seed) + Double.doubleToRawLongBits(z);
|
long hash = (((hashX ^ (hashX >>> 32)) + ((hashZ ^ (hashZ >>> 32)) << 32)) ^ seed) + Double.doubleToRawLongBits(z);
|
||||||
return murmur64(hash);
|
return MathUtil.murmur64(hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
public long randomBits(long seed, double x, double y) {
|
public long randomBits(long seed, double x, double y) {
|
||||||
long hashX = Double.doubleToRawLongBits(x) ^ seed;
|
long hashX = Double.doubleToRawLongBits(x) ^ seed;
|
||||||
long hashZ = Double.doubleToRawLongBits(y) ^ seed;
|
long hashZ = Double.doubleToRawLongBits(y) ^ seed;
|
||||||
long hash = ((hashX ^ (hashX >>> 32)) + ((hashZ ^ (hashZ >>> 32)) << 32)) ^ seed;
|
long hash = ((hashX ^ (hashX >>> 32)) + ((hashZ ^ (hashZ >>> 32)) << 32)) ^ seed;
|
||||||
return murmur64(hash);
|
return MathUtil.murmur64(hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getNoiseRaw(long seed) {
|
public double getNoiseRaw(long seed) {
|
||||||
return (Double.longBitsToDouble((murmur64(seed) & 0x000fffffffffffffL) | POSITIVE_POW1) - 1.5) * 2;
|
return (Double.longBitsToDouble((MathUtil.murmur64(seed) & 0x000fffffffffffffL) | POSITIVE_POW1) - 1.5) * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y) {
|
public double getNoiseRaw(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return (getNoiseUnmapped(seed, x, y) - 1.5) * 2;
|
return (getNoiseUnmapped(seed, x, y) - 1.5) * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return (getNoiseUnmapped(seed, x, y, z) - 1.5) * 2;
|
return (getNoiseUnmapped(seed, x, y, z) - 1.5) * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+10
-7
@@ -7,13 +7,16 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.samplers.noise.simplex;
|
package com.dfsek.terra.addons.noise.samplers.noise.simplex;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NoiseSampler implementation to provide OpenSimplex2 (Smooth Variant) noise.
|
* NoiseSampler implementation to provide OpenSimplex2 (Smooth Variant) noise.
|
||||||
*/
|
*/
|
||||||
public class OpenSimplex2SSampler extends SimplexStyleSampler {
|
public class OpenSimplex2SSampler extends SimplexStyleSampler {
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("NumericOverflow")
|
@SuppressWarnings("NumericOverflow")
|
||||||
public double getNoiseRaw(long sl, double x, double y) {
|
public double getNoiseRaw(long sl, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
// 2D OpenSimplex2S case is a modified 2D simplex noise.
|
// 2D OpenSimplex2S case is a modified 2D simplex noise.
|
||||||
|
|
||||||
@@ -26,8 +29,8 @@ public class OpenSimplex2SSampler extends SimplexStyleSampler {
|
|||||||
y += s;
|
y += s;
|
||||||
|
|
||||||
|
|
||||||
int i = fastFloor(x);
|
int i = (int) Math.floor(x);
|
||||||
int j = fastFloor(y);
|
int j = (int) Math.floor(y);
|
||||||
double xi = x - i;
|
double xi = x - i;
|
||||||
double yi = y - j;
|
double yi = y - j;
|
||||||
|
|
||||||
@@ -121,7 +124,7 @@ public class OpenSimplex2SSampler extends SimplexStyleSampler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("NumericOverflow")
|
@SuppressWarnings("NumericOverflow")
|
||||||
public double getNoiseRaw(long sl, double x, double y, double z) {
|
public double getNoiseRaw(long sl, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
// 3D OpenSimplex2S case uses two offset rotated cube grids.
|
// 3D OpenSimplex2S case uses two offset rotated cube grids.
|
||||||
final double R3 = (2.0 / 3.0);
|
final double R3 = (2.0 / 3.0);
|
||||||
@@ -131,9 +134,9 @@ public class OpenSimplex2SSampler extends SimplexStyleSampler {
|
|||||||
z = r - z;
|
z = r - z;
|
||||||
|
|
||||||
|
|
||||||
int i = fastFloor(x);
|
int i = (int) Math.floor(x);
|
||||||
int j = fastFloor(y);
|
int j = (int) Math.floor(y);
|
||||||
int k = fastFloor(z);
|
int k = (int) Math.floor(z);
|
||||||
double xi = x - i;
|
double xi = x - i;
|
||||||
double yi = y - j;
|
double yi = y - j;
|
||||||
double zi = z - k;
|
double zi = z - k;
|
||||||
|
|||||||
+10
-7
@@ -7,6 +7,9 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.samplers.noise.simplex;
|
package com.dfsek.terra.addons.noise.samplers.noise.simplex;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NoiseSampler implementation to provide OpenSimplex2 noise.
|
* NoiseSampler implementation to provide OpenSimplex2 noise.
|
||||||
*/
|
*/
|
||||||
@@ -14,7 +17,7 @@ public class OpenSimplex2Sampler extends SimplexStyleSampler {
|
|||||||
private static final double SQRT3 = 1.7320508075688772935274463415059;
|
private static final double SQRT3 = 1.7320508075688772935274463415059;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y) {
|
public double getNoiseRaw(long sl, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
// 2D OpenSimplex2 case uses the same algorithm as ordinary Simplex.
|
// 2D OpenSimplex2 case uses the same algorithm as ordinary Simplex.
|
||||||
final double G2 = (3 - SQRT3) / 6;
|
final double G2 = (3 - SQRT3) / 6;
|
||||||
@@ -25,8 +28,8 @@ public class OpenSimplex2Sampler extends SimplexStyleSampler {
|
|||||||
y += s;
|
y += s;
|
||||||
|
|
||||||
|
|
||||||
int i = fastFloor(x);
|
int i = (int) Math.floor(x);
|
||||||
int j = fastFloor(y);
|
int j = (int) Math.floor(y);
|
||||||
double xi = x - i;
|
double xi = x - i;
|
||||||
double yi = y - j;
|
double yi = y - j;
|
||||||
|
|
||||||
@@ -75,7 +78,7 @@ public class OpenSimplex2Sampler extends SimplexStyleSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y, double z) {
|
public double getNoiseRaw(long sl, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
// 3D OpenSimplex2Sampler case uses two offset rotated cube grids.
|
// 3D OpenSimplex2Sampler case uses two offset rotated cube grids.
|
||||||
final double R3 = (2.0 / 3.0);
|
final double R3 = (2.0 / 3.0);
|
||||||
@@ -85,9 +88,9 @@ public class OpenSimplex2Sampler extends SimplexStyleSampler {
|
|||||||
z = r - z;
|
z = r - z;
|
||||||
|
|
||||||
|
|
||||||
int i = fastRound(x);
|
int i = (int) Math.round(x);
|
||||||
int j = fastRound(y);
|
int j = (int) Math.round(y);
|
||||||
int k = fastRound(z);
|
int k = (int) Math.round(z);
|
||||||
double x0 = x - i;
|
double x0 = x - i;
|
||||||
double y0 = y - j;
|
double y0 = y - j;
|
||||||
double z0 = z - k;
|
double z0 = z - k;
|
||||||
|
|||||||
+27
-22
@@ -7,41 +7,46 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.samplers.noise.simplex;
|
package com.dfsek.terra.addons.noise.samplers.noise.simplex;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NoiseSampler implementation to provide Perlin Noise.
|
* NoiseSampler implementation to provide Perlin Noise.
|
||||||
*/
|
*/
|
||||||
public class PerlinSampler extends SimplexStyleSampler {
|
public class PerlinSampler extends SimplexStyleSampler {
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y) {
|
public double getNoiseRaw(long sl, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
int x0 = fastFloor(x);
|
int x0 = (int) Math.floor(x);
|
||||||
int y0 = fastFloor(y);
|
int y0 = (int) Math.floor(y);
|
||||||
|
|
||||||
double xd0 = x - x0;
|
double xd0 = x - x0;
|
||||||
double yd0 = y - y0;
|
double yd0 = y - y0;
|
||||||
double xd1 = xd0 - 1;
|
double xd1 = xd0 - 1;
|
||||||
double yd1 = yd0 - 1;
|
double yd1 = yd0 - 1;
|
||||||
|
|
||||||
double xs = interpQuintic(xd0);
|
double xs = MathUtil.interpQuintic(xd0);
|
||||||
double ys = interpQuintic(yd0);
|
double ys = MathUtil.interpQuintic(yd0);
|
||||||
|
|
||||||
x0 *= PRIME_X;
|
x0 *= PRIME_X;
|
||||||
y0 *= PRIME_Y;
|
y0 *= PRIME_Y;
|
||||||
int x1 = x0 + PRIME_X;
|
int x1 = x0 + PRIME_X;
|
||||||
int y1 = y0 + PRIME_Y;
|
int y1 = y0 + PRIME_Y;
|
||||||
|
|
||||||
double xf0 = lerp(gradCoord(seed, x0, y0, xd0, yd0), gradCoord(seed, x1, y0, xd1, yd0), xs);
|
double xf0 = MathUtil.lerp(gradCoord(seed, x0, y0, xd0, yd0), gradCoord(seed, x1, y0, xd1, yd0), xs);
|
||||||
double xf1 = lerp(gradCoord(seed, x0, y1, xd0, yd1), gradCoord(seed, x1, y1, xd1, yd1), xs);
|
double xf1 = MathUtil.lerp(gradCoord(seed, x0, y1, xd0, yd1), gradCoord(seed, x1, y1, xd1, yd1), xs);
|
||||||
|
|
||||||
return lerp(xf0, xf1, ys) * 1.4247691104677813;
|
return MathUtil.lerp(xf0, xf1, ys) * 1.4247691104677813;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y, double z) {
|
public double getNoiseRaw(long sl, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
int x0 = fastFloor(x);
|
int x0 = (int) Math.floor(x);
|
||||||
int y0 = fastFloor(y);
|
int y0 = (int) Math.floor(y);
|
||||||
int z0 = fastFloor(z);
|
int z0 = (int) Math.floor(z);
|
||||||
|
|
||||||
double xd0 = x - x0;
|
double xd0 = x - x0;
|
||||||
double yd0 = y - y0;
|
double yd0 = y - y0;
|
||||||
@@ -50,9 +55,9 @@ public class PerlinSampler extends SimplexStyleSampler {
|
|||||||
double yd1 = yd0 - 1;
|
double yd1 = yd0 - 1;
|
||||||
double zd1 = zd0 - 1;
|
double zd1 = zd0 - 1;
|
||||||
|
|
||||||
double xs = interpQuintic(xd0);
|
double xs = MathUtil.interpQuintic(xd0);
|
||||||
double ys = interpQuintic(yd0);
|
double ys = MathUtil.interpQuintic(yd0);
|
||||||
double zs = interpQuintic(zd0);
|
double zs = MathUtil.interpQuintic(zd0);
|
||||||
|
|
||||||
x0 *= PRIME_X;
|
x0 *= PRIME_X;
|
||||||
y0 *= PRIME_Y;
|
y0 *= PRIME_Y;
|
||||||
@@ -61,14 +66,14 @@ public class PerlinSampler extends SimplexStyleSampler {
|
|||||||
int y1 = y0 + PRIME_Y;
|
int y1 = y0 + PRIME_Y;
|
||||||
int z1 = z0 + PRIME_Z;
|
int z1 = z0 + PRIME_Z;
|
||||||
|
|
||||||
double xf00 = lerp(gradCoord(seed, x0, y0, z0, xd0, yd0, zd0), gradCoord(seed, x1, y0, z0, xd1, yd0, zd0), xs);
|
double xf00 = MathUtil.lerp(gradCoord(seed, x0, y0, z0, xd0, yd0, zd0), gradCoord(seed, x1, y0, z0, xd1, yd0, zd0), xs);
|
||||||
double xf10 = lerp(gradCoord(seed, x0, y1, z0, xd0, yd1, zd0), gradCoord(seed, x1, y1, z0, xd1, yd1, zd0), xs);
|
double xf10 = MathUtil.lerp(gradCoord(seed, x0, y1, z0, xd0, yd1, zd0), gradCoord(seed, x1, y1, z0, xd1, yd1, zd0), xs);
|
||||||
double xf01 = lerp(gradCoord(seed, x0, y0, z1, xd0, yd0, zd1), gradCoord(seed, x1, y0, z1, xd1, yd0, zd1), xs);
|
double xf01 = MathUtil.lerp(gradCoord(seed, x0, y0, z1, xd0, yd0, zd1), gradCoord(seed, x1, y0, z1, xd1, yd0, zd1), xs);
|
||||||
double xf11 = lerp(gradCoord(seed, x0, y1, z1, xd0, yd1, zd1), gradCoord(seed, x1, y1, z1, xd1, yd1, zd1), xs);
|
double xf11 = MathUtil.lerp(gradCoord(seed, x0, y1, z1, xd0, yd1, zd1), gradCoord(seed, x1, y1, z1, xd1, yd1, zd1), xs);
|
||||||
|
|
||||||
double yf0 = lerp(xf00, xf10, ys);
|
double yf0 = MathUtil.lerp(xf00, xf10, ys);
|
||||||
double yf1 = lerp(xf01, xf11, ys);
|
double yf1 = MathUtil.lerp(xf01, xf11, ys);
|
||||||
|
|
||||||
return lerp(yf0, yf1, zs) * 0.964921414852142333984375;
|
return MathUtil.lerp(yf0, yf1, zs) * 0.964921414852142333984375;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-7
@@ -7,6 +7,9 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.samplers.noise.simplex;
|
package com.dfsek.terra.addons.noise.samplers.noise.simplex;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class SimplexSampler extends SimplexStyleSampler {
|
public class SimplexSampler extends SimplexStyleSampler {
|
||||||
private static final Double2[] GRAD_2D = {
|
private static final Double2[] GRAD_2D = {
|
||||||
new Double2(-1, -1), new Double2(1, -1), new Double2(-1, 1), new Double2(1, 1),
|
new Double2(-1, -1), new Double2(1, -1), new Double2(-1, 1), new Double2(1, 1),
|
||||||
@@ -58,11 +61,11 @@ public class SimplexSampler extends SimplexStyleSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y) {
|
public double getNoiseRaw(long sl, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
double t = (x + y) * F2;
|
double t = (x + y) * F2;
|
||||||
int i = fastFloor(x + t);
|
int i = (int) Math.floor(x + t);
|
||||||
int j = fastFloor(y + t);
|
int j = (int) Math.floor(y + t);
|
||||||
|
|
||||||
t = (i + j) * G2;
|
t = (i + j) * G2;
|
||||||
double X0 = i - t;
|
double X0 = i - t;
|
||||||
@@ -115,12 +118,12 @@ public class SimplexSampler extends SimplexStyleSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y, double z) {
|
public double getNoiseRaw(long sl, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
double t = (x + y + z) * F3;
|
double t = (x + y + z) * F3;
|
||||||
int i = fastFloor(x + t);
|
int i = (int) Math.floor(x + t);
|
||||||
int j = fastFloor(y + t);
|
int j = (int) Math.floor(y + t);
|
||||||
int k = fastFloor(z + t);
|
int k = (int) Math.floor(z + t);
|
||||||
|
|
||||||
t = (i + j + k) * G3;
|
t = (i + j + k) * G3;
|
||||||
double x0 = x - (i - t);
|
double x0 = x - (i - t);
|
||||||
|
|||||||
+38
-33
@@ -7,12 +7,17 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.samplers.noise.value;
|
package com.dfsek.terra.addons.noise.samplers.noise.value;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class ValueCubicSampler extends ValueStyleNoise {
|
public class ValueCubicSampler extends ValueStyleNoise {
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y) {
|
public double getNoiseRaw(long sl, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
int x1 = fastFloor(x);
|
int x1 = (int) Math.floor(x);
|
||||||
int y1 = fastFloor(y);
|
int y1 = (int) Math.floor(y);
|
||||||
|
|
||||||
double xs = x - x1;
|
double xs = x - x1;
|
||||||
double ys = y - y1;
|
double ys = y - y1;
|
||||||
@@ -26,24 +31,24 @@ public class ValueCubicSampler extends ValueStyleNoise {
|
|||||||
int x3 = x1 + (PRIME_X << 1);
|
int x3 = x1 + (PRIME_X << 1);
|
||||||
int y3 = y1 + (PRIME_Y << 1);
|
int y3 = y1 + (PRIME_Y << 1);
|
||||||
|
|
||||||
return cubicLerp(
|
return MathUtil.cubicLerp(
|
||||||
cubicLerp(valCoord(seed, x0, y0), valCoord(seed, x1, y0), valCoord(seed, x2, y0), valCoord(seed, x3, y0),
|
MathUtil.cubicLerp(valCoord(seed, x0, y0), valCoord(seed, x1, y0), valCoord(seed, x2, y0), valCoord(seed, x3, y0),
|
||||||
xs),
|
xs),
|
||||||
cubicLerp(valCoord(seed, x0, y1), valCoord(seed, x1, y1), valCoord(seed, x2, y1), valCoord(seed, x3, y1),
|
MathUtil.cubicLerp(valCoord(seed, x0, y1), valCoord(seed, x1, y1), valCoord(seed, x2, y1), valCoord(seed, x3, y1),
|
||||||
xs),
|
xs),
|
||||||
cubicLerp(valCoord(seed, x0, y2), valCoord(seed, x1, y2), valCoord(seed, x2, y2), valCoord(seed, x3, y2),
|
MathUtil.cubicLerp(valCoord(seed, x0, y2), valCoord(seed, x1, y2), valCoord(seed, x2, y2), valCoord(seed, x3, y2),
|
||||||
xs),
|
xs),
|
||||||
cubicLerp(valCoord(seed, x0, y3), valCoord(seed, x1, y3), valCoord(seed, x2, y3), valCoord(seed, x3, y3),
|
MathUtil.cubicLerp(valCoord(seed, x0, y3), valCoord(seed, x1, y3), valCoord(seed, x2, y3), valCoord(seed, x3, y3),
|
||||||
xs),
|
xs),
|
||||||
ys) * (1 / (1.5 * 1.5));
|
ys) * (1 / (1.5 * 1.5));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y, double z) {
|
public double getNoiseRaw(long sl, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
int x1 = fastFloor(x);
|
int x1 = (int) Math.floor(x);
|
||||||
int y1 = fastFloor(y);
|
int y1 = (int) Math.floor(y);
|
||||||
int z1 = fastFloor(z);
|
int z1 = (int) Math.floor(z);
|
||||||
|
|
||||||
double xs = x - x1;
|
double xs = x - x1;
|
||||||
double ys = y - y1;
|
double ys = y - y1;
|
||||||
@@ -63,45 +68,45 @@ public class ValueCubicSampler extends ValueStyleNoise {
|
|||||||
int y3 = y1 + (PRIME_Y << 1);
|
int y3 = y1 + (PRIME_Y << 1);
|
||||||
int z3 = z1 + (PRIME_Z << 1);
|
int z3 = z1 + (PRIME_Z << 1);
|
||||||
|
|
||||||
return cubicLerp(
|
return MathUtil.cubicLerp(
|
||||||
cubicLerp(
|
MathUtil.cubicLerp(
|
||||||
cubicLerp(valCoord(seed, x0, y0, z0), valCoord(seed, x1, y0, z0), valCoord(seed, x2, y0, z0),
|
MathUtil.cubicLerp(valCoord(seed, x0, y0, z0), valCoord(seed, x1, y0, z0), valCoord(seed, x2, y0, z0),
|
||||||
valCoord(seed, x3, y0, z0), xs),
|
valCoord(seed, x3, y0, z0), xs),
|
||||||
cubicLerp(valCoord(seed, x0, y1, z0), valCoord(seed, x1, y1, z0), valCoord(seed, x2, y1, z0),
|
MathUtil.cubicLerp(valCoord(seed, x0, y1, z0), valCoord(seed, x1, y1, z0), valCoord(seed, x2, y1, z0),
|
||||||
valCoord(seed, x3, y1, z0), xs),
|
valCoord(seed, x3, y1, z0), xs),
|
||||||
cubicLerp(valCoord(seed, x0, y2, z0), valCoord(seed, x1, y2, z0), valCoord(seed, x2, y2, z0),
|
MathUtil.cubicLerp(valCoord(seed, x0, y2, z0), valCoord(seed, x1, y2, z0), valCoord(seed, x2, y2, z0),
|
||||||
valCoord(seed, x3, y2, z0), xs),
|
valCoord(seed, x3, y2, z0), xs),
|
||||||
cubicLerp(valCoord(seed, x0, y3, z0), valCoord(seed, x1, y3, z0), valCoord(seed, x2, y3, z0),
|
MathUtil.cubicLerp(valCoord(seed, x0, y3, z0), valCoord(seed, x1, y3, z0), valCoord(seed, x2, y3, z0),
|
||||||
valCoord(seed, x3, y3, z0), xs),
|
valCoord(seed, x3, y3, z0), xs),
|
||||||
ys),
|
ys),
|
||||||
cubicLerp(
|
MathUtil.cubicLerp(
|
||||||
cubicLerp(valCoord(seed, x0, y0, z1), valCoord(seed, x1, y0, z1), valCoord(seed, x2, y0, z1),
|
MathUtil.cubicLerp(valCoord(seed, x0, y0, z1), valCoord(seed, x1, y0, z1), valCoord(seed, x2, y0, z1),
|
||||||
valCoord(seed, x3, y0, z1), xs),
|
valCoord(seed, x3, y0, z1), xs),
|
||||||
cubicLerp(valCoord(seed, x0, y1, z1), valCoord(seed, x1, y1, z1), valCoord(seed, x2, y1, z1),
|
MathUtil.cubicLerp(valCoord(seed, x0, y1, z1), valCoord(seed, x1, y1, z1), valCoord(seed, x2, y1, z1),
|
||||||
valCoord(seed, x3, y1, z1), xs),
|
valCoord(seed, x3, y1, z1), xs),
|
||||||
cubicLerp(valCoord(seed, x0, y2, z1), valCoord(seed, x1, y2, z1), valCoord(seed, x2, y2, z1),
|
MathUtil.cubicLerp(valCoord(seed, x0, y2, z1), valCoord(seed, x1, y2, z1), valCoord(seed, x2, y2, z1),
|
||||||
valCoord(seed, x3, y2, z1), xs),
|
valCoord(seed, x3, y2, z1), xs),
|
||||||
cubicLerp(valCoord(seed, x0, y3, z1), valCoord(seed, x1, y3, z1), valCoord(seed, x2, y3, z1),
|
MathUtil.cubicLerp(valCoord(seed, x0, y3, z1), valCoord(seed, x1, y3, z1), valCoord(seed, x2, y3, z1),
|
||||||
valCoord(seed, x3, y3, z1), xs),
|
valCoord(seed, x3, y3, z1), xs),
|
||||||
ys),
|
ys),
|
||||||
cubicLerp(
|
MathUtil.cubicLerp(
|
||||||
cubicLerp(valCoord(seed, x0, y0, z2), valCoord(seed, x1, y0, z2), valCoord(seed, x2, y0, z2),
|
MathUtil.cubicLerp(valCoord(seed, x0, y0, z2), valCoord(seed, x1, y0, z2), valCoord(seed, x2, y0, z2),
|
||||||
valCoord(seed, x3, y0, z2), xs),
|
valCoord(seed, x3, y0, z2), xs),
|
||||||
cubicLerp(valCoord(seed, x0, y1, z2), valCoord(seed, x1, y1, z2), valCoord(seed, x2, y1, z2),
|
MathUtil.cubicLerp(valCoord(seed, x0, y1, z2), valCoord(seed, x1, y1, z2), valCoord(seed, x2, y1, z2),
|
||||||
valCoord(seed, x3, y1, z2), xs),
|
valCoord(seed, x3, y1, z2), xs),
|
||||||
cubicLerp(valCoord(seed, x0, y2, z2), valCoord(seed, x1, y2, z2), valCoord(seed, x2, y2, z2),
|
MathUtil.cubicLerp(valCoord(seed, x0, y2, z2), valCoord(seed, x1, y2, z2), valCoord(seed, x2, y2, z2),
|
||||||
valCoord(seed, x3, y2, z2), xs),
|
valCoord(seed, x3, y2, z2), xs),
|
||||||
cubicLerp(valCoord(seed, x0, y3, z2), valCoord(seed, x1, y3, z2), valCoord(seed, x2, y3, z2),
|
MathUtil.cubicLerp(valCoord(seed, x0, y3, z2), valCoord(seed, x1, y3, z2), valCoord(seed, x2, y3, z2),
|
||||||
valCoord(seed, x3, y3, z2), xs),
|
valCoord(seed, x3, y3, z2), xs),
|
||||||
ys),
|
ys),
|
||||||
cubicLerp(
|
MathUtil.cubicLerp(
|
||||||
cubicLerp(valCoord(seed, x0, y0, z3), valCoord(seed, x1, y0, z3), valCoord(seed, x2, y0, z3),
|
MathUtil.cubicLerp(valCoord(seed, x0, y0, z3), valCoord(seed, x1, y0, z3), valCoord(seed, x2, y0, z3),
|
||||||
valCoord(seed, x3, y0, z3), xs),
|
valCoord(seed, x3, y0, z3), xs),
|
||||||
cubicLerp(valCoord(seed, x0, y1, z3), valCoord(seed, x1, y1, z3), valCoord(seed, x2, y1, z3),
|
MathUtil.cubicLerp(valCoord(seed, x0, y1, z3), valCoord(seed, x1, y1, z3), valCoord(seed, x2, y1, z3),
|
||||||
valCoord(seed, x3, y1, z3), xs),
|
valCoord(seed, x3, y1, z3), xs),
|
||||||
cubicLerp(valCoord(seed, x0, y2, z3), valCoord(seed, x1, y2, z3), valCoord(seed, x2, y2, z3),
|
MathUtil.cubicLerp(valCoord(seed, x0, y2, z3), valCoord(seed, x1, y2, z3), valCoord(seed, x2, y2, z3),
|
||||||
valCoord(seed, x3, y2, z3), xs),
|
valCoord(seed, x3, y2, z3), xs),
|
||||||
cubicLerp(valCoord(seed, x0, y3, z3), valCoord(seed, x1, y3, z3), valCoord(seed, x2, y3, z3),
|
MathUtil.cubicLerp(valCoord(seed, x0, y3, z3), valCoord(seed, x1, y3, z3), valCoord(seed, x2, y3, z3),
|
||||||
valCoord(seed, x3, y3, z3), xs),
|
valCoord(seed, x3, y3, z3), xs),
|
||||||
ys),
|
ys),
|
||||||
zs) * (1 / (1.5 * 1.5 * 1.5));
|
zs) * (1 / (1.5 * 1.5 * 1.5));
|
||||||
|
|||||||
+27
-22
@@ -7,37 +7,42 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.samplers.noise.value;
|
package com.dfsek.terra.addons.noise.samplers.noise.value;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class ValueSampler extends ValueStyleNoise {
|
public class ValueSampler extends ValueStyleNoise {
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y) {
|
public double getNoiseRaw(long sl, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
int x0 = fastFloor(x);
|
int x0 = (int) Math.floor(x);
|
||||||
int y0 = fastFloor(y);
|
int y0 = (int) Math.floor(y);
|
||||||
|
|
||||||
double xs = interpHermite(x - x0);
|
double xs = MathUtil.interpHermite(x - x0);
|
||||||
double ys = interpHermite(y - y0);
|
double ys = MathUtil.interpHermite(y - y0);
|
||||||
|
|
||||||
x0 *= PRIME_X;
|
x0 *= PRIME_X;
|
||||||
y0 *= PRIME_Y;
|
y0 *= PRIME_Y;
|
||||||
int x1 = x0 + PRIME_X;
|
int x1 = x0 + PRIME_X;
|
||||||
int y1 = y0 + PRIME_Y;
|
int y1 = y0 + PRIME_Y;
|
||||||
|
|
||||||
double xf0 = lerp(valCoord(seed, x0, y0), valCoord(seed, x1, y0), xs);
|
double xf0 = MathUtil.lerp(valCoord(seed, x0, y0), valCoord(seed, x1, y0), xs);
|
||||||
double xf1 = lerp(valCoord(seed, x0, y1), valCoord(seed, x1, y1), xs);
|
double xf1 = MathUtil.lerp(valCoord(seed, x0, y1), valCoord(seed, x1, y1), xs);
|
||||||
|
|
||||||
return lerp(xf0, xf1, ys);
|
return MathUtil.lerp(xf0, xf1, ys);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y, double z) {
|
public double getNoiseRaw(long sl, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
int x0 = fastFloor(x);
|
int x0 = (int) Math.floor(x);
|
||||||
int y0 = fastFloor(y);
|
int y0 = (int) Math.floor(y);
|
||||||
int z0 = fastFloor(z);
|
int z0 = (int) Math.floor(z);
|
||||||
|
|
||||||
double xs = interpHermite(x - x0);
|
double xs = MathUtil.interpHermite(x - x0);
|
||||||
double ys = interpHermite(y - y0);
|
double ys = MathUtil.interpHermite(y - y0);
|
||||||
double zs = interpHermite(z - z0);
|
double zs = MathUtil.interpHermite(z - z0);
|
||||||
|
|
||||||
x0 *= PRIME_X;
|
x0 *= PRIME_X;
|
||||||
y0 *= PRIME_Y;
|
y0 *= PRIME_Y;
|
||||||
@@ -46,14 +51,14 @@ public class ValueSampler extends ValueStyleNoise {
|
|||||||
int y1 = y0 + PRIME_Y;
|
int y1 = y0 + PRIME_Y;
|
||||||
int z1 = z0 + PRIME_Z;
|
int z1 = z0 + PRIME_Z;
|
||||||
|
|
||||||
double xf00 = lerp(valCoord(seed, x0, y0, z0), valCoord(seed, x1, y0, z0), xs);
|
double xf00 = MathUtil.lerp(valCoord(seed, x0, y0, z0), valCoord(seed, x1, y0, z0), xs);
|
||||||
double xf10 = lerp(valCoord(seed, x0, y1, z0), valCoord(seed, x1, y1, z0), xs);
|
double xf10 = MathUtil.lerp(valCoord(seed, x0, y1, z0), valCoord(seed, x1, y1, z0), xs);
|
||||||
double xf01 = lerp(valCoord(seed, x0, y0, z1), valCoord(seed, x1, y0, z1), xs);
|
double xf01 = MathUtil.lerp(valCoord(seed, x0, y0, z1), valCoord(seed, x1, y0, z1), xs);
|
||||||
double xf11 = lerp(valCoord(seed, x0, y1, z1), valCoord(seed, x1, y1, z1), xs);
|
double xf11 = MathUtil.lerp(valCoord(seed, x0, y1, z1), valCoord(seed, x1, y1, z1), xs);
|
||||||
|
|
||||||
double yf0 = lerp(xf00, xf10, ys);
|
double yf0 = MathUtil.lerp(xf00, xf10, ys);
|
||||||
double yf1 = lerp(xf01, xf11, ys);
|
double yf1 = MathUtil.lerp(xf01, xf11, ys);
|
||||||
|
|
||||||
return lerp(yf0, yf1, zs);
|
return MathUtil.lerp(yf0, yf1, zs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,10 +2,5 @@ version = version("1.0.0")
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
|
|
||||||
relocate("net.jafama", "com.dfsek.terra.addons.ore.lib.jafama")
|
|
||||||
}
|
|
||||||
|
|||||||
+13
-14
@@ -7,14 +7,13 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.ore.ores;
|
package com.dfsek.terra.addons.ore.ores;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import com.dfsek.terra.api.block.BlockType;
|
import com.dfsek.terra.api.block.BlockType;
|
||||||
import com.dfsek.terra.api.block.state.BlockState;
|
import com.dfsek.terra.api.block.state.BlockState;
|
||||||
import com.dfsek.terra.api.structure.Structure;
|
import com.dfsek.terra.api.structure.Structure;
|
||||||
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
import com.dfsek.terra.api.util.Rotation;
|
import com.dfsek.terra.api.util.Rotation;
|
||||||
import com.dfsek.terra.api.util.collection.MaterialSet;
|
import com.dfsek.terra.api.util.collection.MaterialSet;
|
||||||
import com.dfsek.terra.api.util.vector.Vector3Int;
|
import com.dfsek.terra.api.util.vector.Vector3Int;
|
||||||
@@ -50,10 +49,10 @@ public class VanillaOre implements Structure {
|
|||||||
|
|
||||||
float f = random.nextFloat() * (float) Math.PI;
|
float f = random.nextFloat() * (float) Math.PI;
|
||||||
|
|
||||||
double d1 = centerX + 8 + FastMath.sin(f) * size / 8.0F;
|
double d1 = centerX + 8 + MathUtil.sin(f) * size / 8.0F;
|
||||||
double d2 = centerX + 8 - FastMath.sin(f) * size / 8.0F;
|
double d2 = centerX + 8 - MathUtil.sin(f) * size / 8.0F;
|
||||||
double d3 = centerZ + 8 + FastMath.cos(f) * size / 8.0F;
|
double d3 = centerZ + 8 + MathUtil.cos(f) * size / 8.0F;
|
||||||
double d4 = centerZ + 8 - FastMath.cos(f) * size / 8.0F;
|
double d4 = centerZ + 8 - MathUtil.cos(f) * size / 8.0F;
|
||||||
|
|
||||||
double d5 = centerY + random.nextInt(3) - 2D;
|
double d5 = centerY + random.nextInt(3) - 2D;
|
||||||
double d6 = centerY + random.nextInt(3) - 2D;
|
double d6 = centerY + random.nextInt(3) - 2D;
|
||||||
@@ -62,16 +61,16 @@ public class VanillaOre implements Structure {
|
|||||||
float iFactor = (float) i / (float) size;
|
float iFactor = (float) i / (float) size;
|
||||||
|
|
||||||
double d10 = random.nextDouble() * size / 16.0D;
|
double d10 = random.nextDouble() * size / 16.0D;
|
||||||
double d11 = (FastMath.sin(Math.PI * iFactor) + 1.0) * d10 + 1.0;
|
double d11 = (MathUtil.sin(Math.PI * iFactor) + 1.0) * d10 + 1.0;
|
||||||
double d12 = (FastMath.sin(Math.PI * iFactor) + 1.0) * d10 + 1.0;
|
double d12 = (MathUtil.sin(Math.PI * iFactor) + 1.0) * d10 + 1.0;
|
||||||
|
|
||||||
int xStart = FastMath.roundToInt(FastMath.floor(d1 + (d2 - d1) * iFactor - d11 / 2.0D));
|
int xStart = (int) Math.round(Math.floor(d1 + (d2 - d1) * iFactor - d11 / 2.0D));
|
||||||
int yStart = FastMath.roundToInt(FastMath.floor(d5 + (d6 - d5) * iFactor - d12 / 2.0D));
|
int yStart = (int) Math.round(Math.floor(d5 + (d6 - d5) * iFactor - d12 / 2.0D));
|
||||||
int zStart = FastMath.roundToInt(FastMath.floor(d3 + (d4 - d3) * iFactor - d11 / 2.0D));
|
int zStart = (int) Math.round(Math.floor(d3 + (d4 - d3) * iFactor - d11 / 2.0D));
|
||||||
|
|
||||||
int xEnd = FastMath.roundToInt(FastMath.floor(d1 + (d2 - d1) * iFactor + d11 / 2.0D));
|
int xEnd = (int) Math.round(Math.floor(d1 + (d2 - d1) * iFactor + d11 / 2.0D));
|
||||||
int yEnd = FastMath.roundToInt(FastMath.floor(d5 + (d6 - d5) * iFactor + d12 / 2.0D));
|
int yEnd = (int) Math.round(Math.floor(d5 + (d6 - d5) * iFactor + d12 / 2.0D));
|
||||||
int zEnd = FastMath.roundToInt(FastMath.floor(d3 + (d4 - d3) * iFactor + d11 / 2.0D));
|
int zEnd = (int) Math.round(Math.floor(d3 + (d4 - d3) * iFactor + d11 / 2.0D));
|
||||||
|
|
||||||
for(int x = xStart; x <= xEnd; x++) {
|
for(int x = xStart; x <= xEnd; x++) {
|
||||||
double d13 = (x + 0.5D - (d1 + (d2 - d1) * iFactor)) / (d11 / 2.0D);
|
double d13 = (x + 0.5D - (d1 + (d2 - d1) * iFactor)) / (d11 / 2.0D);
|
||||||
|
|||||||
@@ -3,11 +3,4 @@ version = version("1.0.0")
|
|||||||
dependencies {
|
dependencies {
|
||||||
api("com.googlecode.json-simple:json-simple:1.1.1")
|
api("com.googlecode.json-simple:json-simple:1.1.1")
|
||||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
|
|
||||||
implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
|
|
||||||
relocate("net.jafama", "com.dfsek.terra.addons.structure.lib.jafama")
|
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-4
@@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.structure.structures.loot;
|
package com.dfsek.terra.addons.structure.structures.loot;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
import org.json.simple.JSONArray;
|
import org.json.simple.JSONArray;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
@@ -62,12 +61,12 @@ public class Entry {
|
|||||||
max = (long) ((JSONObject) loot).get("max");
|
max = (long) ((JSONObject) loot).get("max");
|
||||||
min = (long) ((JSONObject) loot).get("min");
|
min = (long) ((JSONObject) loot).get("min");
|
||||||
}
|
}
|
||||||
functions.add(new AmountFunction(FastMath.toIntExact(min), FastMath.toIntExact(max)));
|
functions.add(new AmountFunction(Math.toIntExact(min), Math.toIntExact(max)));
|
||||||
}
|
}
|
||||||
case "minecraft:set_damage", "set_damage" -> {
|
case "minecraft:set_damage", "set_damage" -> {
|
||||||
long maxDamage = (long) ((JSONObject) ((JSONObject) function).get("damage")).get("max");
|
long maxDamage = (long) ((JSONObject) ((JSONObject) function).get("damage")).get("max");
|
||||||
long minDamage = (long) ((JSONObject) ((JSONObject) function).get("damage")).get("min");
|
long minDamage = (long) ((JSONObject) ((JSONObject) function).get("damage")).get("min");
|
||||||
functions.add(new DamageFunction(FastMath.toIntExact(minDamage), FastMath.toIntExact(maxDamage)));
|
functions.add(new DamageFunction(Math.toIntExact(minDamage), Math.toIntExact(maxDamage)));
|
||||||
}
|
}
|
||||||
case "minecraft:enchant_with_levels", "enchant_with_levels" -> {
|
case "minecraft:enchant_with_levels", "enchant_with_levels" -> {
|
||||||
long maxEnchant = (long) ((JSONObject) ((JSONObject) function).get("levels")).get("max");
|
long maxEnchant = (long) ((JSONObject) ((JSONObject) function).get("levels")).get("max");
|
||||||
@@ -76,7 +75,7 @@ public class Entry {
|
|||||||
if(((JSONObject) function).containsKey("disabled_enchants"))
|
if(((JSONObject) function).containsKey("disabled_enchants"))
|
||||||
disabled = (JSONArray) ((JSONObject) function).get("disabled_enchants");
|
disabled = (JSONArray) ((JSONObject) function).get("disabled_enchants");
|
||||||
functions.add(
|
functions.add(
|
||||||
new EnchantFunction(FastMath.toIntExact(minEnchant), FastMath.toIntExact(maxEnchant), disabled, platform));
|
new EnchantFunction(Math.toIntExact(minEnchant), Math.toIntExact(maxEnchant), disabled, platform));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-6
@@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.structure.structures.loot;
|
package com.dfsek.terra.addons.structure.structures.loot;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
import org.json.simple.JSONArray;
|
import org.json.simple.JSONArray;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
@@ -37,16 +36,16 @@ public class Pool {
|
|||||||
entries = new ProbabilityCollection<>();
|
entries = new ProbabilityCollection<>();
|
||||||
Object amount = pool.get("rolls");
|
Object amount = pool.get("rolls");
|
||||||
if(amount instanceof Long) {
|
if(amount instanceof Long) {
|
||||||
max = FastMath.toIntExact((Long) amount);
|
max = Math.toIntExact((Long) amount);
|
||||||
min = FastMath.toIntExact((Long) amount);
|
min = Math.toIntExact((Long) amount);
|
||||||
} else {
|
} else {
|
||||||
max = FastMath.toIntExact((Long) ((JSONObject) amount).get("max"));
|
max = Math.toIntExact((Long) ((JSONObject) amount).get("max"));
|
||||||
min = FastMath.toIntExact((Long) ((JSONObject) amount).get("min"));
|
min = Math.toIntExact((Long) ((JSONObject) amount).get("min"));
|
||||||
}
|
}
|
||||||
|
|
||||||
for(Object entryJSON : (JSONArray) pool.get("entries")) {
|
for(Object entryJSON : (JSONArray) pool.get("entries")) {
|
||||||
Entry entry = new Entry((JSONObject) entryJSON, platform);
|
Entry entry = new Entry((JSONObject) entryJSON, platform);
|
||||||
entries.add(entry, FastMath.toIntExact(entry.getWeight()));
|
entries.add(entry, Math.toIntExact(entry.getWeight()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-4
@@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.structure.structures.loot.functions;
|
package com.dfsek.terra.addons.structure.structures.loot.functions;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
import org.json.simple.JSONArray;
|
import org.json.simple.JSONArray;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@@ -57,7 +56,7 @@ public class EnchantFunction implements LootFunction {
|
|||||||
possible.add(ench);
|
possible.add(ench);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
int numEnchant = (r.nextInt((int) FastMath.abs(enchant)) / 10 + 1);
|
int numEnchant = (r.nextInt((int) Math.abs(enchant)) / 10 + 1);
|
||||||
Collections.shuffle(possible);
|
Collections.shuffle(possible);
|
||||||
ItemMeta meta = original.getItemMeta();
|
ItemMeta meta = original.getItemMeta();
|
||||||
iter:
|
iter:
|
||||||
@@ -68,12 +67,12 @@ public class EnchantFunction implements LootFunction {
|
|||||||
}
|
}
|
||||||
int lvl = r.nextInt(1 + (int) (((enchant / 40 > 1) ? 1 : enchant / 40) * (chosen.getMaxLevel())));
|
int lvl = r.nextInt(1 + (int) (((enchant / 40 > 1) ? 1 : enchant / 40) * (chosen.getMaxLevel())));
|
||||||
try {
|
try {
|
||||||
meta.addEnchantment(chosen, FastMath.max(lvl, 1));
|
meta.addEnchantment(chosen, Math.max(lvl, 1));
|
||||||
} catch(IllegalArgumentException e) {
|
} catch(IllegalArgumentException e) {
|
||||||
LOGGER.warn(
|
LOGGER.warn(
|
||||||
"Attempted to enchant {} with {} at level {}, but an unexpected exception occurred! Usually this is caused by a " +
|
"Attempted to enchant {} with {} at level {}, but an unexpected exception occurred! Usually this is caused by a " +
|
||||||
"misbehaving enchantment plugin.",
|
"misbehaving enchantment plugin.",
|
||||||
original.getType(), chosen, FastMath.max(lvl, 1));
|
original.getType(), chosen, Math.max(lvl, 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
original.setItemMeta(meta);
|
original.setItemMeta(meta);
|
||||||
|
|||||||
@@ -3,6 +3,6 @@ version = version("1.0.0")
|
|||||||
dependencies {
|
dependencies {
|
||||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
|
|
||||||
implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-5
@@ -4,20 +4,20 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
|||||||
|
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
||||||
import com.dfsek.terra.addons.image.config.ColorLoader;
|
import com.dfsek.terra.addons.image.config.ColorLoader;
|
||||||
import com.dfsek.terra.addons.image.config.ColorLoader.ColorString;
|
import com.dfsek.terra.addons.image.config.ColorLoader.ColorString;
|
||||||
import com.dfsek.terra.addons.image.config.noisesampler.ChannelNoiseSamplerTemplate;
|
|
||||||
import com.dfsek.terra.addons.image.config.noisesampler.DistanceTransformNoiseSamplerTemplate;
|
|
||||||
import com.dfsek.terra.addons.image.config.image.ImageTemplate;
|
|
||||||
import com.dfsek.terra.addons.image.config.image.StitchedImageTemplate;
|
|
||||||
import com.dfsek.terra.addons.image.config.colorsampler.ConstantColorSamplerTemplate;
|
import com.dfsek.terra.addons.image.config.colorsampler.ConstantColorSamplerTemplate;
|
||||||
import com.dfsek.terra.addons.image.config.colorsampler.image.SingleImageColorSamplerTemplate;
|
import com.dfsek.terra.addons.image.config.colorsampler.image.SingleImageColorSamplerTemplate;
|
||||||
import com.dfsek.terra.addons.image.config.colorsampler.image.TileImageColorSamplerTemplate;
|
import com.dfsek.terra.addons.image.config.colorsampler.image.TileImageColorSamplerTemplate;
|
||||||
import com.dfsek.terra.addons.image.config.colorsampler.mutate.RotateColorSamplerTemplate;
|
import com.dfsek.terra.addons.image.config.colorsampler.mutate.RotateColorSamplerTemplate;
|
||||||
import com.dfsek.terra.addons.image.config.colorsampler.mutate.TranslateColorSamplerTemplate;
|
import com.dfsek.terra.addons.image.config.colorsampler.mutate.TranslateColorSamplerTemplate;
|
||||||
|
import com.dfsek.terra.addons.image.config.image.ImageTemplate;
|
||||||
|
import com.dfsek.terra.addons.image.config.image.StitchedImageTemplate;
|
||||||
|
import com.dfsek.terra.addons.image.config.noisesampler.ChannelNoiseSamplerTemplate;
|
||||||
|
import com.dfsek.terra.addons.image.config.noisesampler.DistanceTransformNoiseSamplerTemplate;
|
||||||
import com.dfsek.terra.addons.image.image.Image;
|
import com.dfsek.terra.addons.image.image.Image;
|
||||||
import com.dfsek.terra.addons.image.operator.DistanceTransform;
|
import com.dfsek.terra.addons.image.operator.DistanceTransform;
|
||||||
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
|
||||||
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
||||||
import com.dfsek.terra.api.Platform;
|
import com.dfsek.terra.api.Platform;
|
||||||
import com.dfsek.terra.api.addon.BaseAddon;
|
import com.dfsek.terra.api.addon.BaseAddon;
|
||||||
|
|||||||
+1
-1
@@ -1,8 +1,8 @@
|
|||||||
package com.dfsek.terra.addons.image.colorsampler.image;
|
package com.dfsek.terra.addons.image.colorsampler.image;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.image.image.Image;
|
|
||||||
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
||||||
import com.dfsek.terra.addons.image.colorsampler.image.transform.ImageTransformation;
|
import com.dfsek.terra.addons.image.colorsampler.image.transform.ImageTransformation;
|
||||||
|
import com.dfsek.terra.addons.image.image.Image;
|
||||||
|
|
||||||
|
|
||||||
public class SingleImageColorSampler implements ColorSampler {
|
public class SingleImageColorSampler implements ColorSampler {
|
||||||
|
|||||||
+2
-4
@@ -1,10 +1,8 @@
|
|||||||
package com.dfsek.terra.addons.image.colorsampler.image;
|
package com.dfsek.terra.addons.image.colorsampler.image;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.image.image.Image;
|
|
||||||
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
||||||
import com.dfsek.terra.addons.image.colorsampler.image.transform.ImageTransformation;
|
import com.dfsek.terra.addons.image.colorsampler.image.transform.ImageTransformation;
|
||||||
|
import com.dfsek.terra.addons.image.image.Image;
|
||||||
|
|
||||||
|
|
||||||
public class TileImageColorSampler implements ColorSampler {
|
public class TileImageColorSampler implements ColorSampler {
|
||||||
@@ -22,6 +20,6 @@ public class TileImageColorSampler implements ColorSampler {
|
|||||||
public int apply(int x, int z) {
|
public int apply(int x, int z) {
|
||||||
x = transformation.transformX(image, x);
|
x = transformation.transformX(image, x);
|
||||||
z = transformation.transformZ(image, z);
|
z = transformation.transformZ(image, z);
|
||||||
return image.getRGB(FastMath.floorMod(x, image.getWidth()), FastMath.floorMod(z, image.getHeight()));
|
return image.getRGB(Math.floorMod(x, image.getWidth()), Math.floorMod(z, image.getHeight()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-5
@@ -1,8 +1,7 @@
|
|||||||
package com.dfsek.terra.addons.image.colorsampler.mutate;
|
package com.dfsek.terra.addons.image.colorsampler.mutate;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
||||||
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
public class RotateColorSampler implements ColorSampler {
|
public class RotateColorSampler implements ColorSampler {
|
||||||
|
|
||||||
@@ -29,7 +28,7 @@ public class RotateColorSampler implements ColorSampler {
|
|||||||
else
|
else
|
||||||
rotationMethod = RotationMethod.RAD_ANY;
|
rotationMethod = RotationMethod.RAD_ANY;
|
||||||
|
|
||||||
this.radians = FastMath.toRadians(degrees);
|
this.radians = Math.toRadians(degrees);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -39,14 +38,14 @@ public class RotateColorSampler implements ColorSampler {
|
|||||||
case DEG_90 -> -z;
|
case DEG_90 -> -z;
|
||||||
case DEG_180 -> -x;
|
case DEG_180 -> -x;
|
||||||
case DEG_270 -> z;
|
case DEG_270 -> z;
|
||||||
case RAD_ANY -> (int) (x * FastMath.cos(radians) - z * FastMath.sin(radians));
|
case RAD_ANY -> (int) (x * MathUtil.cos(radians) - z * MathUtil.sin(radians));
|
||||||
};
|
};
|
||||||
int rz = switch(rotationMethod) {
|
int rz = switch(rotationMethod) {
|
||||||
case DEG_0 -> z;
|
case DEG_0 -> z;
|
||||||
case DEG_90 -> x;
|
case DEG_90 -> x;
|
||||||
case DEG_180 -> -z;
|
case DEG_180 -> -z;
|
||||||
case DEG_270 -> -x;
|
case DEG_270 -> -x;
|
||||||
case RAD_ANY -> (int) (z * FastMath.cos(radians) + x * FastMath.sin(radians));
|
case RAD_ANY -> (int) (z * MathUtil.cos(radians) + x * MathUtil.sin(radians));
|
||||||
};
|
};
|
||||||
return sampler.apply(rx, rz);
|
return sampler.apply(rx, rz);
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -4,9 +4,9 @@ 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.annotations.Value;
|
||||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.image.image.Image;
|
|
||||||
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
||||||
import com.dfsek.terra.addons.image.colorsampler.image.transform.Alignment;
|
import com.dfsek.terra.addons.image.colorsampler.image.transform.Alignment;
|
||||||
|
import com.dfsek.terra.addons.image.image.Image;
|
||||||
|
|
||||||
|
|
||||||
public abstract class ImageColorSamplerTemplate implements ObjectTemplate<ColorSampler> {
|
public abstract class ImageColorSamplerTemplate implements ObjectTemplate<ColorSampler> {
|
||||||
|
|||||||
+2
-3
@@ -4,8 +4,7 @@ import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
|||||||
import com.dfsek.terra.addons.image.util.ColorUtil;
|
import com.dfsek.terra.addons.image.util.ColorUtil;
|
||||||
import com.dfsek.terra.addons.image.util.ColorUtil.Channel;
|
import com.dfsek.terra.addons.image.util.ColorUtil.Channel;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
import static com.dfsek.terra.addons.image.util.MathUtil.lerp;
|
|
||||||
|
|
||||||
|
|
||||||
public class ChannelNoiseSampler implements NoiseSampler {
|
public class ChannelNoiseSampler implements NoiseSampler {
|
||||||
@@ -30,7 +29,7 @@ public class ChannelNoiseSampler implements NoiseSampler {
|
|||||||
int sample = colorSampler.apply((int) x, (int) y);
|
int sample = colorSampler.apply((int) x, (int) y);
|
||||||
int premultiplied = premultiply ? ColorUtil.premultiply(sample) : sample;
|
int premultiplied = premultiply ? ColorUtil.premultiply(sample) : sample;
|
||||||
double channelValue = channel.from(premultiplied);
|
double channelValue = channel.from(premultiplied);
|
||||||
return normalize ? lerp(channelValue, 0, -1, 255, 1) : channelValue;
|
return normalize ? MathUtil.linearMap(channelValue, 0, -1, 255, 1) : channelValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+10
-13
@@ -1,13 +1,10 @@
|
|||||||
package com.dfsek.terra.addons.image.operator;
|
package com.dfsek.terra.addons.image.operator;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.image.image.Image;
|
import com.dfsek.terra.addons.image.image.Image;
|
||||||
import com.dfsek.terra.addons.image.util.ColorUtil;
|
import com.dfsek.terra.addons.image.util.ColorUtil;
|
||||||
import com.dfsek.terra.addons.image.util.ColorUtil.Channel;
|
import com.dfsek.terra.addons.image.util.ColorUtil.Channel;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
import static com.dfsek.terra.addons.image.util.MathUtil.lerp;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -115,7 +112,7 @@ public class DistanceTransform {
|
|||||||
row[x] = d[x][y];
|
row[x] = d[x][y];
|
||||||
row = calculateDistance1D(row);
|
row = calculateDistance1D(row);
|
||||||
for(int x = 0; x < f[0].length; x++) {
|
for(int x = 0; x < f[0].length; x++) {
|
||||||
d[x][y] = FastMath.sqrt(row[x]);
|
d[x][y] = Math.sqrt(row[x]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return d;
|
return d;
|
||||||
@@ -130,10 +127,10 @@ public class DistanceTransform {
|
|||||||
z[0] = Integer.MIN_VALUE;
|
z[0] = Integer.MIN_VALUE;
|
||||||
z[1] = Integer.MAX_VALUE;
|
z[1] = Integer.MAX_VALUE;
|
||||||
for(int q = 1; q <= f.length-1; q++) {
|
for(int q = 1; q <= f.length-1; q++) {
|
||||||
double s = ((f[q]+FastMath.pow2(q))-(f[v[k]]+FastMath.pow2(v[k])))/(2*q-2*v[k]);
|
double s = ((f[q]+Math.pow(q, 2))-(f[v[k]]+Math.pow(v[k], 2)))/(2*q-2*v[k]);
|
||||||
while (s <= z[k]) {
|
while (s <= z[k]) {
|
||||||
k--;
|
k--;
|
||||||
s = ((f[q]+FastMath.pow2(q))-(f[v[k]]+FastMath.pow2(v[k])))/(2*q-2*v[k]);
|
s = ((f[q]+Math.pow(q, 2))-(f[v[k]]+Math.pow(v[k], 2)))/(2*q-2*v[k]);
|
||||||
}
|
}
|
||||||
k++;
|
k++;
|
||||||
v[k] = q;
|
v[k] = q;
|
||||||
@@ -145,7 +142,7 @@ public class DistanceTransform {
|
|||||||
for(int q = 0; q <= f.length-1; q++) {
|
for(int q = 0; q <= f.length-1; q++) {
|
||||||
while(z[k+1] < q)
|
while(z[k+1] < q)
|
||||||
k++;
|
k++;
|
||||||
d[q] = FastMath.pow2(q-v[k]) + f[v[k]];
|
d[q] = Math.pow(q-v[k], 2) + f[v[k]];
|
||||||
}
|
}
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
@@ -159,16 +156,16 @@ public class DistanceTransform {
|
|||||||
double d = distances[x][y];
|
double d = distances[x][y];
|
||||||
distances[x][y] = switch(normalization) {
|
distances[x][y] = switch(normalization) {
|
||||||
case None -> distances[x][y];
|
case None -> distances[x][y];
|
||||||
case Linear -> lerp(d, minDistance, -1, maxDistance, 1);
|
case Linear -> MathUtil.linearMap(d, minDistance, -1, maxDistance, 1);
|
||||||
case SmoothPreserveZero -> {
|
case SmoothPreserveZero -> {
|
||||||
if(minDistance > 0 || maxDistance < 0) {
|
if(minDistance > 0 || maxDistance < 0) {
|
||||||
// Can't preserve zero if it is not contained in range so just lerp
|
// Can't preserve zero if it is not contained in range so just lerp
|
||||||
yield lerp(distances[x][y], minDistance, -1, maxDistance, 1);
|
yield MathUtil.linearMap(distances[x][y], minDistance, -1, maxDistance, 1);
|
||||||
} else {
|
} else {
|
||||||
if(d > 0) {
|
if(d > 0) {
|
||||||
yield FastMath.pow2(d/maxDistance);
|
yield Math.pow(d/maxDistance, 2);
|
||||||
} else if(d < 0) {
|
} else if(d < 0) {
|
||||||
yield -FastMath.pow2(d/minDistance);
|
yield -Math.pow(d/minDistance, 2);
|
||||||
} else {
|
} else {
|
||||||
yield 0;
|
yield 0;
|
||||||
}
|
}
|
||||||
@@ -231,7 +228,7 @@ public class DistanceTransform {
|
|||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y) {
|
||||||
if(x<0 || y<0 || x>=transform.width || y>=transform.height) return transform.minDistance;
|
if(x<0 || y<0 || x>=transform.width || y>=transform.height) return transform.minDistance;
|
||||||
return transform.distances[FastMath.floorToInt(x)][FastMath.floorToInt(y)];
|
return transform.distances[(int) Math.floor(x)][(int) Math.floor(y)];
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+3
-6
@@ -1,8 +1,5 @@
|
|||||||
package com.dfsek.terra.addons.image.util;
|
package com.dfsek.terra.addons.image.util;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility class for manipulating 8 bit ARGB colors
|
* Utility class for manipulating 8 bit ARGB colors
|
||||||
*/
|
*/
|
||||||
@@ -11,9 +8,9 @@ public class ColorUtil {
|
|||||||
private ColorUtil() {}
|
private ColorUtil() {}
|
||||||
|
|
||||||
public static int distance(int a, int b) {
|
public static int distance(int a, int b) {
|
||||||
return FastMath.abs(getRed(a) - getRed(b)) +
|
return Math.abs(getRed(a) - getRed(b)) +
|
||||||
FastMath.abs(getGreen(a) - getGreen(b)) +
|
Math.abs(getGreen(a) - getGreen(b)) +
|
||||||
FastMath.abs(getBlue(a) - getBlue(b));
|
Math.abs(getBlue(a) - getBlue(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
-9
@@ -1,9 +0,0 @@
|
|||||||
package com.dfsek.terra.addons.image.util;
|
|
||||||
|
|
||||||
public class MathUtil {
|
|
||||||
private MathUtil() {}
|
|
||||||
|
|
||||||
public static double lerp(double x, double x1, double y1, double x2, double y2) {
|
|
||||||
return (((y1-y2)*(x-x1))/(x1-x2))+y1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,11 +5,4 @@ version = version("1.1.0")
|
|||||||
dependencies {
|
dependencies {
|
||||||
api("commons-io:commons-io:2.7")
|
api("commons-io:commons-io:2.7")
|
||||||
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
compileOnlyApi(project(":common:addons:manifest-addon-loader"))
|
||||||
implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama)
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.named<ShadowJar>("shadowJar") {
|
|
||||||
relocate("org.apache.commons", "com.dfsek.terra.addons.terrascript.lib.commons")
|
|
||||||
relocate("net.jafama", "com.dfsek.terra.addons.terrascript.lib.jafama")
|
|
||||||
}
|
}
|
||||||
+3
-5
@@ -1,8 +1,6 @@
|
|||||||
package com.dfsek.terra.addons.terrascript.parser.lang;
|
package com.dfsek.terra.addons.terrascript.parser.lang;
|
||||||
|
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@@ -102,21 +100,21 @@ public class Scope {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void updateBoolSize(int size) {
|
private void updateBoolSize(int size) {
|
||||||
this.boolSize = FastMath.max(boolSize, size);
|
this.boolSize = Math.max(boolSize, size);
|
||||||
if(parent != null) {
|
if(parent != null) {
|
||||||
parent.updateBoolSize(size);
|
parent.updateBoolSize(size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateNumSize(int size) {
|
private void updateNumSize(int size) {
|
||||||
this.numSize = FastMath.max(numSize, size);
|
this.numSize = Math.max(numSize, size);
|
||||||
if(parent != null) {
|
if(parent != null) {
|
||||||
parent.updateNumSize(size);
|
parent.updateNumSize(size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateStrSize(int size) {
|
private void updateStrSize(int size) {
|
||||||
this.strSize = FastMath.max(strSize, size);
|
this.strSize = Math.max(strSize, size);
|
||||||
if(parent != null) {
|
if(parent != null) {
|
||||||
parent.updateStrSize(size);
|
parent.updateStrSize(size);
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-3
@@ -7,8 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.terrascript.parser.lang.operations.statements;
|
package com.dfsek.terra.addons.terrascript.parser.lang.operations.statements;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
|
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
|
||||||
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable;
|
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable;
|
||||||
import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
|
import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
|
||||||
@@ -40,7 +38,7 @@ public class EqualsStatement extends BinaryOperation<Object, Boolean> {
|
|||||||
Object leftValue = left.apply(implementationArguments, scope);
|
Object leftValue = left.apply(implementationArguments, scope);
|
||||||
Object rightValue = right.apply(implementationArguments, scope);
|
Object rightValue = right.apply(implementationArguments, scope);
|
||||||
if(leftValue instanceof Number l && rightValue instanceof Number r) {
|
if(leftValue instanceof Number l && rightValue instanceof Number r) {
|
||||||
return FastMath.abs(l.doubleValue() - r.doubleValue()) <= EPSILON;
|
return Math.abs(l.doubleValue() - r.doubleValue()) <= EPSILON;
|
||||||
}
|
}
|
||||||
|
|
||||||
return leftValue.equals(rightValue);
|
return leftValue.equals(rightValue);
|
||||||
|
|||||||
+1
-3
@@ -7,8 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.terrascript.parser.lang.operations.statements;
|
package com.dfsek.terra.addons.terrascript.parser.lang.operations.statements;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
|
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
|
||||||
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable;
|
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable;
|
||||||
import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
|
import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
|
||||||
@@ -33,7 +31,7 @@ public class NotEqualsStatement extends BinaryOperation<Object, Boolean> {
|
|||||||
Object leftValue = left.apply(implementationArguments, scope);
|
Object leftValue = left.apply(implementationArguments, scope);
|
||||||
Object rightValue = right.apply(implementationArguments, scope);
|
Object rightValue = right.apply(implementationArguments, scope);
|
||||||
if(leftValue instanceof Number l && rightValue instanceof Number r) {
|
if(leftValue instanceof Number l && rightValue instanceof Number r) {
|
||||||
return FastMath.abs(l.doubleValue() - r.doubleValue()) > EPSILON;
|
return Math.abs(l.doubleValue() - r.doubleValue()) > EPSILON;
|
||||||
}
|
}
|
||||||
|
|
||||||
return !leftValue.equals(rightValue);
|
return !leftValue.equals(rightValue);
|
||||||
|
|||||||
+17
-17
@@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.terrascript.script;
|
package com.dfsek.terra.addons.terrascript.script;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@@ -44,6 +43,7 @@ import com.dfsek.terra.api.registry.key.Keyed;
|
|||||||
import com.dfsek.terra.api.registry.key.RegistryKey;
|
import com.dfsek.terra.api.registry.key.RegistryKey;
|
||||||
import com.dfsek.terra.api.structure.LootTable;
|
import com.dfsek.terra.api.structure.LootTable;
|
||||||
import com.dfsek.terra.api.structure.Structure;
|
import com.dfsek.terra.api.structure.Structure;
|
||||||
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
import com.dfsek.terra.api.util.Rotation;
|
import com.dfsek.terra.api.util.Rotation;
|
||||||
import com.dfsek.terra.api.util.vector.Vector3Int;
|
import com.dfsek.terra.api.util.vector.Vector3Int;
|
||||||
import com.dfsek.terra.api.world.WritableWorld;
|
import com.dfsek.terra.api.world.WritableWorld;
|
||||||
@@ -100,25 +100,25 @@ public class StructureScript implements Structure, Keyed<StructureScript> {
|
|||||||
Returnable.ReturnType.NUMBER))
|
Returnable.ReturnType.NUMBER))
|
||||||
.registerFunction("print",
|
.registerFunction("print",
|
||||||
new UnaryStringFunctionBuilder(string -> LOGGER.info("[TerraScript:{}] {}", id, string)))
|
new UnaryStringFunctionBuilder(string -> LOGGER.info("[TerraScript:{}] {}", id, string)))
|
||||||
.registerFunction("abs", new UnaryNumberFunctionBuilder(number -> FastMath.abs(number.doubleValue())))
|
.registerFunction("abs", new UnaryNumberFunctionBuilder(number -> Math.abs(number.doubleValue())))
|
||||||
.registerFunction("pow2", new UnaryNumberFunctionBuilder(number -> FastMath.pow2(number.doubleValue())))
|
.registerFunction("pow2", new UnaryNumberFunctionBuilder(number -> Math.pow(number.doubleValue(), 2)))
|
||||||
.registerFunction("pow", new BinaryNumberFunctionBuilder(
|
.registerFunction("pow", new BinaryNumberFunctionBuilder(
|
||||||
(number, number2) -> FastMath.pow(number.doubleValue(), number2.doubleValue())))
|
(number, number2) -> Math.pow(number.doubleValue(), number2.doubleValue())))
|
||||||
.registerFunction("sqrt", new UnaryNumberFunctionBuilder(number -> FastMath.sqrt(number.doubleValue())))
|
.registerFunction("sqrt", new UnaryNumberFunctionBuilder(number -> Math.sqrt(number.doubleValue())))
|
||||||
.registerFunction("floor", new UnaryNumberFunctionBuilder(number -> FastMath.floor(number.doubleValue())))
|
.registerFunction("floor", new UnaryNumberFunctionBuilder(number -> Math.floor(number.doubleValue())))
|
||||||
.registerFunction("ceil", new UnaryNumberFunctionBuilder(number -> FastMath.ceil(number.doubleValue())))
|
.registerFunction("ceil", new UnaryNumberFunctionBuilder(number -> Math.ceil(number.doubleValue())))
|
||||||
.registerFunction("log", new UnaryNumberFunctionBuilder(number -> FastMath.log(number.doubleValue())))
|
.registerFunction("log", new UnaryNumberFunctionBuilder(number -> Math.log(number.doubleValue())))
|
||||||
.registerFunction("round", new UnaryNumberFunctionBuilder(number -> FastMath.round(number.doubleValue())))
|
.registerFunction("round", new UnaryNumberFunctionBuilder(number -> Math.round(number.doubleValue())))
|
||||||
.registerFunction("sin", new UnaryNumberFunctionBuilder(number -> FastMath.sin(number.doubleValue())))
|
.registerFunction("sin", new UnaryNumberFunctionBuilder(number -> MathUtil.sin(number.doubleValue())))
|
||||||
.registerFunction("cos", new UnaryNumberFunctionBuilder(number -> FastMath.cos(number.doubleValue())))
|
.registerFunction("cos", new UnaryNumberFunctionBuilder(number -> MathUtil.cos(number.doubleValue())))
|
||||||
.registerFunction("tan", new UnaryNumberFunctionBuilder(number -> FastMath.tan(number.doubleValue())))
|
.registerFunction("tan", new UnaryNumberFunctionBuilder(number -> Math.tan(number.doubleValue())))
|
||||||
.registerFunction("asin", new UnaryNumberFunctionBuilder(number -> FastMath.asin(number.doubleValue())))
|
.registerFunction("asin", new UnaryNumberFunctionBuilder(number -> Math.asin(number.doubleValue())))
|
||||||
.registerFunction("acos", new UnaryNumberFunctionBuilder(number -> FastMath.acos(number.doubleValue())))
|
.registerFunction("acos", new UnaryNumberFunctionBuilder(number -> Math.acos(number.doubleValue())))
|
||||||
.registerFunction("atan", new UnaryNumberFunctionBuilder(number -> FastMath.atan(number.doubleValue())))
|
.registerFunction("atan", new UnaryNumberFunctionBuilder(number -> Math.atan(number.doubleValue())))
|
||||||
.registerFunction("max", new BinaryNumberFunctionBuilder(
|
.registerFunction("max", new BinaryNumberFunctionBuilder(
|
||||||
(number, number2) -> FastMath.max(number.doubleValue(), number2.doubleValue())))
|
(number, number2) -> Math.max(number.doubleValue(), number2.doubleValue())))
|
||||||
.registerFunction("min", new BinaryNumberFunctionBuilder(
|
.registerFunction("min", new BinaryNumberFunctionBuilder(
|
||||||
(number, number2) -> FastMath.min(number.doubleValue(), number2.doubleValue())));
|
(number, number2) -> Math.min(number.doubleValue(), number2.doubleValue())));
|
||||||
|
|
||||||
if(!platform.getTerraConfig().isDebugScript()) {
|
if(!platform.getTerraConfig().isDebugScript()) {
|
||||||
parser.ignoreFunction("debugBlock");
|
parser.ignoreFunction("debugBlock");
|
||||||
|
|||||||
+2
-4
@@ -7,8 +7,6 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.terrascript.script.functions;
|
package com.dfsek.terra.addons.terrascript.script.functions;
|
||||||
|
|
||||||
import net.jafama.FastMath;
|
|
||||||
|
|
||||||
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
|
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
|
||||||
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable;
|
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable;
|
||||||
import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
|
import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
|
||||||
@@ -48,9 +46,9 @@ public class BiomeFunction implements Function<String> {
|
|||||||
return grid.getBiome(arguments.getOrigin()
|
return grid.getBiome(arguments.getOrigin()
|
||||||
.toVector3()
|
.toVector3()
|
||||||
.mutable()
|
.mutable()
|
||||||
.add(Vector3.of(FastMath.roundToInt(xz.getX()),
|
.add(Vector3.of((int) Math.round(xz.getX()),
|
||||||
y.apply(implementationArguments, scope).intValue(),
|
y.apply(implementationArguments, scope).intValue(),
|
||||||
FastMath.roundToInt(xz.getZ()))).immutable(), arguments.getWorld().getSeed()).getID();
|
(int) Math.round(xz.getZ()))).immutable(), arguments.getWorld().getSeed()).getID();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user