Compare commits

...

21 Commits

Author SHA1 Message Date
Zoë Gidiere 18094f511a Noise context api 2023-10-08 15:58:59 -06:00
Zoë Gidiere 6d67a0747d Math.pow(x, -1) seems to be faster than 1/x on my machine 2023-10-08 01:32:43 -06:00
Zoë Gidiere 2144da5466 more opt and fix bug 2023-10-08 01:14:11 -06:00
Zoë Gidiere be1a09b97a actually a pretty significant uplift 2023-10-07 23:19:21 -06:00
Zoë Gidiere dcddc0504e detect fma 2023-10-07 22:44:19 -06:00
Zoë Gidiere f384d09376 yet another micro opt 2023-10-07 22:11:28 -06:00
Zoë Gidiere 6fd72b8f06 another one 2023-10-07 21:21:34 -06:00
Zoë Gidiere 1f8d2100ff another micro opt 2023-10-07 21:01:49 -06:00
Zoë Gidiere 29e5b9f3ff Some opts 2023-10-07 18:23:36 -06:00
Zoë Gidiere 2f1b8690ff oops accidentally left some experimental changes 2023-10-07 14:14:04 -06:00
Zoë Gidiere 3d571d4bf2 Remove FastMath
hotspot has intrinsics for almost everything we use it for
2023-10-07 14:10:21 -06:00
Zoë Gidiere 41b8a9fa18 micro div opt 2023-10-06 00:32:42 -06:00
Zoë Gidiere aab24c4303 forgot you can add negative values 2023-10-05 22:09:45 -06:00
Zoë Gidiere 6d690d788b fma 2023-10-05 22:00:10 -06:00
Zoë Gidiere eb2468c8a5 tweak 2023-10-05 21:52:04 -06:00
Zoë Gidiere 4983e559b3 minor sdf opts 2023-10-05 21:43:50 -06:00
Zoë Gidiere 8fba3f9e60 flatten array 2023-10-05 20:47:52 -06:00
Astrash 9444f9236d Replace numbers with constants 2023-10-06 12:54:26 +11:00
Astrash 809be3cb8f Hopefully fix artifacting 2023-10-06 11:49:02 +11:00
Astrash d189ce832b Fix NaN 2023-10-06 10:10:12 +11:00
Astrash 0ebbb62b40 Partial pseudoerosion implementation
This does not work fully, and produces some artifacts.
2023-10-06 09:51:00 +11:00
166 changed files with 1212 additions and 820 deletions
+1 -1
View File
@@ -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") }
}
@@ -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;
@@ -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") }
}
@@ -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")
} }
@@ -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;
@@ -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,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,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 {
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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) {
@@ -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")
}
@@ -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")
} }
@@ -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;
@@ -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)
@@ -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;
@@ -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);
} }
@@ -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);
@@ -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);
} }
} }
@@ -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);
} }
@@ -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")
}
@@ -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")
} }
@@ -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")
}
@@ -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));
} }
@@ -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()) {
@@ -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")
}
@@ -28,6 +28,7 @@ import com.dfsek.terra.addons.noise.config.templates.noise.ConstantNoiseTemplate
import com.dfsek.terra.addons.noise.config.templates.noise.DistanceSamplerTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.DistanceSamplerTemplate;
import com.dfsek.terra.addons.noise.config.templates.noise.ExpressionFunctionTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.ExpressionFunctionTemplate;
import com.dfsek.terra.addons.noise.config.templates.noise.GaborNoiseTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.GaborNoiseTemplate;
import com.dfsek.terra.addons.noise.config.templates.noise.PseudoErosionSamplerTemplate;
import com.dfsek.terra.addons.noise.config.templates.noise.SimpleNoiseTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.SimpleNoiseTemplate;
import com.dfsek.terra.addons.noise.config.templates.noise.fractal.BrownianMotionTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.fractal.BrownianMotionTemplate;
import com.dfsek.terra.addons.noise.config.templates.noise.fractal.PingPongTemplate; import com.dfsek.terra.addons.noise.config.templates.noise.fractal.PingPongTemplate;
@@ -123,6 +124,7 @@ public class NoiseAddon implements AddonInitializer {
noiseRegistry.register(addon.key("VALUE_CUBIC"), () -> new SimpleNoiseTemplate(ValueCubicSampler::new)); noiseRegistry.register(addon.key("VALUE_CUBIC"), () -> new SimpleNoiseTemplate(ValueCubicSampler::new));
noiseRegistry.register(addon.key("CELLULAR"), CellularNoiseTemplate::new); noiseRegistry.register(addon.key("CELLULAR"), CellularNoiseTemplate::new);
noiseRegistry.register(addon.key("PSEUDOEROSION"), PseudoErosionSamplerTemplate::new);
noiseRegistry.register(addon.key("WHITE_NOISE"), () -> new SimpleNoiseTemplate(WhiteNoiseSampler::new)); noiseRegistry.register(addon.key("WHITE_NOISE"), () -> new SimpleNoiseTemplate(WhiteNoiseSampler::new));
noiseRegistry.register(addon.key("POSITIVE_WHITE_NOISE"), () -> new SimpleNoiseTemplate(PositiveWhiteNoiseSampler::new)); noiseRegistry.register(addon.key("POSITIVE_WHITE_NOISE"), () -> new SimpleNoiseTemplate(PositiveWhiteNoiseSampler::new));
@@ -0,0 +1,49 @@
/*
* Copyright (c) 2020-2021 Polyhedral Development
*
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
* reference the LICENSE file in this module's root directory.
*/
package com.dfsek.terra.addons.noise.config.templates.noise;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate;
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.noise.NoiseSampler;
@SuppressWarnings("FieldMayBeFinal")
public class PseudoErosionSamplerTemplate extends SamplerTemplate<PseudoErosionSampler> {
@Value("frequency")
@Default
protected @Meta double frequency = 0.01d;
// protected @Meta double frequency = 0.02d;
@Value("salt")
@Default
protected @Meta long salt = 0;
@Value("jitter")
@Default
private @Meta double jitter = 1.0D;
@Value("lookup")
@Default
private @Meta NoiseSampler lookup = null;
@Override
public NoiseSampler get() {
if(lookup == null) {
OpenSimplex2Sampler lookup = new OpenSimplex2Sampler();
lookup.setFrequency(0.0005);
this.lookup = lookup;
}
return new PseudoErosionSampler(salt, frequency, lookup, jitter);
}
}
@@ -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> {
@@ -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;
@@ -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 {
@@ -74,11 +76,7 @@ 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
@@ -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);
} }
} }
@@ -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 {
@@ -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) {
@@ -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));
} }
} }
@@ -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,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() {}
@@ -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,
@@ -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);
} }
@@ -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;
@@ -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;
} }
} }
@@ -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);
} }
} }
@@ -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,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,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);
} }
} }
@@ -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);
}; };
} }
@@ -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;
} }
} }
@@ -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);
}; };
} }
@@ -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);
} }
} }
@@ -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);
} }
} }
@@ -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();
ArrayList<double[]> list = new ArrayList<>();
generateContext(seed, x, y, list, 0, contextRadius);
return getNoiseRaw(seed, x, y, list, 0, getContextRadius());
}
public abstract double getNoiseRaw(long seed, double x, double y, double z); 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);
} }
@@ -0,0 +1,404 @@
/*
* Copyright (c) 2020-2021 Polyhedral Development
*
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
* reference the LICENSE file in this module's root directory.
*/
package com.dfsek.terra.addons.noise.samplers.noise;
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_Y;
import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.hash;
/**
* Pseudo-erosion algorithm based on <a href="https://www.reddit.com/r/proceduralgeneration/comments/797fgw/iterative_pseudoerosion/">a reddit post</a>
* by user /u/YankeeMinstrel.
* <br>
* The algorithm works similarly to cellular/worley/voronoi noise. A grid of cells is established, where each cell contains a position with
* a random offset. Each cell connects to an adjacent candidate cell in its moore neighbourhood or itself, called the 'connected' cell.
* The connected cell is chosen by determining which candidate cell has the lowest value provided by passing the candidate coordinates into
* another 'lookup' noise function.
* 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.
*/
public class PseudoErosionSampler extends NoiseFunction {
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.3023380997d, 0, 0.565683137d, -0.8208298145d, -0.0790000257d, 0, 0.760049034d, -0.5555979497d, -0.3370999617d, 0,
0.3713945616d, 0.5011264475d, 0.7816254623d, 0, -0.1277062463d, -0.4254438999d, -0.8959289049d, 0, -0.2881560924d,
-0.5815838982d, 0.7607405838d, 0, 0.5849561111d, -0.662820239d, -0.4674352136d, 0, 0.3307171178d, 0.0391653737d, 0.94291689d, 0,
0.8712121778d, -0.4113374369d, -0.2679381538d, 0, 0.580981015d, 0.7021915846d, 0.4115677815d, 0, 0.503756873d, 0.6330056931d,
-0.5878203852d, 0, 0.4493712205d, 0.601390195d, 0.6606022552d, 0, -0.6878403724d, 0.09018890807d, -0.7202371714d, 0,
-0.5958956522d, -0.6469350577d, 0.475797649d, 0, -0.5127052122d, 0.1946921978d, -0.8361987284d, 0, -0.9911507142d,
-0.05410276466d, -0.1212153153d, 0, -0.2149721042d, 0.9720882117d, -0.09397607749d, 0, -0.7518650936d, -0.5428057603d,
0.3742469607d, 0, 0.5237068895d, 0.8516377189d, -0.02107817834d, 0, 0.6333504779d, 0.1926167129d, -0.7495104896d, 0,
-0.06788241606d, 0.3998305789d, 0.9140719259d, 0, -0.5538628599d, -0.4729896695d, -0.6852128902d, 0, -0.7261455366d,
-0.5911990757d, 0.3509933228d, 0, -0.9229274737d, -0.1782808786d, 0.3412049336d, 0, -0.6968815002d, 0.6511274338d,
0.3006480328d, 0, 0.9608044783d, -0.2098363234d, -0.1811724921d, 0, 0.06817146062d, -0.9743405129d, 0.2145069156d, 0,
-0.3577285196d, -0.6697087264d, -0.6507845481d, 0, -0.1868621131d, 0.7648617052d, -0.6164974636d, 0, -0.6541697588d,
0.3967914832d, 0.6439087246d, 0, 0.6993340405d, -0.6164538506d, 0.3618239211d, 0, -0.1546665739d, 0.6291283928d, 0.7617583057d,
0, -0.6841612949d, -0.2580482182d, -0.6821542638d, 0, 0.5383980957d, 0.4258654885d, 0.7271630328d, 0, -0.5026987823d,
-0.7939832935d, -0.3418836993d, 0, 0.3202971715d, 0.2834415347d, 0.9039195862d, 0, 0.8683227101d, -0.0003762656404d,
-0.4959995258d, 0, 0.791120031d, -0.08511045745d, 0.6057105799d, 0, -0.04011016052d, -0.4397248749d, 0.8972364289d, 0,
0.9145119872d, 0.3579346169d, -0.1885487608d, 0, -0.9612039066d, -0.2756484276d, 0.01024666929d, 0, 0.6510361721d,
-0.2877799159d, -0.7023778346d, 0, -0.2041786351d, 0.7365237271d, 0.644859585d, 0, -0.7718263711d, 0.3790626912d, 0.5104855816d,
0, -0.3060082741d, -0.7692987727d, 0.5608371729d, 0, 0.454007341d, -0.5024843065d, 0.7357899537d, 0, 0.4816795475d,
0.6021208291d, -0.6367380315d, 0, 0.6961980369d, -0.3222197429d, 0.641469197d, 0, -0.6532160499d, -0.6781148932d, 0.3368515753d,
0, 0.5089301236d, -0.6154662304d, -0.6018234363d, 0, -0.1635919754d, -0.9133604627d, -0.372840892d, 0, 0.52408019d,
-0.8437664109d, 0.1157505864d, 0, 0.5902587356d, 0.4983817807d, -0.6349883666d, 0, 0.5863227872d, 0.494764745d, 0.6414307729d,
0, 0.6779335087d, 0.2341345225d, 0.6968408593d, 0, 0.7177054546d, -0.6858979348d, 0.120178631d, 0, -0.5328819713d,
-0.5205125012d, 0.6671608058d, 0, -0.8654874251d, -0.0700727088d, -0.4960053754d, 0, -0.2861810166d, 0.7952089234d,
0.5345495242d, 0, -0.04849529634d, 0.9810836427d, -0.1874115585d, 0, -0.6358521667d, 0.6058348682d, 0.4781800233d, 0,
0.6254794696d, -0.2861619734d, 0.7258696564d, 0, -0.2585259868d, 0.5061949264d, -0.8227581726d, 0, 0.02136306781d,
0.5064016808d, -0.8620330371d, 0, 0.200111773d, 0.8599263484d, 0.4695550591d, 0, 0.4743561372d, 0.6014985084d, -0.6427953014d,
0, 0.6622993731d, -0.5202474575d, -0.5391679918d, 0, 0.08084972818d, -0.6532720452d, 0.7527940996d, 0, -0.6893687501d,
0.0592860349d, 0.7219805347d, 0, -0.1121887082d, -0.9673185067d, 0.2273952515d, 0, 0.7344116094d, 0.5979668656d, -0.3210532909d,
0, 0.5789393465d, -0.2488849713d, 0.7764570201d, 0, 0.6988182827d, 0.3557169806d, -0.6205791146d, 0, -0.8636845529d,
-0.2748771249d, -0.4224826141d, 0, -0.4247027957d, -0.4640880967d, 0.777335046d, 0, 0.5257722489d, -0.8427017621d,
0.1158329937d, 0, 0.9343830603d, 0.316302472d, -0.1639543925d, 0, -0.1016836419d, -0.8057303073d, -0.5834887393d, 0,
-0.6529238969d, 0.50602126d, -0.5635892736d, 0, -0.2465286165d, -0.9668205684d, -0.06694497494d, 0, -0.9776897119d,
-0.2099250524d, -0.007368825344d, 0, 0.7736893337d, 0.5734244712d, 0.2694238123d, 0, -0.6095087895d, 0.4995678998d,
0.6155736747d, 0, 0.5794535482d, 0.7434546771d, 0.3339292269d, 0, -0.8226211154d, 0.08142581855d, 0.5627293636d, 0,
-0.510385483d, 0.4703667658d, 0.7199039967d, 0, -0.5764971849d, -0.07231656274d, -0.8138926898d, 0, 0.7250628871d,
0.3949971505d, -0.5641463116d, 0, -0.1525424005d, 0.4860840828d, -0.8604958341d, 0, -0.5550976208d, -0.4957820792d,
0.667882296d, 0, -0.1883614327d, 0.9145869398d, 0.357841725d, 0, 0.7625556724d, -0.5414408243d, -0.3540489801d, 0,
-0.5870231946d, -0.3226498013d, -0.7424963803d, 0, 0.3051124198d, 0.2262544068d, -0.9250488391d, 0, 0.6379576059d, 0.577242424d,
-0.5097070502d, 0, -0.5966775796d, 0.1454852398d, -0.7891830656d, 0, -0.658330573d, 0.6555487542d, -0.3699414651d, 0,
0.7434892426d, 0.2351084581d, 0.6260573129d, 0, 0.5562114096d, 0.8264360377d, -0.0873632843d, 0, -0.3028940016d, -0.8251527185d,
0.4768419182d, 0, 0.1129343818d, -0.985888439d, -0.1235710781d, 0, 0.5937652891d, -0.5896813806d, 0.5474656618d, 0,
0.6757964092d, -0.5835758614d, -0.4502648413d, 0, 0.7242302609d, -0.1152719764d, 0.6798550586d, 0, -0.9511914166d,
0.0753623979d, -0.2992580792d, 0, 0.2539470961d, -0.1886339355d, 0.9486454084d, 0, 0.571433621d, -0.1679450851d, -0.8032795685d,
0, -0.06778234979d, 0.3978269256d, 0.9149531629d, 0, 0.6074972649d, 0.733060024d, -0.3058922593d, 0, -0.5435478392d,
0.1675822484d, 0.8224791405d, 0, -0.5876678086d, -0.3380045064d, -0.7351186982d, 0, -0.7967562402d, 0.04097822706d,
-0.6029098428d, 0, -0.1996350917d, 0.8706294745d, 0.4496111079d, 0, -0.02787660336d, -0.9106232682d, -0.4122962022d, 0,
-0.7797625996d, -0.6257634692d, 0.01975775581d, 0, -0.5211232846d, 0.7401644346d, -0.4249554471d, 0, 0.8575424857d,
0.4053272873d, -0.3167501783d, 0, 0.1045223322d, 0.8390195772d, -0.5339674439d, 0, 0.3501822831d, 0.9242524096d, -0.1520850155d,
0, 0.1987849858d, 0.07647613266d, 0.9770547224d, 0, 0.7845996363d, 0.6066256811d, -0.1280964233d, 0, 0.09006737436d,
-0.9750989929d, -0.2026569073d, 0, -0.8274343547d, -0.542299559d, 0.1458203587d, 0, -0.3485797732d, -0.415802277d, 0.840000362d,
0, -0.2471778936d, -0.7304819962d, -0.6366310879d, 0, -0.3700154943d, 0.8577948156d, 0.3567584454d, 0, 0.5913394901d,
-0.548311967d, -0.5913303597d, 0, 0.1204873514d, -0.7626472379d, -0.6354935001d, 0, 0.616959265d, 0.03079647928d, 0.7863922953d,
0, 0.1258156836d, -0.6640829889d, -0.7369967419d, 0, -0.6477565124d, -0.1740147258d, -0.7417077429d, 0, 0.6217889313d,
-0.7804430448d, -0.06547655076d, 0, 0.6589943422d, -0.6096987708d, 0.4404473475d, 0, -0.2689837504d, -0.6732403169d,
-0.6887635427d, 0, -0.3849775103d, 0.5676542638d, 0.7277093879d, 0, 0.5754444408d, 0.8110471154d, -0.1051963504d, 0,
0.9141593684d, 0.3832947817d, 0.131900567d, 0, -0.107925319d, 0.9245493968d, 0.3654593525d, 0, 0.377977089d, 0.3043148782d,
0.8743716458d, 0, -0.2142885215d, -0.8259286236d, 0.5214617324d, 0, 0.5802544474d, 0.4148098596d, -0.7008834116d, 0,
-0.1982660881d, 0.8567161266d, -0.4761596756d, 0, -0.03381553704d, 0.3773180787d, -0.9254661404d, 0, -0.6867922841d,
-0.6656597827d, 0.2919133642d, 0, 0.7731742607d, -0.2875793547d, -0.5652430251d, 0, -0.09655941928d, 0.9193708367d,
-0.3813575004d, 0, 0.2715702457d, -0.9577909544d, -0.09426605581d, 0, 0.2451015704d, -0.6917998565d, -0.6792188003d, 0,
0.977700782d, -0.1753855374d, 0.1155036542d, 0, -0.5224739938d, 0.8521606816d, 0.02903615945d, 0, -0.7734880599d,
-0.5261292347d, 0.3534179531d, 0, -0.7134492443d, -0.269547243d, 0.6467878011d, 0, 0.1644037271d, 0.5105846203d, -0.8439637196d,
0, 0.6494635788d, 0.05585611296d, 0.7583384168d, 0, -0.4711970882d, 0.5017280509d, -0.7254255765d, 0, -0.6335764307d,
-0.2381686273d, -0.7361091029d, 0, -0.9021533097d, -0.270947803d, -0.3357181763d, 0, -0.3793711033d, 0.872258117d,
0.3086152025d, 0, -0.6855598966d, -0.3250143309d, 0.6514394162d, 0, 0.2900942212d, -0.7799057743d, -0.5546100667d, 0,
-0.2098319339d, 0.85037073d, 0.4825351604d, 0, -0.4592603758d, 0.6598504336d, -0.5947077538d, 0, 0.8715945488d, 0.09616365406d,
-0.4807031248d, 0, -0.6776666319d, 0.7118504878d, -0.1844907016d, 0, 0.7044377633d, 0.312427597d, 0.637304036d, 0,
-0.7052318886d, -0.2401093292d, -0.6670798253d, 0, 0.081921007d, -0.7207336136d, -0.6883545647d, 0, -0.6993680906d,
-0.5875763221d, -0.4069869034d, 0, -0.1281454481d, 0.6419895885d, 0.7559286424d, 0, -0.6337388239d, -0.6785471501d,
-0.3714146849d, 0, 0.5565051903d, -0.2168887573d, -0.8020356851d, 0, -0.5791554484d, 0.7244372011d, -0.3738578718d, 0,
0.1175779076d, -0.7096451073d, 0.6946792478d, 0, -0.6134619607d, 0.1323631078d, 0.7785527795d, 0, 0.6984635305d,
-0.02980516237d, -0.715024719d, 0, 0.8318082963d, -0.3930171956d, 0.3919597455d, 0, 0.1469576422d, 0.05541651717d,
-0.9875892167d, 0, 0.708868575d, -0.2690503865d, 0.6520101478d, 0, 0.2726053183d, 0.67369766d, -0.68688995d, 0, -0.6591295371d,
0.3035458599d, -0.6880466294d, 0, 0.4815131379d, -0.7528270071d, 0.4487723203d, 0, 0.9430009463d, 0.1675647412d, -0.2875261255d,
0, 0.434802957d, 0.7695304522d, -0.4677277752d, 0, 0.3931996188d, 0.594473625d, 0.7014236729d, 0, 0.7254336655d, -0.603925654d,
0.3301814672d, 0, 0.7590235227d, -0.6506083235d, 0.02433313207d, 0, -0.8552768592d, -0.3430042733d, 0.3883935666d, 0,
-0.6139746835d, 0.6981725247d, 0.3682257648d, 0, -0.7465905486d, -0.5752009504d, 0.3342849376d, 0, 0.5730065677d, 0.810555537d,
-0.1210916791d, 0, -0.9225877367d, -0.3475211012d, -0.167514036d, 0, -0.7105816789d, -0.4719692027d, -0.5218416899d, 0,
-0.08564609717d, 0.3583001386d, 0.929669703d, 0, -0.8279697606d, -0.2043157126d, 0.5222271202d, 0, 0.427944023d, 0.278165994d,
0.8599346446d, 0, 0.5399079671d, -0.7857120652d, -0.3019204161d, 0, 0.5678404253d, -0.5495413974d, -0.6128307303d, 0,
-0.9896071041d, 0.1365639107d, -0.04503418428d, 0, -0.6154342638d, -0.6440875597d, 0.4543037336d, 0, 0.1074204368d,
-0.7946340692d, 0.5975094525d, 0, -0.3595449969d, -0.8885529948d, 0.28495784d, 0, -0.2180405296d, 0.1529888965d, 0.9638738118d,
0, -0.7277432317d, -0.6164050508d, -0.3007234646d, 0, 0.7249729114d, -0.00669719484d, 0.6887448187d, 0, -0.5553659455d,
-0.5336586252d, 0.6377908264d, 0, 0.5137558015d, 0.7976208196d, -0.3160000073d, 0, -0.3794024848d, 0.9245608561d,
-0.03522751494d, 0, 0.8229248658d, 0.2745365933d, -0.4974176556d, 0, -0.5404114394d, 0.6091141441d, 0.5804613989d, 0,
0.8036581901d, -0.2703029469d, 0.5301601931d, 0, 0.6044318879d, 0.6832968393d, 0.4095943388d, 0, 0.06389988817d, 0.9658208605d,
-0.2512108074d, 0, 0.1087113286d, 0.7402471173d, -0.6634877936d, 0, -0.713427712d, -0.6926784018d, 0.1059128479d, 0,
0.6458897819d, -0.5724548511d, -0.5050958653d, 0, -0.6553931414d, 0.7381471625d, 0.159995615d, 0, 0.3910961323d, 0.9188871375d,
-0.05186755998d, 0, -0.4879022471d, -0.5904376907d, 0.6429111375d, 0, 0.6014790094d, 0.7707441366d, -0.2101820095d, 0,
-0.5677173047d, 0.7511360995d, 0.3368851762d, 0, 0.7858573506d, 0.226674665d, 0.5753666838d, 0, -0.4520345543d, -0.604222686d,
-0.6561857263d, 0, 0.002272116345d, 0.4132844051d, -0.9105991643d, 0, -0.5815751419d, -0.5162925989d, 0.6286591339d, 0,
-0.03703704785d, 0.8273785755d, 0.5604221175d, 0, -0.5119692504d, 0.7953543429d, -0.3244980058d, 0, -0.2682417366d,
-0.9572290247d, -0.1084387619d, 0, -0.2322482736d, -0.9679131102d, -0.09594243324d, 0, 0.3554328906d, -0.8881505545d,
0.2913006227d, 0, 0.7346520519d, -0.4371373164d, 0.5188422971d, 0, 0.9985120116d, 0.04659011161d, -0.02833944577d, 0,
-0.3727687496d, -0.9082481361d, 0.1900757285d, 0, 0.91737377d, -0.3483642108d, 0.1925298489d, 0, 0.2714911074d, 0.4147529736d,
-0.8684886582d, 0, 0.5131763485d, -0.7116334161d, 0.4798207128d, 0, -0.8737353606d, 0.18886992d, -0.4482350644d, 0,
0.8460043821d, -0.3725217914d, 0.3814499973d, 0, 0.8978727456d, -0.1780209141d, -0.4026575304d, 0, 0.2178065647d,
-0.9698322841d, -0.1094789531d, 0, -0.1518031304d, -0.7788918132d, -0.6085091231d, 0, -0.2600384876d, -0.4755398075d,
-0.8403819825d, 0, 0.572313509d, -0.7474340931d, -0.3373418503d, 0, -0.7174141009d, 0.1699017182d, -0.6756111411d, 0,
-0.684180784d, 0.02145707593d, -0.7289967412d, 0, -0.2007447902d, 0.06555605789d, -0.9774476623d, 0, -0.1148803697d,
-0.8044887315d, 0.5827524187d, 0, -0.7870349638d, 0.03447489231d, 0.6159443543d, 0, -0.2015596421d, 0.6859872284d,
0.6991389226d, 0, -0.08581082512d, -0.10920836d, -0.9903080513d, 0, 0.5532693395d, 0.7325250401d, -0.396610771d, 0,
-0.1842489331d, -0.9777375055d, -0.1004076743d, 0, 0.0775473789d, -0.9111505856d, 0.4047110257d, 0, 0.1399838409d,
0.7601631212d, -0.6344734459d, 0, 0.4484419361d, -0.845289248d, 0.2904925424d, 0
};
private static final double[] RAND_VECS_2D = {
-0.2700222198d, -0.9628540911d, 0.3863092627d, -0.9223693152d, 0.04444859006d, -0.999011673d, -0.5992523158d, -0.8005602176d,
-0.7819280288d, 0.6233687174d, 0.9464672271d, 0.3227999196d, -0.6514146797d, -0.7587218957d, 0.9378472289d, 0.347048376d,
-0.8497875957d, -0.5271252623d, -0.879042592d, 0.4767432447d, -0.892300288d, -0.4514423508d, -0.379844434d, -0.9250503802d,
-0.9951650832d, 0.0982163789d, 0.7724397808d, -0.6350880136d, 0.7573283322d, -0.6530343002d, -0.9928004525d, -0.119780055d,
-0.0532665713d, 0.9985803285d, 0.9754253726d, -0.2203300762d, -0.7665018163d, 0.6422421394d, 0.991636706d, 0.1290606184d,
-0.994696838d, 0.1028503788d, -0.5379205513d, -0.84299554d, 0.5022815471d, -0.8647041387d, 0.4559821461d, -0.8899889226d,
-0.8659131224d, -0.5001944266d, 0.0879458407d, -0.9961252577d, -0.5051684983d, 0.8630207346d, 0.7753185226d, -0.6315704146d,
-0.6921944612d, 0.7217110418d, -0.5191659449d, -0.8546734591d, 0.8978622882d, -0.4402764035d, -0.1706774107d, 0.9853269617d,
-0.9353430106d, -0.3537420705d, -0.9992404798d, 0.03896746794d, -0.2882064021d, -0.9575683108d, -0.9663811329d, 0.2571137995d,
-0.8759714238d, -0.4823630009d, -0.8303123018d, -0.5572983775d, 0.05110133755d, -0.9986934731d, -0.8558373281d, -0.5172450752d,
0.09887025282d, 0.9951003332d, 0.9189016087d, 0.3944867976d, -0.2439375892d, -0.9697909324d, -0.8121409387d, -0.5834613061d,
-0.9910431363d, 0.1335421355d, 0.8492423985d, -0.5280031709d, -0.9717838994d, -0.2358729591d, 0.9949457207d, 0.1004142068d,
0.6241065508d, -0.7813392434d, 0.662910307d, 0.7486988212d, -0.7197418176d, 0.6942418282d, -0.8143370775d, -0.5803922158d,
0.104521054d, -0.9945226741d, -0.1065926113d, -0.9943027784d, 0.445799684d, -0.8951327509d, 0.105547406d, 0.9944142724d,
-0.992790267d, 0.1198644477d, -0.8334366408d, 0.552615025d, 0.9115561563d, -0.4111755999d, 0.8285544909d, -0.5599084351d,
0.7217097654d, -0.6921957921d, 0.4940492677d, -0.8694339084d, -0.3652321272d, -0.9309164803d, -0.9696606758d, 0.2444548501d,
0.08925509731d, -0.996008799d, 0.5354071276d, -0.8445941083d, -0.1053576186d, 0.9944343981d, -0.9890284586d, 0.1477251101d,
0.004856104961d, 0.9999882091d, 0.9885598478d, 0.1508291331d, 0.9286129562d, -0.3710498316d, -0.5832393863d, -0.8123003252d,
0.3015207509d, 0.9534596146d, -0.9575110528d, 0.2883965738d, 0.9715802154d, -0.2367105511d, 0.229981792d, 0.9731949318d,
0.955763816d, -0.2941352207d, 0.740956116d, 0.6715534485d, -0.9971513787d, -0.07542630764d, 0.6905710663d, -0.7232645452d,
-0.290713703d, -0.9568100872d, 0.5912777791d, -0.8064679708d, -0.9454592212d, -0.325740481d, 0.6664455681d, 0.74555369d,
0.6236134912d, 0.7817328275d, 0.9126993851d, -0.4086316587d, -0.8191762011d, 0.5735419353d, -0.8812745759d, -0.4726046147d,
0.9953313627d, 0.09651672651d, 0.9855650846d, -0.1692969699d, -0.8495980887d, 0.5274306472d, 0.6174853946d, -0.7865823463d,
0.8508156371d, 0.52546432d, 0.9985032451d, -0.05469249926d, 0.1971371563d, -0.9803759185d, 0.6607855748d, -0.7505747292d,
-0.03097494063d, 0.9995201614d, -0.6731660801d, 0.739491331d, -0.7195018362d, -0.6944905383d, 0.9727511689d, 0.2318515979d,
0.9997059088d, -0.0242506907d, 0.4421787429d, -0.8969269532d, 0.9981350961d, -0.061043673d, -0.9173660799d, -0.3980445648d,
-0.8150056635d, -0.5794529907d, -0.8789331304d, 0.4769450202d, 0.0158605829d, 0.999874213d, -0.8095464474d, 0.5870558317d,
-0.9165898907d, -0.3998286786d, -0.8023542565d, 0.5968480938d, -0.5176737917d, 0.8555780767d, -0.8154407307d, -0.5788405779d,
0.4022010347d, -0.9155513791d, -0.9052556868d, -0.4248672045d, 0.7317445619d, 0.6815789728d, -0.5647632201d, -0.8252529947d,
-0.8403276335d, -0.5420788397d, -0.9314281527d, 0.363925262d, 0.5238198472d, 0.8518290719d, 0.7432803869d, -0.6689800195d,
-0.985371561d, -0.1704197369d, 0.4601468731d, 0.88784281d, 0.825855404d, 0.5638819483d, 0.6182366099d, 0.7859920446d,
0.8331502863d, -0.553046653d, 0.1500307506d, 0.9886813308d, -0.662330369d, -0.7492119075d, -0.668598664d, 0.743623444d,
0.7025606278d, 0.7116238924d, -0.5419389763d, -0.8404178401d, -0.3388616456d, 0.9408362159d, 0.8331530315d, 0.5530425174d,
-0.2989720662d, -0.9542618632d, 0.2638522993d, 0.9645630949d, 0.124108739d, -0.9922686234d, -0.7282649308d, -0.6852956957d,
0.6962500149d, 0.7177993569d, -0.9183535368d, 0.3957610156d, -0.6326102274d, -0.7744703352d, -0.9331891859d, -0.359385508d,
-0.1153779357d, -0.9933216659d, 0.9514974788d, -0.3076565421d, -0.08987977445d, -0.9959526224d, 0.6678496916d, 0.7442961705d,
0.7952400393d, -0.6062947138d, -0.6462007402d, -0.7631674805d, -0.2733598753d, 0.9619118351d, 0.9669590226d, -0.254931851d,
-0.9792894595d, 0.2024651934d, -0.5369502995d, -0.8436138784d, -0.270036471d, -0.9628500944d, -0.6400277131d, 0.7683518247d,
-0.7854537493d, -0.6189203566d, 0.06005905383d, -0.9981948257d, -0.02455770378d, 0.9996984141d, -0.65983623d, 0.751409442d,
-0.6253894466d, -0.7803127835d, -0.6210408851d, -0.7837781695d, 0.8348888491d, 0.5504185768d, -0.1592275245d, 0.9872419133d,
0.8367622488d, 0.5475663786d, -0.8675753916d, -0.4973056806d, -0.2022662628d, -0.9793305667d, 0.9399189937d, 0.3413975472d,
0.9877404807d, -0.1561049093d, -0.9034455656d, 0.4287028224d, 0.1269804218d, -0.9919052235d, -0.3819600854d, 0.924178821d,
0.9754625894d, 0.2201652486d, -0.3204015856d, -0.9472818081d, -0.9874760884d, 0.1577687387d, 0.02535348474d, -0.9996785487d,
0.4835130794d, -0.8753371362d, -0.2850799925d, -0.9585037287d, -0.06805516006d, -0.99768156d, -0.7885244045d, -0.6150034663d,
0.3185392127d, -0.9479096845d, 0.8880043089d, 0.4598351306d, 0.6476921488d, -0.7619021462d, 0.9820241299d, 0.1887554194d,
0.9357275128d, -0.3527237187d, -0.8894895414d, 0.4569555293d, 0.7922791302d, 0.6101588153d, 0.7483818261d, 0.6632681526d,
-0.7288929755d, -0.6846276581d, 0.8729032783d, -0.4878932944d, 0.8288345784d, 0.5594937369d, 0.08074567077d, 0.9967347374d,
0.9799148216d, -0.1994165048d, -0.580730673d, -0.8140957471d, -0.4700049791d, -0.8826637636d, 0.2409492979d, 0.9705377045d,
0.9437816757d, -0.3305694308d, -0.8927998638d, -0.4504535528d, -0.8069622304d, 0.5906030467d, 0.06258973166d, 0.9980393407d,
-0.9312597469d, 0.3643559849d, 0.5777449785d, 0.8162173362d, -0.3360095855d, -0.941858566d, 0.697932075d, -0.7161639607d,
-0.002008157227d, -0.9999979837d, -0.1827294312d, -0.9831632392d, -0.6523911722d, 0.7578824173d, -0.4302626911d, -0.9027037258d,
-0.9985126289d, -0.05452091251d, -0.01028102172d, -0.9999471489d, -0.4946071129d, 0.8691166802d, -0.2999350194d, 0.9539596344d,
0.8165471961d, 0.5772786819d, 0.2697460475d, 0.962931498d, -0.7306287391d, -0.6827749597d, -0.7590952064d, -0.6509796216d,
-0.907053853d, 0.4210146171d, -0.5104861064d, -0.8598860013d, 0.8613350597d, 0.5080373165d, 0.5007881595d, -0.8655698812d,
-0.654158152d, 0.7563577938d, -0.8382755311d, -0.545246856d, 0.6940070834d, 0.7199681717d, 0.06950936031d, 0.9975812994d,
0.1702942185d, -0.9853932612d, 0.2695973274d, 0.9629731466d, 0.5519612192d, -0.8338697815d, 0.225657487d, -0.9742067022d,
0.4215262855d, -0.9068161835d, 0.4881873305d, -0.8727388672d, -0.3683854996d, -0.9296731273d, -0.9825390578d, 0.1860564427d,
0.81256471d, 0.5828709909d, 0.3196460933d, -0.9475370046d, 0.9570913859d, 0.2897862643d, -0.6876655497d, -0.7260276109d,
-0.9988770922d, -0.047376731d, -0.1250179027d, 0.992154486d, -0.8280133617d, 0.560708367d, 0.9324863769d, -0.3612051451d,
0.6394653183d, 0.7688199442d, -0.01623847064d, -0.9998681473d, -0.9955014666d, -0.09474613458d, -0.81453315d, 0.580117012d,
0.4037327978d, -0.9148769469d, 0.9944263371d, 0.1054336766d, -0.1624711654d, 0.9867132919d, -0.9949487814d, -0.100383875d,
-0.6995302564d, 0.7146029809d, 0.5263414922d, -0.85027327d, -0.5395221479d, 0.841971408d, 0.6579370318d, 0.7530729462d,
0.01426758847d, -0.9998982128d, -0.6734383991d, 0.7392433447d, 0.639412098d, -0.7688642071d, 0.9211571421d, 0.3891908523d,
-0.146637214d, -0.9891903394d, -0.782318098d, 0.6228791163d, -0.5039610839d, -0.8637263605d, -0.7743120191d, -0.6328039957d,
};
private static final int PRECOMPUTE_RADIUS = 3;
private static final int PRECOMPUTE_SIZE = 1 + 2 * PRECOMPUTE_RADIUS;
private static final int NEARBY_CELLS_RADIUS = 2;
private static final int MAX_CONNECTION_RADIUS = 1;
private final long salt;
private final double frequency;
private final double inverseFrequency;
private final double cellularJitter;
private final NoiseSampler lookup;
public PseudoErosionSampler(long salt, double frequency, NoiseSampler lookup, double jitterModifier) {
this.salt = salt;
this.frequency = frequency;
this.inverseFrequency = 1 / frequency;
this.lookup = lookup;
this.cellularJitter = 0.43701595 * jitterModifier;
}
public void generateContextRaw(long sl, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
int seed = (int) sl;
// Round sampled position to integers to derive grid coordinates
int gridX = (int) Math.round(x);
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
double[] cellData = new double[contextSizeArraySize];
int cellDataIndex = 0;
for(int xi = -contextRadius; xi <= contextRadius; xi++) {
int gridXi = gridX + xi;
int gridXiPrimed = gridXi * PRIME_X;
for(int yi = -contextRadius; yi <= contextRadius; yi++) {
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
double actualCellX = cellX * inverseFrequency;
double actualCellY = cellY * inverseFrequency;
double lookup = this.lookup.noise(seed, actualCellX, actualCellY, context, nextContextLayer, nextContextRadius);
cellData[cellDataIndex++] = cellX;
cellData[cellDataIndex++] = cellY;
cellData[cellDataIndex++] = 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
int cellDataIndex = xIndex;
//int cellDataIndex = 21;
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++) {
// Find cell position with the lowest lookup value within moore neighborhood of neighbor
double lowestLookup = Double.MAX_VALUE;
double connectedCellX = 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 yni = yniMin; yni <= yniMax; yni++) {
double lookup = cellData[cellDataIndexN];
if(lookup < lowestLookup) {
lowestLookup = lookup;
connectedCellX = cellData[cellDataIndexN - 2];
connectedCellY = cellData[cellDataIndexN - 1];
}
cellDataIndexN += 3;
}
cellDataIndexN += 12;
}
double cellX = cellData[cellDataIndex];
double cellY = cellData[cellDataIndex + 1];
// 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);
// Set final return to the lowest computed distance
finalDistance = Math.min(finalDistance, distance);
cellDataIndex += 3;
}
cellDataIndex += yIndex;
//cellDataIndex += 3;
}
return finalDistance;
}
/**
* Signed distance function of a line segment determined by two points
*/
private static double lineSdf2D(double x, double y, double x1, double y1, double x2, double y2) {
double x1dx = x - x1;
double y1dx = y - y1;
if (x1 == x2 && y1 == y2) {
// If positions are the same, just return the distance from the point
return MathUtil.hypot(x1dx, y1dx);
}
double ldx = x1 - x2;
double ldy = y1 - y2;
double invLineLengthSquared = Math.pow((Math.pow(ldx, 2) + Math.pow(ldy, 2)), -1);
double x2dx = x - x2;
double y2dx = y - y2;
double dotProduct = MathUtil.fma(ldy, y1dx, (ldx * x1dx));
double lt = dotProduct * invLineLengthSquared; // Position along the line
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 {
double distance = MathUtil.fma(ldy, x1dx, (-(ldx * y1dx))) * Math.sqrt(invLineLengthSquared);
return Math.abs(distance); // Distance from the line
}
}
public double getNoiseRaw(long sl, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
// TODO
return 0;
}
@Override
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
return getNoiseRaw(seed + salt, x * frequency, y * frequency, context, contextLayer, contextRadius);
}
@Override
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, 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;
}
}
@@ -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;
@@ -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++) {
@@ -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;
@@ -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;
@@ -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);
@@ -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,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;
} }
@@ -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;
@@ -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;
@@ -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;
} }
} }
@@ -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);
@@ -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),
MathUtil.cubicLerp(valCoord(seed, x0, y1), valCoord(seed, x1, y1), valCoord(seed, x2, y1), valCoord(seed, x3, y1),
xs), xs),
cubicLerp(valCoord(seed, x0, y1), valCoord(seed, x1, y1), valCoord(seed, x2, y1), valCoord(seed, x3, y1), MathUtil.cubicLerp(valCoord(seed, x0, y2), valCoord(seed, x1, y2), valCoord(seed, x2, y2), valCoord(seed, x3, y2),
xs), xs),
cubicLerp(valCoord(seed, x0, y2), valCoord(seed, x1, y2), valCoord(seed, x2, y2), valCoord(seed, x3, y2), MathUtil.cubicLerp(valCoord(seed, x0, y3), valCoord(seed, x1, y3), valCoord(seed, x2, y3), valCoord(seed, x3, y3),
xs),
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));
@@ -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")
}
@@ -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")
} }
@@ -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));
} }
} }
} }
@@ -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()));
} }
} }
@@ -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);
+2 -2
View File
@@ -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)
} }
@@ -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,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 {
@@ -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()));
} }
} }
@@ -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);
} }
@@ -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> {
@@ -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
@@ -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
@@ -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));
} }
/** /**
@@ -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")
}
@@ -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);
} }
@@ -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);
@@ -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);
@@ -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");

Some files were not shown because too many files have changed in this diff Show More