put vector3 in class in API

This commit is contained in:
dfsek
2021-06-30 10:39:03 -07:00
parent abd3683a49
commit bf5e8d903c
107 changed files with 552 additions and 544 deletions
@@ -0,0 +1,104 @@
package com.dfsek.terra.addons.noise;
import com.dfsek.terra.addons.noise.config.NoiseSamplerBuilderLoader;
import com.dfsek.terra.addons.noise.config.templates.DomainWarpTemplate;
import com.dfsek.terra.addons.noise.config.templates.ImageSamplerTemplate;
import com.dfsek.terra.addons.noise.config.templates.KernelTemplate;
import com.dfsek.terra.addons.noise.config.templates.noise.CellularNoiseTemplate;
import com.dfsek.terra.addons.noise.config.templates.noise.ConstantNoiseTemplate;
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.SimpleNoiseTemplate;
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.RidgedFractalTemplate;
import com.dfsek.terra.addons.noise.config.templates.normalizer.ClampNormalizerTemplate;
import com.dfsek.terra.addons.noise.config.templates.normalizer.LinearNormalizerTemplate;
import com.dfsek.terra.addons.noise.config.templates.normalizer.NormalNormalizerTemplate;
import com.dfsek.terra.addons.noise.samplers.ImageSampler;
import com.dfsek.terra.addons.noise.samplers.noise.CellularSampler;
import com.dfsek.terra.addons.noise.samplers.noise.random.GaussianNoiseSampler;
import com.dfsek.terra.addons.noise.samplers.noise.random.WhiteNoiseSampler;
import com.dfsek.terra.addons.noise.samplers.noise.simplex.OpenSimplex2SSampler;
import com.dfsek.terra.addons.noise.samplers.noise.simplex.OpenSimplex2Sampler;
import com.dfsek.terra.addons.noise.samplers.noise.simplex.PerlinSampler;
import com.dfsek.terra.addons.noise.samplers.noise.simplex.SimplexSampler;
import com.dfsek.terra.addons.noise.samplers.noise.value.ValueCubicSampler;
import com.dfsek.terra.addons.noise.samplers.noise.value.ValueSampler;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.addon.TerraAddon;
import com.dfsek.terra.api.addon.annotations.Addon;
import com.dfsek.terra.api.addon.annotations.Author;
import com.dfsek.terra.api.addon.annotations.Version;
import com.dfsek.terra.api.event.annotations.Global;
import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.injection.annotations.Inject;
import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.util.seeded.NoiseProvider;
import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import com.dfsek.terra.addons.noise.config.templates.ImageSamplerTemplate;
@Addon("noise")
@Author("Terra")
@Version("1.0.0")
public class NoiseAddon extends TerraAddon {
@Inject
private TerraPlugin plugin;
@Override
public void initialize() {
plugin.applyLoader(ImageSamplerTemplate.class, ImageSamplerTemplate::new)
.applyLoader(DomainWarpTemplate.class, DomainWarpTemplate::new)
.applyLoader(LinearNormalizerTemplate.class, LinearNormalizerTemplate::new)
.applyLoader(NormalNormalizerTemplate.class, NormalNormalizerTemplate::new)
.applyLoader(ImageSampler.Channel.class, (t, object, cf) -> ImageSampler.Channel.valueOf((String) object))
.applyLoader(ClampNormalizerTemplate.class, ClampNormalizerTemplate::new)
.applyLoader(ImageSamplerTemplate.class, ImageSamplerTemplate::new)
.applyLoader(CellularSampler.ReturnType.class, (t, object, cf) -> CellularSampler.ReturnType.valueOf((String) object))
.applyLoader(CellularSampler.DistanceFunction.class, (t, object, cf) -> CellularSampler.DistanceFunction.valueOf((String) object))
;
}
@SuppressWarnings("deprecation")
@Global
public void packPreLoad(ConfigPackPreLoadEvent event) {
event.getPack()
.applyLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(event.getPack().getRegistry(NoiseProvider.class)));
CheckedRegistry<NoiseProvider> noiseRegistry = event.getPack().getRegistry(NoiseProvider.class);
noiseRegistry.addUnchecked("LINEAR", LinearNormalizerTemplate::new);
noiseRegistry.addUnchecked("NORMAL", NormalNormalizerTemplate::new);
noiseRegistry.addUnchecked("CLAMP", ClampNormalizerTemplate::new);
noiseRegistry.addUnchecked("EXPRESSION", ExpressionFunctionTemplate::new);
noiseRegistry.addUnchecked("IMAGE", ImageSamplerTemplate::new);
noiseRegistry.addUnchecked("DOMAINWARP", DomainWarpTemplate::new);
noiseRegistry.addUnchecked("FBM", BrownianMotionTemplate::new);
noiseRegistry.addUnchecked("PINGPONG", PingPongTemplate::new);
noiseRegistry.addUnchecked("RIDGED", RidgedFractalTemplate::new);
noiseRegistry.addUnchecked("OPENSIMPLEX2", () -> new SimpleNoiseTemplate(OpenSimplex2Sampler::new));
noiseRegistry.addUnchecked("OPENSIMPLEX2S", () -> new SimpleNoiseTemplate(OpenSimplex2SSampler::new));
noiseRegistry.addUnchecked("PERLIN", () -> new SimpleNoiseTemplate(PerlinSampler::new));
noiseRegistry.addUnchecked("SIMPLEX", () -> new SimpleNoiseTemplate(SimplexSampler::new));
noiseRegistry.addUnchecked("GABOR", GaborNoiseTemplate::new);
noiseRegistry.addUnchecked("VALUE", () -> new SimpleNoiseTemplate(ValueSampler::new));
noiseRegistry.addUnchecked("VALUECUBIC", () -> new SimpleNoiseTemplate(ValueCubicSampler::new));
noiseRegistry.addUnchecked("CELLULAR", CellularNoiseTemplate::new);
noiseRegistry.addUnchecked("WHITENOISE", () -> new SimpleNoiseTemplate(WhiteNoiseSampler::new));
noiseRegistry.addUnchecked("GAUSSIAN", () -> new SimpleNoiseTemplate(GaussianNoiseSampler::new));
noiseRegistry.addUnchecked("CONSTANT", ConstantNoiseTemplate::new);
noiseRegistry.addUnchecked("KERNEL", KernelTemplate::new);
}
}
@@ -1,4 +1,4 @@
package com.dfsek.terra.config.loaders.config.sampler; package com.dfsek.terra.addons.noise.config;
import com.dfsek.tectonic.config.Configuration; import com.dfsek.tectonic.config.Configuration;
import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.ConfigException;
@@ -1,10 +1,10 @@
package com.dfsek.terra.config.loaders.config.sampler.templates; package com.dfsek.terra.addons.noise.config.templates;
import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.noise.samplers.DomainWarpedSampler;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import com.dfsek.terra.noise.samplers.DomainWarpedSampler;
@SuppressWarnings({"unused", "FieldMayBeFinal"}) @SuppressWarnings({"unused", "FieldMayBeFinal"})
public class DomainWarpTemplate extends SamplerTemplate<DomainWarpedSampler> { public class DomainWarpTemplate extends SamplerTemplate<DomainWarpedSampler> {
@@ -1,4 +1,4 @@
package com.dfsek.terra.config.loaders.config.function; package com.dfsek.terra.addons.noise.config.templates;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.loading.object.ObjectTemplate; import com.dfsek.tectonic.loading.object.ObjectTemplate;
@@ -1,8 +1,8 @@
package com.dfsek.terra.config.loaders.config.sampler.templates; package com.dfsek.terra.addons.noise.config.templates;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.noise.samplers.ImageSampler;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.noise.samplers.ImageSampler;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
@@ -1,12 +1,12 @@
package com.dfsek.terra.config.loaders.config.sampler.templates; package com.dfsek.terra.addons.noise.config.templates;
import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.config.ValidatedConfigTemplate;
import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.tectonic.exception.ValidationException;
import com.dfsek.terra.addons.noise.samplers.KernelSampler;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import com.dfsek.terra.noise.samplers.KernelSampler;
import java.util.List; import java.util.List;
@@ -1,4 +1,4 @@
package com.dfsek.terra.config.loaders.config.sampler.templates; package com.dfsek.terra.addons.noise.config.templates;
import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
@@ -1,11 +1,11 @@
package com.dfsek.terra.config.loaders.config.sampler.templates.noise; package com.dfsek.terra.addons.noise.config.templates.noise;
import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.noise.samplers.noise.CellularSampler;
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 com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import com.dfsek.terra.noise.samplers.noise.CellularSampler;
import com.dfsek.terra.noise.samplers.noise.simplex.OpenSimplex2Sampler;
@SuppressWarnings("FieldMayBeFinal") @SuppressWarnings("FieldMayBeFinal")
public class CellularNoiseTemplate extends NoiseTemplate<CellularSampler> { public class CellularNoiseTemplate extends NoiseTemplate<CellularSampler> {
@@ -1,10 +1,10 @@
package com.dfsek.terra.config.loaders.config.sampler.templates.noise; package com.dfsek.terra.addons.noise.config.templates.noise;
import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate;
import com.dfsek.terra.addons.noise.samplers.noise.ConstantSampler;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.config.loaders.config.sampler.templates.SamplerTemplate;
import com.dfsek.terra.noise.samplers.noise.ConstantSampler;
@SuppressWarnings("FieldMayBeFinal") @SuppressWarnings("FieldMayBeFinal")
public class ConstantNoiseTemplate extends SamplerTemplate<ConstantSampler> { public class ConstantNoiseTemplate extends SamplerTemplate<ConstantSampler> {
@@ -1,4 +1,4 @@
package com.dfsek.terra.config.loaders.config.sampler.templates.noise; package com.dfsek.terra.addons.noise.config.templates.noise;
import com.dfsek.paralithic.eval.parser.Parser; import com.dfsek.paralithic.eval.parser.Parser;
import com.dfsek.paralithic.eval.parser.Scope; import com.dfsek.paralithic.eval.parser.Scope;
@@ -8,14 +8,14 @@ import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.config.ValidatedConfigTemplate;
import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.tectonic.exception.ValidationException;
import com.dfsek.terra.api.math.paralithic.defined.UserDefinedFunction; import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate;
import com.dfsek.terra.api.math.paralithic.noise.NoiseFunction2; import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate;
import com.dfsek.terra.api.math.paralithic.noise.NoiseFunction3; 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.NoiseFunction3;
import com.dfsek.terra.addons.noise.samplers.noise.ExpressionFunction;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import com.dfsek.terra.config.loaders.config.function.FunctionTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.SamplerTemplate;
import com.dfsek.terra.noise.samplers.noise.ExpressionFunction;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@@ -1,9 +1,9 @@
package com.dfsek.terra.config.loaders.config.sampler.templates.noise; package com.dfsek.terra.addons.noise.config.templates.noise;
import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.noise.samplers.noise.GaborNoiseSampler;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.noise.samplers.noise.GaborNoiseSampler;
public class GaborNoiseTemplate extends NoiseTemplate<GaborNoiseSampler> { public class GaborNoiseTemplate extends NoiseTemplate<GaborNoiseSampler> {
@Value("rotation") @Value("rotation")
@@ -1,9 +1,9 @@
package com.dfsek.terra.config.loaders.config.sampler.templates.noise; package com.dfsek.terra.addons.noise.config.templates.noise;
import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.config.loaders.config.sampler.templates.SamplerTemplate; import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate;
import com.dfsek.terra.noise.samplers.noise.NoiseFunction; import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction;
@SuppressWarnings({"unused", "FieldMayBeFinal"}) @SuppressWarnings({"unused", "FieldMayBeFinal"})
public abstract class NoiseTemplate<T extends NoiseFunction> extends SamplerTemplate<T> { public abstract class NoiseTemplate<T extends NoiseFunction> extends SamplerTemplate<T> {
@@ -1,7 +1,7 @@
package com.dfsek.terra.config.loaders.config.sampler.templates.noise; package com.dfsek.terra.addons.noise.config.templates.noise;
import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.noise.samplers.noise.NoiseFunction;
import java.util.function.Function; import java.util.function.Function;
@@ -1,7 +1,7 @@
package com.dfsek.terra.config.loaders.config.sampler.templates.noise.fractal; package com.dfsek.terra.addons.noise.config.templates.noise.fractal;
import com.dfsek.terra.addons.noise.samplers.noise.fractal.BrownianMotionSampler;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.noise.samplers.noise.fractal.BrownianMotionSampler;
public class BrownianMotionTemplate extends FractalTemplate<BrownianMotionSampler> { public class BrownianMotionTemplate extends FractalTemplate<BrownianMotionSampler> {
@Override @Override
@@ -1,10 +1,10 @@
package com.dfsek.terra.config.loaders.config.sampler.templates.noise.fractal; package com.dfsek.terra.addons.noise.config.templates.noise.fractal;
import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate;
import com.dfsek.terra.addons.noise.samplers.noise.fractal.FractalNoiseFunction;
import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import com.dfsek.terra.config.loaders.config.sampler.templates.SamplerTemplate;
import com.dfsek.terra.noise.samplers.noise.fractal.FractalNoiseFunction;
public abstract class FractalTemplate<T extends FractalNoiseFunction> extends SamplerTemplate<T> { public abstract class FractalTemplate<T extends FractalNoiseFunction> extends SamplerTemplate<T> {
@Value("octaves") @Value("octaves")
@@ -1,9 +1,9 @@
package com.dfsek.terra.config.loaders.config.sampler.templates.noise.fractal; package com.dfsek.terra.addons.noise.config.templates.noise.fractal;
import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.noise.samplers.noise.fractal.PingPongSampler;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.noise.samplers.noise.fractal.PingPongSampler;
@SuppressWarnings({"unused", "FieldMayBeFinal"}) @SuppressWarnings({"unused", "FieldMayBeFinal"})
public class PingPongTemplate extends FractalTemplate<PingPongSampler> { public class PingPongTemplate extends FractalTemplate<PingPongSampler> {
@@ -1,7 +1,7 @@
package com.dfsek.terra.config.loaders.config.sampler.templates.noise.fractal; package com.dfsek.terra.addons.noise.config.templates.noise.fractal;
import com.dfsek.terra.addons.noise.samplers.noise.fractal.RidgedFractalSampler;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.noise.samplers.noise.fractal.RidgedFractalSampler;
public class RidgedFractalTemplate extends FractalTemplate<RidgedFractalSampler> { public class RidgedFractalTemplate extends FractalTemplate<RidgedFractalSampler> {
@Override @Override
@@ -1,12 +1,11 @@
package com.dfsek.terra.config.loaders.config.sampler.templates.normalizer; package com.dfsek.terra.addons.noise.config.templates.normalizer;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.noise.normalizer.ClampNormalizer;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.noise.normalizer.ClampNormalizer;
import com.dfsek.terra.noise.normalizer.LinearNormalizer;
@SuppressWarnings({"unused", "FieldMayBeFinal"}) @SuppressWarnings({"unused", "FieldMayBeFinal"})
public class ClampNormalizerTemplate extends NormalizerTemplate<LinearNormalizer> { public class ClampNormalizerTemplate extends NormalizerTemplate<ClampNormalizer> {
@Value("max") @Value("max")
private double max; private double max;
@@ -1,8 +1,8 @@
package com.dfsek.terra.config.loaders.config.sampler.templates.normalizer; package com.dfsek.terra.addons.noise.config.templates.normalizer;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.noise.normalizer.LinearNormalizer;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.noise.normalizer.LinearNormalizer;
@SuppressWarnings({"unused", "FieldMayBeFinal"}) @SuppressWarnings({"unused", "FieldMayBeFinal"})
public class LinearNormalizerTemplate extends NormalizerTemplate<LinearNormalizer> { public class LinearNormalizerTemplate extends NormalizerTemplate<LinearNormalizer> {
@@ -1,9 +1,9 @@
package com.dfsek.terra.config.loaders.config.sampler.templates.normalizer; package com.dfsek.terra.addons.noise.config.templates.normalizer;
import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.noise.normalizer.NormalNormalizer;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.noise.normalizer.NormalNormalizer;
@SuppressWarnings({"unused", "FieldMayBeFinal"}) @SuppressWarnings({"unused", "FieldMayBeFinal"})
public class NormalNormalizerTemplate extends NormalizerTemplate<NormalNormalizer> { public class NormalNormalizerTemplate extends NormalizerTemplate<NormalNormalizer> {
@@ -1,9 +1,9 @@
package com.dfsek.terra.config.loaders.config.sampler.templates.normalizer; package com.dfsek.terra.addons.noise.config.templates.normalizer;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate;
import com.dfsek.terra.addons.noise.normalizer.Normalizer;
import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import com.dfsek.terra.config.loaders.config.sampler.templates.SamplerTemplate;
import com.dfsek.terra.noise.normalizer.Normalizer;
public abstract class NormalizerTemplate<T extends Normalizer> extends SamplerTemplate<T> { public abstract class NormalizerTemplate<T extends Normalizer> extends SamplerTemplate<T> {
@Value("function") @Value("function")
@@ -1,4 +1,4 @@
package com.dfsek.terra.noise.normalizer; package com.dfsek.terra.addons.noise.normalizer;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import net.jafama.FastMath; import net.jafama.FastMath;
@@ -1,4 +1,4 @@
package com.dfsek.terra.noise.normalizer; package com.dfsek.terra.addons.noise.normalizer;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
@@ -1,4 +1,4 @@
package com.dfsek.terra.noise.normalizer; package com.dfsek.terra.addons.noise.normalizer;
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;
@@ -1,4 +1,4 @@
package com.dfsek.terra.noise.normalizer; package com.dfsek.terra.addons.noise.normalizer;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
@@ -1,4 +1,4 @@
package com.dfsek.terra.api.math.paralithic; package com.dfsek.terra.addons.noise.paralithic;
import com.dfsek.paralithic.functions.dynamic.DynamicFunction; import com.dfsek.paralithic.functions.dynamic.DynamicFunction;
@@ -1,11 +1,11 @@
package com.dfsek.terra.api.math.paralithic.defined; package com.dfsek.terra.addons.noise.paralithic.defined;
import com.dfsek.paralithic.Expression; import com.dfsek.paralithic.Expression;
import com.dfsek.paralithic.eval.parser.Parser; import com.dfsek.paralithic.eval.parser.Parser;
import com.dfsek.paralithic.eval.parser.Scope; 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.dynamic.DynamicFunction; import com.dfsek.paralithic.functions.dynamic.DynamicFunction;
import com.dfsek.terra.config.loaders.config.function.FunctionTemplate; import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate;
public class UserDefinedFunction implements DynamicFunction { public class UserDefinedFunction implements DynamicFunction {
@@ -1,4 +1,4 @@
package com.dfsek.terra.api.math.paralithic.noise; package com.dfsek.terra.addons.noise.paralithic.noise;
import com.dfsek.paralithic.functions.dynamic.DynamicFunction; import com.dfsek.paralithic.functions.dynamic.DynamicFunction;
@@ -1,7 +1,7 @@
package com.dfsek.terra.api.math.paralithic.noise; package com.dfsek.terra.addons.noise.paralithic.noise;
import com.dfsek.terra.addons.noise.util.HashMapDoubleDouble;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.hash.HashMapDoubleDouble;
public class NoiseFunction2 implements NoiseFunction { public class NoiseFunction2 implements NoiseFunction {
@@ -1,4 +1,4 @@
package com.dfsek.terra.api.math.paralithic.noise; package com.dfsek.terra.addons.noise.paralithic.noise;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
@@ -1,4 +1,4 @@
package com.dfsek.terra.noise.samplers; package com.dfsek.terra.addons.noise.samplers;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
@@ -1,4 +1,4 @@
package com.dfsek.terra.noise.samplers; package com.dfsek.terra.addons.noise.samplers;
import com.dfsek.paralithic.Expression; import com.dfsek.paralithic.Expression;
import com.dfsek.paralithic.eval.parser.Parser; import com.dfsek.paralithic.eval.parser.Parser;
@@ -1,4 +1,4 @@
package com.dfsek.terra.noise.samplers; package com.dfsek.terra.addons.noise.samplers;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import net.jafama.FastMath; import net.jafama.FastMath;
@@ -1,4 +1,4 @@
package com.dfsek.terra.noise.samplers; package com.dfsek.terra.addons.noise.samplers;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
@@ -1,9 +1,9 @@
package com.dfsek.terra.noise.samplers.noise; package com.dfsek.terra.addons.noise.samplers.noise;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.noise.samplers.noise.simplex.OpenSimplex2Sampler; import com.dfsek.terra.addons.noise.samplers.noise.simplex.OpenSimplex2Sampler;
import com.dfsek.terra.vector.Vector2Impl; import com.dfsek.terra.vector.Vector2Impl;
import com.dfsek.terra.vector.Vector3Impl; import com.dfsek.terra.vector.Vector3Impl;
@@ -384,7 +384,7 @@ public class CellularSampler extends NoiseFunction {
int yPrimedBase = (yr - 1) * PRIME_Y; int yPrimedBase = (yr - 1) * PRIME_Y;
int zPrimedBase = (zr - 1) * PRIME_Z; int zPrimedBase = (zr - 1) * PRIME_Z;
Vector3 center = new Vector3Impl(x, y, z); Vector3 center = new Vector3(x, y, z);
switch(distanceFunction) { switch(distanceFunction) {
case Euclidean: case Euclidean:
@@ -1,4 +1,4 @@
package com.dfsek.terra.noise.samplers.noise; package com.dfsek.terra.addons.noise.samplers.noise;
/** /**
* Sampler3D implementation that returns a constant. * Sampler3D implementation that returns a constant.
@@ -1,4 +1,4 @@
package com.dfsek.terra.noise.samplers.noise; package com.dfsek.terra.addons.noise.samplers.noise;
import com.dfsek.paralithic.Expression; import com.dfsek.paralithic.Expression;
import com.dfsek.paralithic.eval.parser.Parser; import com.dfsek.paralithic.eval.parser.Parser;
@@ -1,6 +1,6 @@
package com.dfsek.terra.noise.samplers.noise; package com.dfsek.terra.addons.noise.samplers.noise;
import com.dfsek.terra.noise.samplers.noise.random.WhiteNoiseSampler; import com.dfsek.terra.addons.noise.samplers.noise.random.WhiteNoiseSampler;
import net.jafama.FastMath; import net.jafama.FastMath;
public class GaborNoiseSampler extends NoiseFunction { public class GaborNoiseSampler extends NoiseFunction {
@@ -1,4 +1,4 @@
package com.dfsek.terra.noise.samplers.noise; package com.dfsek.terra.addons.noise.samplers.noise;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import net.jafama.FastMath; import net.jafama.FastMath;
@@ -1,4 +1,4 @@
package com.dfsek.terra.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;
@@ -1,7 +1,7 @@
package com.dfsek.terra.noise.samplers.noise.fractal; package com.dfsek.terra.addons.noise.samplers.noise.fractal;
import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.noise.samplers.noise.NoiseFunction;
public abstract class FractalNoiseFunction extends NoiseFunction { public abstract class FractalNoiseFunction extends NoiseFunction {
protected final NoiseSampler input; protected final NoiseSampler input;
@@ -1,4 +1,4 @@
package com.dfsek.terra.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;
@@ -1,4 +1,4 @@
package com.dfsek.terra.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;
@@ -1,6 +1,6 @@
package com.dfsek.terra.noise.samplers.noise.random; package com.dfsek.terra.addons.noise.samplers.noise.random;
import com.dfsek.terra.noise.samplers.noise.NoiseFunction; import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction;
/** /**
* NoiseSampler implementation to provide random, normally distributed (Gaussian) noise. * NoiseSampler implementation to provide random, normally distributed (Gaussian) noise.
@@ -1,6 +1,6 @@
package com.dfsek.terra.noise.samplers.noise.random; package com.dfsek.terra.addons.noise.samplers.noise.random;
import com.dfsek.terra.noise.samplers.noise.NoiseFunction; import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction;
/** /**
* NoiseSampler implementation to produce random, uniformly distributed (white) noise. * NoiseSampler implementation to produce random, uniformly distributed (white) noise.
@@ -1,4 +1,4 @@
package com.dfsek.terra.noise.samplers.noise.simplex; package com.dfsek.terra.addons.noise.samplers.noise.simplex;
/** /**
* NoiseSampler implementation to provide OpenSimplex2 (Smooth Variant) noise. * NoiseSampler implementation to provide OpenSimplex2 (Smooth Variant) noise.
@@ -1,4 +1,4 @@
package com.dfsek.terra.noise.samplers.noise.simplex; package com.dfsek.terra.addons.noise.samplers.noise.simplex;
/** /**
* NoiseSampler implementation to provide OpenSimplex2 noise. * NoiseSampler implementation to provide OpenSimplex2 noise.
@@ -1,4 +1,4 @@
package com.dfsek.terra.noise.samplers.noise.simplex; package com.dfsek.terra.addons.noise.samplers.noise.simplex;
/** /**
* NoiseSampler implementation to provide Perlin Noise. * NoiseSampler implementation to provide Perlin Noise.
@@ -1,4 +1,4 @@
package com.dfsek.terra.noise.samplers.noise.simplex; package com.dfsek.terra.addons.noise.samplers.noise.simplex;
public class SimplexSampler extends SimplexStyleSampler { public class SimplexSampler extends SimplexStyleSampler {
private static final Double2[] GRAD_2D = { private static final Double2[] GRAD_2D = {
@@ -1,6 +1,6 @@
package com.dfsek.terra.noise.samplers.noise.simplex; package com.dfsek.terra.addons.noise.samplers.noise.simplex;
import com.dfsek.terra.noise.samplers.noise.NoiseFunction; import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction;
/** /**
* Abstract NoiseSampler implementation for simplex-style noise functions. * Abstract NoiseSampler implementation for simplex-style noise functions.
@@ -1,4 +1,4 @@
package com.dfsek.terra.noise.samplers.noise.value; package com.dfsek.terra.addons.noise.samplers.noise.value;
public class ValueCubicSampler extends ValueStyleNoise { public class ValueCubicSampler extends ValueStyleNoise {
public ValueCubicSampler(int seed) { public ValueCubicSampler(int seed) {
@@ -1,4 +1,4 @@
package com.dfsek.terra.noise.samplers.noise.value; package com.dfsek.terra.addons.noise.samplers.noise.value;
public class ValueSampler extends ValueStyleNoise { public class ValueSampler extends ValueStyleNoise {
public ValueSampler(int seed) { public ValueSampler(int seed) {
@@ -1,6 +1,6 @@
package com.dfsek.terra.noise.samplers.noise.value; package com.dfsek.terra.addons.noise.samplers.noise.value;
import com.dfsek.terra.noise.samplers.noise.NoiseFunction; import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction;
public abstract class ValueStyleNoise extends NoiseFunction { public abstract class ValueStyleNoise extends NoiseFunction {
public ValueStyleNoise(int seed) { public ValueStyleNoise(int seed) {
@@ -31,7 +31,7 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE. POSSIBILITY OF SUCH DAMAGE.
*/ */
package com.dfsek.terra.api.util.hash; package com.dfsek.terra.addons.noise.util;
import java.io.Serializable; import java.io.Serializable;
@@ -31,7 +31,7 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE. POSSIBILITY OF SUCH DAMAGE.
*/ */
package com.dfsek.terra.api.util.hash; package com.dfsek.terra.addons.noise.util;
import java.io.Serializable; import java.io.Serializable;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
@@ -10,6 +10,8 @@ import com.dfsek.terra.api.lang.Language;
import com.dfsek.terra.api.profiler.Profiler; import com.dfsek.terra.api.profiler.Profiler;
import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.registry.Registry;
import com.dfsek.terra.api.tectonic.LoaderHolder;
import com.dfsek.terra.api.tectonic.LoaderRegistrar;
import com.dfsek.terra.api.util.JarUtil; import com.dfsek.terra.api.util.JarUtil;
import com.dfsek.terra.api.world.TerraWorld; import com.dfsek.terra.api.world.TerraWorld;
import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.World;
@@ -22,7 +24,7 @@ import java.util.jar.JarFile;
/** /**
* Represents a Terra mod/plugin instance. * Represents a Terra mod/plugin instance.
*/ */
public interface TerraPlugin extends LoaderRegistrar { public interface TerraPlugin extends LoaderRegistrar, LoaderHolder {
WorldHandle getWorldHandle(); WorldHandle getWorldHandle();
TerraWorld getWorld(World world); TerraWorld getWorld(World world);
@@ -1,6 +1,7 @@
package com.dfsek.terra.api.config; package com.dfsek.terra.api.config;
import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.tectonic.LoaderHolder;
import com.dfsek.terra.api.tectonic.LoaderRegistrar;
import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.addon.TerraAddon;
import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.CheckedRegistry;
import com.dfsek.terra.api.world.TerraWorld; import com.dfsek.terra.api.world.TerraWorld;
@@ -9,8 +10,7 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
public interface ConfigPack extends LoaderRegistrar { public interface ConfigPack extends LoaderRegistrar, LoaderHolder {
@SuppressWarnings("unchecked")
<T> CheckedRegistry<T> getRegistry(Class<T> clazz); <T> CheckedRegistry<T> getRegistry(Class<T> clazz);
BiomeProvider.BiomeProviderBuilder getBiomeProviderBuilder(); BiomeProvider.BiomeProviderBuilder getBiomeProviderBuilder();
@@ -30,4 +30,28 @@ public interface NoiseSampler {
double getNoiseSeeded(int seed, double x, double y); double getNoiseSeeded(int seed, double x, double y);
double getNoiseSeeded(int seed, double x, double y, double z); double getNoiseSeeded(int seed, double x, double y, double z);
static NoiseSampler zero() {
return new NoiseSampler() {
@Override
public double getNoise(double x, double y) {
return 0;
}
@Override
public double getNoise(double x, double y, double z) {
return 0;
}
@Override
public double getNoiseSeeded(int seed, double x, double y) {
return 0;
}
@Override
public double getNoiseSeeded(int seed, double x, double y, double z) {
return 0;
}
};
}
} }
@@ -0,0 +1,20 @@
package com.dfsek.terra.api.tectonic;
import com.dfsek.tectonic.abstraction.TemplateProvider;
import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.tectonic.loading.object.ObjectTemplate;
import java.lang.reflect.Type;
import java.util.function.Supplier;
public interface LoaderHolder {
<T> LoaderHolder applyLoader(Type type, TypeLoader<T> loader);
default <T> LoaderHolder applyLoader(Class<? extends T> type, TypeLoader<T> loader) {
return applyLoader((Type) type, loader);
}
<T> LoaderHolder applyLoader(Type type, TemplateProvider<ObjectTemplate<T>> loader);
default <T> LoaderHolder applyLoader(Class<? extends T> type, TemplateProvider<ObjectTemplate<T>> loader) {
return applyLoader((Type) type, loader);
}
}
@@ -1,4 +1,4 @@
package com.dfsek.terra.api; package com.dfsek.terra.api.tectonic;
import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.tectonic.loading.TypeRegistry;
@@ -1,47 +1,115 @@
package com.dfsek.terra.api.vector; package com.dfsek.terra.api.vector;
import com.dfsek.terra.api.util.MathUtil;
import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.World;
import net.jafama.FastMath;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public interface Vector3 extends Cloneable { public class Vector3 implements Cloneable {
double getZ(); private double x;
private double y;
private double z;
Vector3 setZ(double z); public Vector3(double x, double y, double z) {
this.x = x;
this.y = y;
this.z = z;
}
double getX(); public double getZ() {
return z;
}
Vector3 setX(double x); public Vector3 setZ(double z) {
this.z = z;
return this;
}
double getY(); public double getX() {
return x;
}
Vector3 setY(double y); public Vector3 setX(double x) {
this.x = x;
return this;
}
int getBlockX(); public double getY() {
return y;
}
int getBlockY(); public Vector3 setY(double y) {
this.y = y;
return this;
}
int getBlockZ(); public int getBlockX() {
return FastMath.floorToInt(x);
}
Vector3 multiply(double m); public int getBlockY() {
return FastMath.floorToInt(y);
}
Vector3 add(double x, double y, double z); public int getBlockZ() {
return FastMath.floorToInt(z);
}
Vector3 add(Vector3 other); public Vector3 multiply(double m) {
x *= m;
y *= m;
z *= m;
return this;
}
Vector3 add(Vector2 other); public Vector3 add(double x, double y, double z) {
this.x += x;
this.y += y;
this.z += z;
return this;
}
double lengthSquared(); public Vector3 add(Vector3 other) {
this.x += other.getX();
this.y += other.getY();
this.z += other.getZ();
return this;
}
double length(); public Vector3 add(Vector2 other) {
this.x += other.getX();
this.z += other.getZ();
return this;
}
double inverseLength(); public double lengthSquared() {
return x * x + y * y + z * z;
}
public Vector3 clone() {
try {
return (Vector3) super.clone();
} catch(CloneNotSupportedException e) {
throw new Error(e);
}
}
public double length() {
return FastMath.sqrt(lengthSquared());
}
public double inverseLength() {
return FastMath.invSqrtQuick(lengthSquared());
}
/** /**
* Returns if a vector is normalized * Returns if a vector is normalized
* *
* @return whether the vector is normalised * @return whether the vector is normalised
*/ */
boolean isNormalized(); public boolean isNormalized() {
return MathUtil.equals(this.lengthSquared(), 1);
}
/** /**
* Rotates the vector around the x axis. * Rotates the vector around the x axis.
@@ -55,7 +123,15 @@ public interface Vector3 extends Cloneable {
* in radians * in radians
* @return the same vector * @return the same vector
*/ */
@NotNull Vector3 rotateAroundX(double angle); @NotNull
public Vector3 rotateAroundX(double angle) {
double angleCos = Math.cos(angle);
double angleSin = Math.sin(angle);
double y = angleCos * getY() - angleSin * getZ();
double z = angleSin * getY() + angleCos * getZ();
return setY(y).setZ(z);
}
/** /**
* Rotates the vector around the y axis. * Rotates the vector around the y axis.
@@ -69,7 +145,15 @@ public interface Vector3 extends Cloneable {
* in radians * in radians
* @return the same vector * @return the same vector
*/ */
@NotNull Vector3 rotateAroundY(double angle); @NotNull
public Vector3 rotateAroundY(double angle) {
double angleCos = Math.cos(angle);
double angleSin = Math.sin(angle);
double x = angleCos * getX() + angleSin * getZ();
double z = -angleSin * getX() + angleCos * getZ();
return setX(x).setZ(z);
}
/** /**
* Rotates the vector around the z axis * Rotates the vector around the z axis
@@ -83,7 +167,15 @@ public interface Vector3 extends Cloneable {
* in radians * in radians
* @return the same vector * @return the same vector
*/ */
@NotNull Vector3 rotateAroundZ(double angle); @NotNull
public Vector3 rotateAroundZ(double angle) {
double angleCos = Math.cos(angle);
double angleSin = Math.sin(angle);
double x = angleCos * getX() - angleSin * getY();
double y = angleSin * getX() + angleCos * getY();
return setX(x).setY(y);
}
/** /**
* Get the distance between this vector and another. The value of this * Get the distance between this vector and another. The value of this
@@ -95,7 +187,9 @@ public interface Vector3 extends Cloneable {
* @param o The other vector * @param o The other vector
* @return the distance * @return the distance
*/ */
double distance(@NotNull Vector3 o); public double distance(@NotNull Vector3 o) {
return FastMath.sqrt(FastMath.pow2(x - o.getX()) + FastMath.pow2(y - o.getY()) + FastMath.pow2(z - o.getZ()));
}
/** /**
* Get the squared distance between this vector and another. * Get the squared distance between this vector and another.
@@ -103,7 +197,9 @@ public interface Vector3 extends Cloneable {
* @param o The other vector * @param o The other vector
* @return the distance * @return the distance
*/ */
double distanceSquared(@NotNull Vector3 o); public double distanceSquared(@NotNull Vector3 o) {
return FastMath.pow2(x - o.getX()) + FastMath.pow2(y - o.getY()) + FastMath.pow2(z - o.getZ());
}
/** /**
* Rotates the vector around a given arbitrary axis in 3 dimensional space. * Rotates the vector around a given arbitrary axis in 3 dimensional space.
@@ -124,7 +220,10 @@ public interface Vector3 extends Cloneable {
* @throws IllegalArgumentException if the provided axis vector instance is * @throws IllegalArgumentException if the provided axis vector instance is
* null * null
*/ */
@NotNull Vector3 rotateAroundAxis(@NotNull Vector3 axis, double angle) throws IllegalArgumentException; @NotNull
public Vector3 rotateAroundAxis(@NotNull Vector3 axis, double angle) throws IllegalArgumentException {
return rotateAroundNonUnitAxis(axis.isNormalized() ? axis : axis.clone().normalize(), angle);
}
/** /**
* Rotates the vector around a given arbitrary axis in 3 dimensional space. * Rotates the vector around a given arbitrary axis in 3 dimensional space.
@@ -144,7 +243,27 @@ public interface Vector3 extends Cloneable {
* @throws IllegalArgumentException if the provided axis vector instance is * @throws IllegalArgumentException if the provided axis vector instance is
* null * null
*/ */
@NotNull Vector3 rotateAroundNonUnitAxis(@NotNull Vector3 axis, double angle) throws IllegalArgumentException; @NotNull
public Vector3 rotateAroundNonUnitAxis(@NotNull Vector3 axis, double angle) throws IllegalArgumentException {
double x = getX(), y = getY(), z = getZ();
double x2 = axis.getX(), y2 = axis.getY(), z2 = axis.getZ();
double cosTheta = Math.cos(angle);
double sinTheta = Math.sin(angle);
double dotProduct = this.dot(axis);
double xPrime = x2 * dotProduct * (1d - cosTheta)
+ x * cosTheta
+ (-z2 * y + y2 * z) * sinTheta;
double yPrime = y2 * dotProduct * (1d - cosTheta)
+ y * cosTheta
+ (z2 * x - x2 * z) * sinTheta;
double zPrime = z2 * dotProduct * (1d - cosTheta)
+ z * cosTheta
+ (-y2 * x + x2 * y) * sinTheta;
return setX(xPrime).setY(yPrime).setZ(zPrime);
}
/** /**
* Calculates the dot product of this vector with another. The dot product * Calculates the dot product of this vector with another. The dot product
@@ -153,13 +272,59 @@ public interface Vector3 extends Cloneable {
* @param other The other vector * @param other The other vector
* @return dot product * @return dot product
*/ */
double dot(@NotNull Vector3 other); public double dot(@NotNull Vector3 other) {
return x * other.getX() + y * other.getY() + z * other.getZ();
}
Vector3 normalize(); public Vector3 normalize() {
return this.multiply(this.inverseLength());
}
Vector3 subtract(int x, int y, int z); public Vector3 subtract(int x, int y, int z) {
this.x -= x;
this.y -= y;
this.z -= z;
return this;
}
Vector3 subtract(Vector3 end); public Vector3 subtract(Vector3 end) {
x -= end.getX();
y -= end.getY();
z -= end.getZ();
return this;
}
Vector3 clone(); /**
* Returns a hash code for this vector
*
* @return hash code
*/
@Override
public int hashCode() {
int hash = 7;
hash = 79 * hash + (int) (Double.doubleToLongBits(this.x) ^ (Double.doubleToLongBits(this.x) >>> 32));
hash = 79 * hash + (int) (Double.doubleToLongBits(this.y) ^ (Double.doubleToLongBits(this.y) >>> 32));
hash = 79 * hash + (int) (Double.doubleToLongBits(this.z) ^ (Double.doubleToLongBits(this.z) >>> 32));
return hash;
}
/**
* Checks to see if two objects are equal.
* <p>
* Only two Vectors can ever return true. This method uses a fuzzy match
* to account for floating point errors. The epsilon can be retrieved
* with epsilon.
*/
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Vector3)) return false;
Vector3 other = (Vector3) obj;
return MathUtil.equals(x, other.getX()) && MathUtil.equals(y, other.getY()) && MathUtil.equals(z, other.getZ());
}
@Override
public String toString() {
return "(" + getX() + ", " + getY() + ", " + getZ() + ")";
}
} }
@@ -4,7 +4,6 @@ import com.dfsek.terra.api.util.FastRandom;
import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.api.util.GlueList;
import com.dfsek.terra.api.util.PopulationUtil; import com.dfsek.terra.api.util.PopulationUtil;
import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.vector.Vector3Impl;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
@@ -41,7 +40,7 @@ public class GridSpawn {
} }
} }
Vector3 shortest = zones.get(0); Vector3 shortest = zones.get(0);
Vector3 compare = new Vector3Impl(x, 0, z); Vector3 compare = new Vector3(x, 0, z);
for(Vector3 v : zones) { for(Vector3 v : zones) {
if(compare.distanceSquared(shortest) > compare.distanceSquared(v)) shortest = v.clone(); if(compare.distanceSquared(shortest) > compare.distanceSquared(v)) shortest = v.clone();
} }
@@ -62,7 +61,7 @@ public class GridSpawn {
int offsetZ = r.nextInt(width); int offsetZ = r.nextInt(width);
int sx = structureChunkX * (width + 2 * separation) + offsetX; int sx = structureChunkX * (width + 2 * separation) + offsetX;
int sz = structureChunkZ * (width + 2 * separation) + offsetZ; int sz = structureChunkZ * (width + 2 * separation) + offsetZ;
return new Vector3Impl(sx, 0, sz); return new Vector3(sx, 0, sz);
} }
public int getWidth() { public int getWidth() {
@@ -11,8 +11,8 @@ import com.dfsek.terra.api.structures.structure.buffer.items.BufferedBlock;
import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.vector.Vector2Impl; import com.dfsek.terra.vector.Vector2Impl;
import com.dfsek.terra.vector.Vector3Impl;
import net.jafama.FastMath; import net.jafama.FastMath;
import java.util.Map; import java.util.Map;
@@ -40,7 +40,7 @@ public abstract class AbstractBlockFunction implements Function<Void> {
RotationUtil.rotateVector(xz, arguments.getRotation()); RotationUtil.rotateVector(xz, arguments.getRotation());
RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse()); RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse());
arguments.getBuffer().addItem(new BufferedBlock(rot, overwrite.apply(implementationArguments, variableMap), main, arguments.isWaterlog()), new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ()))); arguments.getBuffer().addItem(new BufferedBlock(rot, overwrite.apply(implementationArguments, variableMap), main, arguments.isWaterlog()), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ())));
} }
@Override @Override
@@ -9,9 +9,9 @@ import com.dfsek.terra.api.structures.script.TerraImplementationArguments;
import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.vector.Vector2Impl; import com.dfsek.terra.vector.Vector2Impl;
import com.dfsek.terra.vector.Vector3Impl;
import net.jafama.FastMath; import net.jafama.FastMath;
import java.util.Map; import java.util.Map;
@@ -41,7 +41,7 @@ public class BiomeFunction implements Function<String> {
BiomeProvider grid = main.getWorld(arguments.getWorld()).getBiomeProvider(); BiomeProvider grid = main.getWorld(arguments.getWorld()).getBiomeProvider();
return grid.getBiome(arguments.getBuffer().getOrigin().clone().add(new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ())))).getID(); return grid.getBiome(arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ())))).getID();
} }
@@ -8,8 +8,8 @@ import com.dfsek.terra.api.structures.script.TerraImplementationArguments;
import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.vector.Vector2Impl; import com.dfsek.terra.vector.Vector2Impl;
import com.dfsek.terra.vector.Vector3Impl;
import net.jafama.FastMath; import net.jafama.FastMath;
import java.util.Map; import java.util.Map;
@@ -34,7 +34,7 @@ public class CheckBlockFunction implements Function<String> {
RotationUtil.rotateVector(xz, arguments.getRotation()); RotationUtil.rotateVector(xz, arguments.getRotation());
String data = arguments.getWorld().getBlockData(arguments.getBuffer().getOrigin().clone().add(new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ())))).getAsString(); String data = arguments.getWorld().getBlockData(arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ())))).getAsString();
if(data.contains("[")) return data.substring(0, data.indexOf('[')); // Strip properties if(data.contains("[")) return data.substring(0, data.indexOf('[')); // Strip properties
else return data; else return data;
} }
@@ -17,7 +17,6 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.generator.SamplerCache; import com.dfsek.terra.api.world.generator.SamplerCache;
import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.vector.Vector2Impl; import com.dfsek.terra.vector.Vector2Impl;
import com.dfsek.terra.vector.Vector3Impl;
import net.jafama.FastMath; import net.jafama.FastMath;
import java.util.Map; import java.util.Map;
@@ -47,7 +46,7 @@ public class CheckFunction implements Function<String> {
RotationUtil.rotateVector(xz, arguments.getRotation()); RotationUtil.rotateVector(xz, arguments.getRotation());
Vector3 location = arguments.getBuffer().getOrigin().clone().add(new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ()))); Vector3 location = arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ())));
return apply(location, arguments.getWorld()); return apply(location, arguments.getWorld());
} }
@@ -13,8 +13,8 @@ import com.dfsek.terra.api.structures.structure.buffer.items.BufferedEntity;
import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.vector.Vector2Impl; import com.dfsek.terra.vector.Vector2Impl;
import com.dfsek.terra.vector.Vector3Impl;
import java.util.Map; import java.util.Map;
@@ -42,7 +42,7 @@ public class EntityFunction implements Function<Void> {
RotationUtil.rotateVector(xz, arguments.getRotation()); RotationUtil.rotateVector(xz, arguments.getRotation());
arguments.getBuffer().addItem(new BufferedEntity(data, main), new Vector3Impl(xz.getX(), y.apply(implementationArguments, variableMap).doubleValue(), xz.getZ())); arguments.getBuffer().addItem(new BufferedEntity(data, main), new Vector3(xz.getX(), y.apply(implementationArguments, variableMap).doubleValue(), xz.getZ()));
return null; return null;
} }
@@ -8,8 +8,8 @@ import com.dfsek.terra.api.structures.script.TerraImplementationArguments;
import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.vector.Vector2Impl; import com.dfsek.terra.vector.Vector2Impl;
import com.dfsek.terra.vector.Vector3Impl;
import net.jafama.FastMath; import net.jafama.FastMath;
import java.util.Map; import java.util.Map;
@@ -31,7 +31,7 @@ public class GetMarkFunction implements Function<String> {
Vector2 xz = new Vector2Impl(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue()); Vector2 xz = new Vector2Impl(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue());
RotationUtil.rotateVector(xz, arguments.getRotation()); RotationUtil.rotateVector(xz, arguments.getRotation());
String mark = arguments.getBuffer().getMark(new Vector3Impl(FastMath.floorToInt(xz.getX()), FastMath.floorToInt(y.apply(implementationArguments, variableMap).doubleValue()), FastMath.floorToInt(xz.getZ()))); String mark = arguments.getBuffer().getMark(new Vector3(FastMath.floorToInt(xz.getX()), FastMath.floorToInt(y.apply(implementationArguments, variableMap).doubleValue()), FastMath.floorToInt(xz.getZ())));
return mark == null ? "" : mark; return mark == null ? "" : mark;
} }
@@ -13,8 +13,8 @@ import com.dfsek.terra.api.structures.structure.buffer.items.BufferedLootApplica
import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.vector.Vector2Impl; import com.dfsek.terra.vector.Vector2Impl;
import com.dfsek.terra.vector.Vector3Impl;
import net.jafama.FastMath; import net.jafama.FastMath;
import java.util.Map; import java.util.Map;
@@ -53,7 +53,7 @@ public class LootFunction implements Function<Void> {
return null; return null;
} }
arguments.getBuffer().addItem(new BufferedLootApplication(table, main, script), new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ()))); arguments.getBuffer().addItem(new BufferedLootApplication(table, main, script), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ())));
return null; return null;
} }
@@ -13,8 +13,8 @@ import com.dfsek.terra.api.structures.structure.buffer.items.BufferedPulledBlock
import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.vector.Vector2Impl; import com.dfsek.terra.vector.Vector2Impl;
import com.dfsek.terra.vector.Vector3Impl;
import net.jafama.FastMath; import net.jafama.FastMath;
import java.util.Map; import java.util.Map;
@@ -42,7 +42,7 @@ public class PullFunction implements Function<Void> {
RotationUtil.rotateVector(xz, arguments.getRotation()); RotationUtil.rotateVector(xz, arguments.getRotation());
BlockState rot = data.clone(); BlockState rot = data.clone();
RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse()); RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse());
arguments.getBuffer().addItem(new BufferedPulledBlock(rot), new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ()))); arguments.getBuffer().addItem(new BufferedPulledBlock(rot), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ())));
return null; return null;
} }
@@ -8,8 +8,8 @@ import com.dfsek.terra.api.structures.script.TerraImplementationArguments;
import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.vector.Vector2Impl; import com.dfsek.terra.vector.Vector2Impl;
import com.dfsek.terra.vector.Vector3Impl;
import net.jafama.FastMath; import net.jafama.FastMath;
import java.util.Map; import java.util.Map;
@@ -34,7 +34,7 @@ public class SetMarkFunction implements Function<Void> {
RotationUtil.rotateVector(xz, arguments.getRotation()); RotationUtil.rotateVector(xz, arguments.getRotation());
arguments.getBuffer().setMark(mark.apply(implementationArguments, variableMap), new Vector3Impl(FastMath.floorToInt(xz.getX()), FastMath.floorToInt(y.apply(implementationArguments, variableMap).doubleValue()), FastMath.floorToInt(xz.getZ()))); arguments.getBuffer().setMark(mark.apply(implementationArguments, variableMap), new Vector3(FastMath.floorToInt(xz.getX()), FastMath.floorToInt(y.apply(implementationArguments, variableMap).doubleValue()), FastMath.floorToInt(xz.getZ())));
return null; return null;
} }
@@ -10,8 +10,8 @@ import com.dfsek.terra.api.structures.structure.buffer.items.BufferedStateManipu
import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.vector.Vector2Impl; import com.dfsek.terra.vector.Vector2Impl;
import com.dfsek.terra.vector.Vector3Impl;
import net.jafama.FastMath; import net.jafama.FastMath;
import java.util.Map; import java.util.Map;
@@ -37,7 +37,7 @@ public class StateFunction implements Function<Void> {
Vector2 xz = new Vector2Impl(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue()); Vector2 xz = new Vector2Impl(x.apply(implementationArguments, variableMap).doubleValue(), z.apply(implementationArguments, variableMap).doubleValue());
RotationUtil.rotateVector(xz, arguments.getRotation()); RotationUtil.rotateVector(xz, arguments.getRotation());
arguments.getBuffer().addItem(new BufferedStateManipulator(main, data.apply(implementationArguments, variableMap)), new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ()))); arguments.getBuffer().addItem(new BufferedStateManipulator(main, data.apply(implementationArguments, variableMap)), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ())));
return null; return null;
} }
@@ -15,7 +15,6 @@ import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.vector.Vector2Impl; import com.dfsek.terra.vector.Vector2Impl;
import com.dfsek.terra.vector.Vector3Impl;
import net.jafama.FastMath; import net.jafama.FastMath;
import java.util.List; import java.util.List;
@@ -72,7 +71,7 @@ public class StructureFunction implements Function<Boolean> {
return null; return null;
} }
Vector3 offset = new Vector3Impl(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ())); Vector3 offset = new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).doubleValue(), FastMath.roundToInt(xz.getZ()));
return script.generate(new IntermediateBuffer(arguments.getBuffer(), offset), arguments.getWorld(), arguments.getRandom(), arguments.getRotation().rotate(rotation1), arguments.getRecursions() + 1); return script.generate(new IntermediateBuffer(arguments.getBuffer(), offset), arguments.getWorld(), arguments.getRandom(), arguments.getRotation().rotate(rotation1), arguments.getRecursions() + 1);
} }
@@ -2,7 +2,6 @@ package com.dfsek.terra.api.world.carving;
import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.World;
import com.dfsek.terra.vector.Vector3Impl;
import net.jafama.FastMath; import net.jafama.FastMath;
import java.util.Random; import java.util.Random;
@@ -98,12 +97,12 @@ public abstract class Worm {
for(int z = -zRad - 1; z <= zRad + 1; z++) { for(int z = -zRad - 1; z <= zRad + 1; z++) {
if(!(FastMath.floorDiv(origin.getBlockZ() + z, 16) == chunkZ)) continue; if(!(FastMath.floorDiv(origin.getBlockZ() + z, 16) == chunkZ)) continue;
for(int y = -yRad - 1; y <= yRad + 1; y++) { for(int y = -yRad - 1; y <= yRad + 1; y++) {
Vector3 position = origin.clone().add(new Vector3Impl(x, y, z)); Vector3 position = origin.clone().add(new Vector3(x, y, z));
if(position.getY() < world.getMinHeight() || position.getY() > world.getMaxHeight()) continue; if(position.getY() < world.getMinHeight() || position.getY() > world.getMaxHeight()) continue;
double eq = ellipseEquation(x, y, z, xRad, yRad, zRad); double eq = ellipseEquation(x, y, z, xRad, yRad, zRad);
if(eq <= 1 && if(eq <= 1 &&
y >= -yRad - 1 + bottomCut && y <= yRad + 1 - topCut) { y >= -yRad - 1 + bottomCut && y <= yRad + 1 - topCut) {
consumer.accept(new Vector3Impl(position.getBlockX() - originX, position.getBlockY(), position.getBlockZ() - originZ), Carver.CarvingType.CENTER); consumer.accept(new Vector3(position.getBlockX() - originX, position.getBlockY(), position.getBlockZ() - originZ), Carver.CarvingType.CENTER);
} else if(eq <= 1.5) { } else if(eq <= 1.5) {
Carver.CarvingType type = Carver.CarvingType.WALL; Carver.CarvingType type = Carver.CarvingType.WALL;
if(y <= -yRad - 1 + bottomCut) { if(y <= -yRad - 1 + bottomCut) {
@@ -111,7 +110,7 @@ public abstract class Worm {
} else if(y >= yRad + 1 - topCut) { } else if(y >= yRad + 1 - topCut) {
type = Carver.CarvingType.TOP; type = Carver.CarvingType.TOP;
} }
consumer.accept(new Vector3Impl(position.getBlockX() - originX, position.getBlockY(), position.getBlockZ() - originZ), type); consumer.accept(new Vector3(position.getBlockX() - originX, position.getBlockY(), position.getBlockZ() - originZ), type);
} }
} }
} }
@@ -4,7 +4,6 @@ import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.vector.Vector3Impl;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.function.Consumer; import java.util.function.Consumer;
@@ -66,7 +65,7 @@ public abstract class AsyncFeatureFinder<T> implements Runnable {
run++; run++;
toggle = !toggle; toggle = !toggle;
} }
Vector3 finalSpawn = found ? finalizeVector(new Vector3Impl(x, 0, z)) : null; Vector3 finalSpawn = found ? finalizeVector(new Vector3(x, 0, z)) : null;
callback.accept(finalSpawn); callback.accept(finalSpawn);
} }
@@ -5,12 +5,12 @@ import com.dfsek.terra.api.util.FastRandom;
import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.api.util.GlueList;
import com.dfsek.terra.api.util.MathUtil; import com.dfsek.terra.api.util.MathUtil;
import com.dfsek.terra.api.util.PopulationUtil; import com.dfsek.terra.api.util.PopulationUtil;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.api.world.biome.UserDefinedBiome; import com.dfsek.terra.api.world.biome.UserDefinedBiome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.carving.Worm; import com.dfsek.terra.api.world.carving.Worm;
import com.dfsek.terra.vector.Vector3Impl;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader; import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
@@ -37,7 +37,7 @@ public class CarverCache {
if(CarverCache.this.carver.isChunkCarved(w, chunkX, chunkZ, new FastRandom(PopulationUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed() + CarverCache.this.carver.hashCode())))) { if(CarverCache.this.carver.isChunkCarved(w, chunkX, chunkZ, new FastRandom(PopulationUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed() + CarverCache.this.carver.hashCode())))) {
long seed = PopulationUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed()); long seed = PopulationUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed());
Random r = new FastRandom(seed); Random r = new FastRandom(seed);
Worm carving = CarverCache.this.carver.getWorm(seed, new Vector3Impl((chunkX << 4) + r.nextInt(16), CarverCache.this.carver.getConfig().getHeight().get(r), (chunkZ << 4) + r.nextInt(16))); Worm carving = CarverCache.this.carver.getWorm(seed, new Vector3((chunkX << 4) + r.nextInt(16), CarverCache.this.carver.getConfig().getHeight().get(r), (chunkZ << 4) + r.nextInt(16)));
List<Worm.WormPoint> points = new GlueList<>(); List<Worm.WormPoint> points = new GlueList<>();
for(int i = 0; i < carving.getLength(); i++) { for(int i = 0; i < carving.getLength(); i++) {
carving.step(); carving.step();
@@ -20,7 +20,6 @@ import com.dfsek.terra.api.world.carving.Worm;
import com.dfsek.terra.config.loaders.config.function.FunctionTemplate; import com.dfsek.terra.config.loaders.config.function.FunctionTemplate;
import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.config.templates.CarverTemplate; import com.dfsek.terra.config.templates.CarverTemplate;
import com.dfsek.terra.vector.Vector3Impl;
import net.jafama.FastMath; import net.jafama.FastMath;
import java.util.List; import java.util.List;
@@ -156,7 +155,7 @@ public class UserDefinedCarver extends Carver {
this.seed = seed; this.seed = seed;
super.setTopCut(topCut); super.setTopCut(topCut);
super.setBottomCut(bottomCut); super.setBottomCut(bottomCut);
direction = new Vector3Impl((r.nextDouble() - 0.5D) * start[0], (r.nextDouble() - 0.5D) * start[1], (r.nextDouble() - 0.5D) * start[2]).normalize().multiply(step); direction = new Vector3((r.nextDouble() - 0.5D) * start[0], (r.nextDouble() - 0.5D) * start[1], (r.nextDouble() - 0.5D) * start[2]).normalize().multiply(step);
double[] args = {origin.getX(), origin.getY(), origin.getZ(), length, 0, seed}; double[] args = {origin.getX(), origin.getY(), origin.getZ(), length, 0, seed};
setRadius(new int[] {(int) (xRad.evaluate(args)), (int) (yRad.evaluate(args)), (int) (zRad.evaluate(args))}); setRadius(new int[] {(int) (xRad.evaluate(args)), (int) (yRad.evaluate(args)), (int) (zRad.evaluate(args))});
} }
@@ -13,12 +13,12 @@ import com.dfsek.terra.api.command.arg.IntegerArgumentParser;
import com.dfsek.terra.api.entity.CommandSender; import com.dfsek.terra.api.entity.CommandSender;
import com.dfsek.terra.api.entity.Player; import com.dfsek.terra.api.entity.Player;
import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.injection.annotations.Inject;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.api.world.locate.AsyncBiomeFinder; import com.dfsek.terra.api.world.locate.AsyncBiomeFinder;
import com.dfsek.terra.commands.biome.arg.BiomeArgumentParser; import com.dfsek.terra.commands.biome.arg.BiomeArgumentParser;
import com.dfsek.terra.commands.biome.tab.BiomeTabCompleter; import com.dfsek.terra.commands.biome.tab.BiomeTabCompleter;
import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.lang.LangUtil;
import com.dfsek.terra.vector.Vector3Impl;
import java.util.Locale; import java.util.Locale;
@@ -66,9 +66,9 @@ public class BiomeLocateCommand implements CommandTemplate {
new Thread(new AsyncBiomeFinder(main.getWorld(player.world()).getBiomeProvider(), biome, player.position().clone().multiply((1D / main.getTerraConfig().getBiomeSearchResolution())), player.world(), 0, radius, location -> { new Thread(new AsyncBiomeFinder(main.getWorld(player.world()).getBiomeProvider(), biome, player.position().clone().multiply((1D / main.getTerraConfig().getBiomeSearchResolution())), player.world(), 0, radius, location -> {
if(location != null) { if(location != null) {
sender.sendMessage(String.format("The nearest %s is at [%d, ~, %d] (%.1f blocks away)", biome.getID().toLowerCase(Locale.ROOT), location.getBlockX(), location.getBlockZ(), location.add(new Vector3Impl(0, player.position().getY(), 0)).distance(player.position()))); sender.sendMessage(String.format("The nearest %s is at [%d, ~, %d] (%.1f blocks away)", biome.getID().toLowerCase(Locale.ROOT), location.getBlockX(), location.getBlockZ(), location.add(new Vector3(0, player.position().getY(), 0)).distance(player.position())));
if(teleport) { if(teleport) {
main.runPossiblyUnsafeTask(() -> player.position(new Vector3Impl(location.getX(), player.position().getY(), location.getZ()))); main.runPossiblyUnsafeTask(() -> player.position(new Vector3(location.getX(), player.position().getY(), location.getZ())));
} }
} else LangUtil.send("command.biome.unable-to-locate", sender); } else LangUtil.send("command.biome.unable-to-locate", sender);
}, main), "Biome Location Thread").start(); }, main), "Biome Location Thread").start();
@@ -17,7 +17,6 @@ import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer;
import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Position;
import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.util.FastRandom;
import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.vector.Vector3Impl;
import java.util.HashMap; import java.util.HashMap;
@@ -41,7 +40,7 @@ public class SpawnCommand implements CommandTemplate {
Position dummy = new Position(0, 0); Position dummy = new Position(0, 0);
String check = new CheckFunction(main, new NumericConstant(0, dummy), new NumericConstant(0, dummy), new NumericConstant(0, dummy), dummy).apply(new TerraImplementationArguments(new StructureBuffer( String check = new CheckFunction(main, new NumericConstant(0, dummy), new NumericConstant(0, dummy), new NumericConstant(0, dummy), dummy).apply(new TerraImplementationArguments(new StructureBuffer(
new Vector3Impl(x, y, z) new Vector3(x, y, z)
), Rotation.NONE, new FastRandom(), player.world(), 0), new HashMap<>()); ), Rotation.NONE, new FastRandom(), player.world(), 0), new HashMap<>());
sender.sendMessage("Found: " + check); sender.sendMessage("Found: " + check);
@@ -13,11 +13,11 @@ import com.dfsek.terra.api.command.arg.IntegerArgumentParser;
import com.dfsek.terra.api.entity.CommandSender; import com.dfsek.terra.api.entity.CommandSender;
import com.dfsek.terra.api.entity.Player; import com.dfsek.terra.api.entity.Player;
import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.injection.annotations.Inject;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.locate.AsyncStructureFinder; import com.dfsek.terra.api.world.locate.AsyncStructureFinder;
import com.dfsek.terra.commands.structure.argument.StructureArgumentParser; import com.dfsek.terra.commands.structure.argument.StructureArgumentParser;
import com.dfsek.terra.commands.structure.completer.StructureCompleter; import com.dfsek.terra.commands.structure.completer.StructureCompleter;
import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.lang.LangUtil;
import com.dfsek.terra.vector.Vector3Impl;
import com.dfsek.terra.world.population.items.TerraStructure; import com.dfsek.terra.world.population.items.TerraStructure;
import java.util.Locale; import java.util.Locale;
@@ -64,9 +64,9 @@ public class StructureLocateCommand implements CommandTemplate {
new Thread(new AsyncStructureFinder(main.getWorld(player.world()).getBiomeProvider(), structure, player.position().clone().multiply((1D / main.getTerraConfig().getBiomeSearchResolution())), player.world(), 0, radius, location -> { new Thread(new AsyncStructureFinder(main.getWorld(player.world()).getBiomeProvider(), structure, player.position().clone().multiply((1D / main.getTerraConfig().getBiomeSearchResolution())), player.world(), 0, radius, location -> {
if(location != null) { if(location != null) {
sender.sendMessage(String.format("The nearest %s is at [%d, ~, %d] (%.1f blocks away)", structure.getTemplate().getID().toLowerCase(Locale.ROOT), location.getBlockX(), location.getBlockZ(), location.add(new Vector3Impl(0, player.position().getY(), 0)).distance(player.position()))); sender.sendMessage(String.format("The nearest %s is at [%d, ~, %d] (%.1f blocks away)", structure.getTemplate().getID().toLowerCase(Locale.ROOT), location.getBlockX(), location.getBlockZ(), location.add(new Vector3(0, player.position().getY(), 0)).distance(player.position())));
if(teleport) { if(teleport) {
main.runPossiblyUnsafeTask(() -> player.position(new Vector3Impl(location.getX(), player.position().getY(), location.getZ()))); main.runPossiblyUnsafeTask(() -> player.position(new Vector3(location.getX(), player.position().getY(), location.getZ())));
} }
} else LangUtil.send("command.biome.unable-to-locate", sender); } else LangUtil.send("command.biome.unable-to-locate", sender);
}, main), "Biome Location Thread").start(); }, main), "Biome Location Thread").start();
@@ -1,11 +1,11 @@
package com.dfsek.terra.config; package com.dfsek.terra.config;
import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.tectonic.loading.TypeRegistry;
import com.dfsek.terra.api.LoaderRegistrar;
import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.addon.TerraAddon;
import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.BlockType;
import com.dfsek.terra.api.math.GridSpawn; import com.dfsek.terra.api.math.GridSpawn;
import com.dfsek.terra.api.tectonic.LoaderRegistrar;
import com.dfsek.terra.api.util.ProbabilityCollection; import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.util.collections.MaterialSet; import com.dfsek.terra.api.util.collections.MaterialSet;
@@ -40,17 +40,10 @@ import com.dfsek.terra.config.loaders.config.biome.templates.stage.mutator.Repla
import com.dfsek.terra.config.loaders.config.biome.templates.stage.mutator.ReplaceMutatorTemplate; import com.dfsek.terra.config.loaders.config.biome.templates.stage.mutator.ReplaceMutatorTemplate;
import com.dfsek.terra.config.loaders.config.biome.templates.stage.mutator.SmoothMutatorTemplate; import com.dfsek.terra.config.loaders.config.biome.templates.stage.mutator.SmoothMutatorTemplate;
import com.dfsek.terra.config.loaders.config.function.FunctionTemplate; import com.dfsek.terra.config.loaders.config.function.FunctionTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.DomainWarpTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.ImageSamplerTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.ClampNormalizerTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.LinearNormalizerTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.NormalNormalizerTemplate;
import com.dfsek.terra.config.loaders.palette.CarverPaletteLoader; import com.dfsek.terra.config.loaders.palette.CarverPaletteLoader;
import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader; import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader;
import com.dfsek.terra.config.loaders.palette.PaletteLayerLoader; import com.dfsek.terra.config.loaders.palette.PaletteLayerLoader;
import com.dfsek.terra.config.loaders.palette.slant.SlantHolderLoader; import com.dfsek.terra.config.loaders.palette.slant.SlantHolderLoader;
import com.dfsek.terra.noise.samplers.ImageSampler;
import com.dfsek.terra.noise.samplers.noise.CellularSampler;
import com.dfsek.terra.world.population.items.flora.FloraLayer; import com.dfsek.terra.world.population.items.flora.FloraLayer;
import com.dfsek.terra.world.population.items.flora.TerraFlora; import com.dfsek.terra.world.population.items.flora.TerraFlora;
import com.dfsek.terra.world.population.items.ores.OreConfig; import com.dfsek.terra.world.population.items.ores.OreConfig;
@@ -79,11 +72,6 @@ public class GenericLoaders implements LoaderRegistrar {
.registerLoader(TreeLayer.class, new TreeLayerLoader()) .registerLoader(TreeLayer.class, new TreeLayerLoader())
.registerLoader(MaterialSet.class, new MaterialSetLoader()) .registerLoader(MaterialSet.class, new MaterialSetLoader())
.registerLoader(OreHolder.class, new OreHolderLoader()) .registerLoader(OreHolder.class, new OreHolderLoader())
.registerLoader(ImageSamplerTemplate.class, ImageSamplerTemplate::new)
.registerLoader(DomainWarpTemplate.class, DomainWarpTemplate::new)
.registerLoader(LinearNormalizerTemplate.class, LinearNormalizerTemplate::new)
.registerLoader(NormalNormalizerTemplate.class, NormalNormalizerTemplate::new)
.registerLoader(ClampNormalizerTemplate.class, ClampNormalizerTemplate::new)
.registerLoader(ReplaceMutatorTemplate.class, ReplaceMutatorTemplate::new) .registerLoader(ReplaceMutatorTemplate.class, ReplaceMutatorTemplate::new)
.registerLoader(ExpanderStageTemplate.class, ExpanderStageTemplate::new) .registerLoader(ExpanderStageTemplate.class, ExpanderStageTemplate::new)
.registerLoader(SmoothMutatorTemplate.class, SmoothMutatorTemplate::new) .registerLoader(SmoothMutatorTemplate.class, SmoothMutatorTemplate::new)
@@ -97,14 +85,11 @@ public class GenericLoaders implements LoaderRegistrar {
.registerLoader(SourceSeeded.class, new SourceBuilderLoader()) .registerLoader(SourceSeeded.class, new SourceBuilderLoader())
.registerLoader(StageSeeded.class, new StageBuilderLoader()) .registerLoader(StageSeeded.class, new StageBuilderLoader())
.registerLoader(BiomeProvider.BiomeProviderBuilder.class, new BiomeProviderBuilderLoader()) .registerLoader(BiomeProvider.BiomeProviderBuilder.class, new BiomeProviderBuilderLoader())
.registerLoader(ImageSampler.Channel.class, (t, object, cf) -> ImageSampler.Channel.valueOf((String) object))
.registerLoader(BiomeProvider.Type.class, (t, object, cf) -> BiomeProvider.Type.valueOf((String) object)) .registerLoader(BiomeProvider.Type.class, (t, object, cf) -> BiomeProvider.Type.valueOf((String) object))
.registerLoader(BiomeSource.Type.class, (t, object, cf) -> BiomeSource.Type.valueOf((String) object)) .registerLoader(BiomeSource.Type.class, (t, object, cf) -> BiomeSource.Type.valueOf((String) object))
.registerLoader(ImageBiomeProvider.Align.class, (t, object, cf) -> ImageBiomeProvider.Align.valueOf((String) object)) .registerLoader(ImageBiomeProvider.Align.class, (t, object, cf) -> ImageBiomeProvider.Align.valueOf((String) object))
.registerLoader(ExpanderStage.Type.class, (t, object, cf) -> ExpanderStage.Type.valueOf((String) object)) .registerLoader(ExpanderStage.Type.class, (t, object, cf) -> ExpanderStage.Type.valueOf((String) object))
.registerLoader(MutatorStage.Type.class, (t, object, cf) -> MutatorStage.Type.valueOf((String) object)) .registerLoader(MutatorStage.Type.class, (t, object, cf) -> MutatorStage.Type.valueOf((String) object))
.registerLoader(CellularSampler.ReturnType.class, (t, object, cf) -> CellularSampler.ReturnType.valueOf((String) object))
.registerLoader(CellularSampler.DistanceFunction.class, (t, object, cf) -> CellularSampler.DistanceFunction.valueOf((String) object))
.registerLoader(TerraFlora.Search.class, (t, o, l) -> TerraFlora.Search.valueOf(o.toString())); .registerLoader(TerraFlora.Search.class, (t, o, l) -> TerraFlora.Search.valueOf(o.toString()));
if(main != null) { if(main != null) {
@@ -11,7 +11,6 @@ import com.dfsek.terra.config.loaders.config.function.FunctionTemplate;
import com.dfsek.terra.config.pack.ConfigPackImpl; import com.dfsek.terra.config.pack.ConfigPackImpl;
import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.noise.samplers.ExpressionSampler; import com.dfsek.terra.noise.samplers.ExpressionSampler;
import com.dfsek.terra.noise.samplers.noise.ConstantSampler;
import com.dfsek.terra.world.generation.WorldGenerator; import com.dfsek.terra.world.generation.WorldGenerator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@@ -48,7 +47,7 @@ public class UserDefinedBiomeBuilder implements BiomeBuilder {
try { try {
noise = new ExpressionSampler(template.getNoiseEquation(), varScope, seed, noiseBuilderMap, functionTemplateMap); noise = new ExpressionSampler(template.getNoiseEquation(), varScope, seed, noiseBuilderMap, functionTemplateMap);
elevation = template.getElevationEquation() == null ? new ConstantSampler(0) : new ExpressionSampler(template.getElevationEquation(), varScope, seed, noiseBuilderMap, functionTemplateMap); elevation = template.getElevationEquation() == null ? NoiseSampler.zero() : new ExpressionSampler(template.getElevationEquation(), varScope, seed, noiseBuilderMap, functionTemplateMap);
carving = new ExpressionSampler(template.getCarvingEquation(), varScope, seed, noiseBuilderMap, functionTemplateMap); carving = new ExpressionSampler(template.getCarvingEquation(), varScope, seed, noiseBuilderMap, functionTemplateMap);
} catch(ParseException e) { } catch(ParseException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
@@ -17,7 +17,7 @@ public abstract class BiomeProviderTemplate implements ObjectTemplate<BiomeProvi
protected NoiseSeeded blend = new NoiseSeeded() { protected NoiseSeeded blend = new NoiseSeeded() {
@Override @Override
public NoiseSampler apply(Long seed) { public NoiseSampler apply(Long seed) {
return new ConstantSampler(0); return NoiseSampler.zero();
} }
@Override @Override
@@ -2,12 +2,15 @@ package com.dfsek.terra.config.pack;
import com.dfsek.paralithic.eval.parser.Scope; import com.dfsek.paralithic.eval.parser.Scope;
import com.dfsek.tectonic.abstraction.AbstractConfigLoader; import com.dfsek.tectonic.abstraction.AbstractConfigLoader;
import com.dfsek.tectonic.abstraction.TemplateProvider;
import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.config.ConfigTemplate;
import com.dfsek.tectonic.config.Configuration; import com.dfsek.tectonic.config.Configuration;
import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.ConfigException;
import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.tectonic.loading.TypeRegistry;
import com.dfsek.tectonic.loading.object.ObjectTemplate;
import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.addon.TerraAddon;
import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigPack;
@@ -24,7 +27,6 @@ import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.structures.script.StructureScript;
import com.dfsek.terra.api.util.generic.pair.ImmutablePair; import com.dfsek.terra.api.util.generic.pair.ImmutablePair;
import com.dfsek.terra.api.util.seeded.NoiseProvider; import com.dfsek.terra.api.util.seeded.NoiseProvider;
import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import com.dfsek.terra.api.world.TerraWorld; import com.dfsek.terra.api.world.TerraWorld;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.config.builder.BiomeBuilder; import com.dfsek.terra.config.builder.BiomeBuilder;
@@ -36,8 +38,6 @@ import com.dfsek.terra.config.loaders.config.BufferedImageLoader;
import com.dfsek.terra.config.loaders.config.biome.templates.provider.BiomePipelineTemplate; import com.dfsek.terra.config.loaders.config.biome.templates.provider.BiomePipelineTemplate;
import com.dfsek.terra.config.loaders.config.biome.templates.provider.ImageProviderTemplate; import com.dfsek.terra.config.loaders.config.biome.templates.provider.ImageProviderTemplate;
import com.dfsek.terra.config.loaders.config.biome.templates.provider.SingleBiomeProviderTemplate; import com.dfsek.terra.config.loaders.config.biome.templates.provider.SingleBiomeProviderTemplate;
import com.dfsek.terra.config.loaders.config.sampler.NoiseSamplerBuilderLoader;
import com.dfsek.terra.config.loaders.config.sampler.templates.ImageSamplerTemplate;
import com.dfsek.terra.config.prototype.ProtoConfig; import com.dfsek.terra.config.prototype.ProtoConfig;
import com.dfsek.terra.registry.CheckedRegistryImpl; import com.dfsek.terra.registry.CheckedRegistryImpl;
import com.dfsek.terra.registry.OpenRegistryImpl; import com.dfsek.terra.registry.OpenRegistryImpl;
@@ -54,6 +54,7 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -72,6 +73,9 @@ import java.util.zip.ZipFile;
public class ConfigPackImpl implements ConfigPack { public class ConfigPackImpl implements ConfigPack {
private final ConfigPackTemplate template = new ConfigPackTemplate(); private final ConfigPackTemplate template = new ConfigPackTemplate();
private final Map<Type, TypeLoader<?>> loaders = new HashMap<>();
private final Map<Type, TemplateProvider<ObjectTemplate<?>>> objectLoaders = new HashMap<>();
private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader(); private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader();
private final ConfigLoader selfLoader = new ConfigLoader(); private final ConfigLoader selfLoader = new ConfigLoader();
private final Scope varScope = new Scope(); private final Scope varScope = new Scope();
@@ -205,6 +209,18 @@ public class ConfigPackImpl implements ConfigPack {
private void checkDeadEntries(TerraPlugin main) { private void checkDeadEntries(TerraPlugin main) {
registryMap.forEach((clazz, pair) -> ((OpenRegistryImpl<?>) pair.getLeft()).getDeadEntries().forEach((id, value) -> main.getDebugLogger().warning("Dead entry in '" + clazz + "' registry: '" + id + "'"))); registryMap.forEach((clazz, pair) -> ((OpenRegistryImpl<?>) pair.getLeft()).getDeadEntries().forEach((id, value) -> main.getDebugLogger().warning("Dead entry in '" + clazz + "' registry: '" + id + "'")));
} }
@Override
public <T> ConfigPackImpl applyLoader(Type type, TypeLoader<T> loader) {
loaders.put(type, loader);
return this;
}
@SuppressWarnings("unchecked")
@Override
public <T> ConfigPackImpl applyLoader(Type type, TemplateProvider<ObjectTemplate<T>> loader) {
objectLoaders.put(type, (TemplateProvider<ObjectTemplate<?>>) ((Object) loader));
return this;
}
protected Map<Class<?>, ImmutablePair<OpenRegistry<?>, CheckedRegistry<?>>> getRegistryMap() { protected Map<Class<?>, ImmutablePair<OpenRegistry<?>, CheckedRegistry<?>>> getRegistryMap() {
return registryMap; return registryMap;
@@ -282,6 +298,7 @@ public class ConfigPackImpl implements ConfigPack {
} }
@SuppressWarnings("unchecked")
@Override @Override
public void register(TypeRegistry registry) { public void register(TypeRegistry registry) {
registry registry
@@ -289,9 +306,9 @@ public class ConfigPackImpl implements ConfigPack {
.registerLoader(BufferedImage.class, new BufferedImageLoader(loader)) .registerLoader(BufferedImage.class, new BufferedImageLoader(loader))
.registerLoader(SingleBiomeProviderTemplate.class, SingleBiomeProviderTemplate::new) .registerLoader(SingleBiomeProviderTemplate.class, SingleBiomeProviderTemplate::new)
.registerLoader(BiomePipelineTemplate.class, () -> new BiomePipelineTemplate(main)) .registerLoader(BiomePipelineTemplate.class, () -> new BiomePipelineTemplate(main))
.registerLoader(ImageProviderTemplate.class, () -> new ImageProviderTemplate(getRegistry(BiomeBuilder.class))) .registerLoader(ImageProviderTemplate.class, () -> new ImageProviderTemplate(getRegistry(BiomeBuilder.class)));
.registerLoader(ImageSamplerTemplate.class, () -> new ImageProviderTemplate(getRegistry(BiomeBuilder.class))) loaders.forEach(registry::registerLoader);
.registerLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(getOpenRegistry(NoiseProvider.class))); objectLoaders.forEach((t, l) -> registry.registerLoader(t, (TemplateProvider<ObjectTemplate<Object>>) ((Object) l)));
} }
@Override @Override
@@ -7,8 +7,6 @@ import com.dfsek.terra.api.addon.TerraAddon;
import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import com.dfsek.terra.config.loaders.config.function.FunctionTemplate; import com.dfsek.terra.config.loaders.config.function.FunctionTemplate;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@@ -25,7 +25,6 @@ import com.dfsek.terra.api.world.palette.slant.SlantHolder;
import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.carving.UserDefinedCarver;
import com.dfsek.terra.config.loaders.config.function.FunctionTemplate; import com.dfsek.terra.config.loaders.config.function.FunctionTemplate;
import com.dfsek.terra.config.pack.ConfigPackImpl; import com.dfsek.terra.config.pack.ConfigPackImpl;
import com.dfsek.terra.noise.samplers.noise.ConstantSampler;
import com.dfsek.terra.world.population.items.TerraStructure; import com.dfsek.terra.world.population.items.TerraStructure;
import com.dfsek.terra.world.population.items.flora.FloraLayer; import com.dfsek.terra.world.population.items.flora.FloraLayer;
import com.dfsek.terra.world.population.items.ores.OreHolder; import com.dfsek.terra.world.population.items.ores.OreHolder;
@@ -248,7 +247,7 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf
biomeNoise = new NoiseSeeded() { biomeNoise = new NoiseSeeded() {
@Override @Override
public NoiseSampler apply(Long seed) { public NoiseSampler apply(Long seed) {
return new ConstantSampler(0); return NoiseSampler.zero();
} }
@Override @Override
@@ -1,62 +1,10 @@
package com.dfsek.terra.registry.config; package com.dfsek.terra.registry.config;
import com.dfsek.terra.api.util.seeded.NoiseProvider; import com.dfsek.terra.api.util.seeded.NoiseProvider;
import com.dfsek.terra.config.loaders.config.sampler.templates.DomainWarpTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.ImageSamplerTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.KernelTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.noise.CellularNoiseTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.noise.ConstantNoiseTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.noise.ExpressionFunctionTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.noise.GaborNoiseTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.noise.SimpleNoiseTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.noise.fractal.BrownianMotionTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.noise.fractal.PingPongTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.noise.fractal.RidgedFractalTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.ClampNormalizerTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.LinearNormalizerTemplate;
import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.NormalNormalizerTemplate;
import com.dfsek.terra.noise.samplers.noise.random.GaussianNoiseSampler;
import com.dfsek.terra.noise.samplers.noise.random.WhiteNoiseSampler;
import com.dfsek.terra.noise.samplers.noise.simplex.OpenSimplex2SSampler;
import com.dfsek.terra.noise.samplers.noise.simplex.OpenSimplex2Sampler;
import com.dfsek.terra.noise.samplers.noise.simplex.PerlinSampler;
import com.dfsek.terra.noise.samplers.noise.simplex.SimplexSampler;
import com.dfsek.terra.noise.samplers.noise.value.ValueCubicSampler;
import com.dfsek.terra.noise.samplers.noise.value.ValueSampler;
import com.dfsek.terra.registry.OpenRegistryImpl; import com.dfsek.terra.registry.OpenRegistryImpl;
public class NoiseRegistry extends OpenRegistryImpl<NoiseProvider> { public class NoiseRegistry extends OpenRegistryImpl<NoiseProvider> {
public NoiseRegistry() { public NoiseRegistry() {
add("LINEAR", LinearNormalizerTemplate::new);
add("NORMAL", NormalNormalizerTemplate::new);
add("CLAMP", ClampNormalizerTemplate::new);
add("EXPRESSION", ExpressionFunctionTemplate::new);
add("IMAGE", ImageSamplerTemplate::new);
add("DOMAINWARP", DomainWarpTemplate::new);
add("FBM", BrownianMotionTemplate::new);
add("PINGPONG", PingPongTemplate::new);
add("RIDGED", RidgedFractalTemplate::new);
add("OPENSIMPLEX2", () -> new SimpleNoiseTemplate(OpenSimplex2Sampler::new));
add("OPENSIMPLEX2S", () -> new SimpleNoiseTemplate(OpenSimplex2SSampler::new));
add("PERLIN", () -> new SimpleNoiseTemplate(PerlinSampler::new));
add("SIMPLEX", () -> new SimpleNoiseTemplate(SimplexSampler::new));
add("GABOR", GaborNoiseTemplate::new);
add("VALUE", () -> new SimpleNoiseTemplate(ValueSampler::new));
add("VALUECUBIC", () -> new SimpleNoiseTemplate(ValueCubicSampler::new));
add("CELLULAR", CellularNoiseTemplate::new);
add("WHITENOISE", () -> new SimpleNoiseTemplate(WhiteNoiseSampler::new));
add("GAUSSIAN", () -> new SimpleNoiseTemplate(GaussianNoiseSampler::new));
add("CONSTANT", ConstantNoiseTemplate::new);
add("KERNEL", KernelTemplate::new);
} }
} }
@@ -144,7 +144,7 @@ public class Vector2Impl implements Vector2 {
@Override @Override
public Vector3 extrude(double y) { public Vector3 extrude(double y) {
return new Vector3Impl(this.x, y, this.z); return new Vector3(this.x, y, this.z);
} }
@Override @Override
@@ -1,263 +0,0 @@
package com.dfsek.terra.vector;
import com.dfsek.terra.api.util.MathUtil;
import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.vector.Vector3;
import net.jafama.FastMath;
import org.jetbrains.annotations.NotNull;
/**
* 3D Mutable Vector
*/
public class Vector3Impl implements Vector3 {
private double x;
private double y;
private double z;
public Vector3Impl(double x, double y, double z) {
this.x = x;
this.y = y;
this.z = z;
}
@Override
public double getZ() {
return z;
}
@Override
public Vector3 setZ(double z) {
this.z = z;
return this;
}
@Override
public double getX() {
return x;
}
@Override
public Vector3 setX(double x) {
this.x = x;
return this;
}
@Override
public double getY() {
return y;
}
@Override
public Vector3 setY(double y) {
this.y = y;
return this;
}
@Override
public int getBlockX() {
return FastMath.floorToInt(x);
}
@Override
public int getBlockY() {
return FastMath.floorToInt(y);
}
@Override
public int getBlockZ() {
return FastMath.floorToInt(z);
}
@Override
public Vector3 multiply(double m) {
x *= m;
y *= m;
z *= m;
return this;
}
@Override
public Vector3 add(double x, double y, double z) {
this.x += x;
this.y += y;
this.z += z;
return this;
}
@Override
public Vector3 add(Vector3 other) {
this.x += other.getX();
this.y += other.getY();
this.z += other.getZ();
return this;
}
@Override
public Vector3 add(Vector2 other) {
this.x += other.getX();
this.z += other.getZ();
return this;
}
@Override
public double lengthSquared() {
return x * x + y * y + z * z;
}
@Override
public Vector3Impl clone() {
try {
return (Vector3Impl) super.clone();
} catch(CloneNotSupportedException e) {
throw new Error(e);
}
}
@Override
public double length() {
return FastMath.sqrt(lengthSquared());
}
@Override
public double inverseLength() {
return FastMath.invSqrtQuick(lengthSquared());
}
@Override
public boolean isNormalized() {
return MathUtil.equals(this.lengthSquared(), 1);
}
@Override
@NotNull
public Vector3 rotateAroundX(double angle) {
double angleCos = Math.cos(angle);
double angleSin = Math.sin(angle);
double y = angleCos * getY() - angleSin * getZ();
double z = angleSin * getY() + angleCos * getZ();
return setY(y).setZ(z);
}
@Override
@NotNull
public Vector3 rotateAroundY(double angle) {
double angleCos = Math.cos(angle);
double angleSin = Math.sin(angle);
double x = angleCos * getX() + angleSin * getZ();
double z = -angleSin * getX() + angleCos * getZ();
return setX(x).setZ(z);
}
@Override
@NotNull
public Vector3 rotateAroundZ(double angle) {
double angleCos = Math.cos(angle);
double angleSin = Math.sin(angle);
double x = angleCos * getX() - angleSin * getY();
double y = angleSin * getX() + angleCos * getY();
return setX(x).setY(y);
}
@Override
public double distance(@NotNull Vector3 o) {
return FastMath.sqrt(FastMath.pow2(x - o.getX()) + FastMath.pow2(y - o.getY()) + FastMath.pow2(z - o.getZ()));
}
@Override
public double distanceSquared(@NotNull Vector3 o) {
return FastMath.pow2(x - o.getX()) + FastMath.pow2(y - o.getY()) + FastMath.pow2(z - o.getZ());
}
@Override
@NotNull
public Vector3 rotateAroundAxis(@NotNull Vector3 axis, double angle) throws IllegalArgumentException {
return rotateAroundNonUnitAxis(axis.isNormalized() ? axis : axis.clone().normalize(), angle);
}
@Override
@NotNull
public Vector3 rotateAroundNonUnitAxis(@NotNull Vector3 axis, double angle) throws IllegalArgumentException {
double x = getX(), y = getY(), z = getZ();
double x2 = axis.getX(), y2 = axis.getY(), z2 = axis.getZ();
double cosTheta = Math.cos(angle);
double sinTheta = Math.sin(angle);
double dotProduct = this.dot(axis);
double xPrime = x2 * dotProduct * (1d - cosTheta)
+ x * cosTheta
+ (-z2 * y + y2 * z) * sinTheta;
double yPrime = y2 * dotProduct * (1d - cosTheta)
+ y * cosTheta
+ (z2 * x - x2 * z) * sinTheta;
double zPrime = z2 * dotProduct * (1d - cosTheta)
+ z * cosTheta
+ (-y2 * x + x2 * y) * sinTheta;
return setX(xPrime).setY(yPrime).setZ(zPrime);
}
@Override
public double dot(@NotNull Vector3 other) {
return x * other.getX() + y * other.getY() + z * other.getZ();
}
@Override
public Vector3 normalize() {
return this.multiply(this.inverseLength());
}
@Override
public Vector3 subtract(int x, int y, int z) {
this.x -= x;
this.y -= y;
this.z -= z;
return this;
}
@Override
public Vector3 subtract(Vector3 end) {
x -= end.getX();
y -= end.getY();
z -= end.getZ();
return this;
}
/**
* Returns a hash code for this vector
*
* @return hash code
*/
@Override
public int hashCode() {
int hash = 7;
hash = 79 * hash + (int) (Double.doubleToLongBits(this.x) ^ (Double.doubleToLongBits(this.x) >>> 32));
hash = 79 * hash + (int) (Double.doubleToLongBits(this.y) ^ (Double.doubleToLongBits(this.y) >>> 32));
hash = 79 * hash + (int) (Double.doubleToLongBits(this.z) ^ (Double.doubleToLongBits(this.z) >>> 32));
return hash;
}
/**
* Checks to see if two objects are equal.
* <p>
* Only two Vectors can ever return true. This method uses a fuzzy match
* to account for floating point errors. The epsilon can be retrieved
* with epsilon.
*/
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Vector3)) return false;
Vector3 other = (Vector3) obj;
return MathUtil.equals(x, other.getX()) && MathUtil.equals(y, other.getY()) && MathUtil.equals(z, other.getZ());
}
@Override
public String toString() {
return "(" + getX() + ", " + getY() + ", " + getZ() + ")";
}
}
@@ -24,7 +24,6 @@ import com.dfsek.terra.api.world.generator.TerraBlockPopulator;
import com.dfsek.terra.api.world.generator.TerraChunkGenerator; import com.dfsek.terra.api.world.generator.TerraChunkGenerator;
import com.dfsek.terra.api.world.palette.PaletteImpl; import com.dfsek.terra.api.world.palette.PaletteImpl;
import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.vector.Vector3Impl;
import com.dfsek.terra.world.Carver; import com.dfsek.terra.world.Carver;
import com.dfsek.terra.world.carving.NoiseCarver; import com.dfsek.terra.world.carving.NoiseCarver;
import com.dfsek.terra.world.generation.math.samplers.Sampler3D; import com.dfsek.terra.world.generation.math.samplers.Sampler3D;
@@ -108,20 +107,20 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator {
data = PaletteUtil.getPalette(x, y, z, c, sampler).get(paletteLevel, cx, y, cz); data = PaletteUtil.getPalette(x, y, z, c, sampler).get(paletteLevel, cx, y, cz);
chunk.setBlock(x, y, z, data); chunk.setBlock(x, y, z, data);
if(paletteLevel == 0 && c.doSlabs() && y < 255) { if(paletteLevel == 0 && c.doSlabs() && y < 255) {
prepareBlockPartFloor(data, chunk.getBlock(x, y + 1, z), chunk, new Vector3Impl(x, y + 1, z), c.getSlabPalettes(), prepareBlockPartFloor(data, chunk.getBlock(x, y + 1, z), chunk, new Vector3(x, y + 1, z), c.getSlabPalettes(),
c.getStairPalettes(), c.getSlabThreshold(), sampler); c.getStairPalettes(), c.getSlabThreshold(), sampler);
} }
paletteLevel++; paletteLevel++;
} else if(y <= sea) { } else if(y <= sea) {
chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, y, z + zOrig)); chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, y, z + zOrig));
if(justSet && c.doSlabs()) { if(justSet && c.doSlabs()) {
prepareBlockPartCeiling(data, chunk.getBlock(x, y, z), chunk, new Vector3Impl(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); prepareBlockPartCeiling(data, chunk.getBlock(x, y, z), chunk, new Vector3(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler);
} }
justSet = false; justSet = false;
paletteLevel = 0; paletteLevel = 0;
} else { } else {
if(justSet && c.doSlabs()) { if(justSet && c.doSlabs()) {
prepareBlockPartCeiling(data, chunk.getBlock(x, y, z), chunk, new Vector3Impl(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); prepareBlockPartCeiling(data, chunk.getBlock(x, y, z), chunk, new Vector3(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler);
} }
justSet = false; justSet = false;
paletteLevel = 0; paletteLevel = 0;
@@ -5,7 +5,6 @@ import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.biome.Generator;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.vector.Vector3Impl;
import net.jafama.FastMath; import net.jafama.FastMath;
import java.util.HashMap; import java.util.HashMap;
@@ -68,7 +67,7 @@ public class ChunkInterpolator2D implements ChunkInterpolator {
} }
public double computeNoise(Generator generator, double x, double y, double z) { public double computeNoise(Generator generator, double x, double y, double z) {
return noiseGetter.apply(generator, new Vector3Impl(x, y, z)); return noiseGetter.apply(generator, new Vector3(x, y, z));
} }
/** /**
@@ -5,7 +5,6 @@ import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.biome.Generator;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.vector.Vector3Impl;
import net.jafama.FastMath; import net.jafama.FastMath;
import java.util.HashMap; import java.util.HashMap;
@@ -83,7 +82,7 @@ public class ChunkInterpolator3D implements ChunkInterpolator {
} }
public double computeNoise(Generator generator, double x, double y, double z) { public double computeNoise(Generator generator, double x, double y, double z) {
return noiseGetter.apply(generator, new Vector3Impl(x, y, z)); return noiseGetter.apply(generator, new Vector3(x, y, z));
} }
private static int reRange(int value, int high) { private static int reRange(int value, int high) {
@@ -4,6 +4,7 @@ import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.profiler.ProfileFrame; import com.dfsek.terra.api.profiler.ProfileFrame;
import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.util.FastRandom;
import com.dfsek.terra.api.util.PopulationUtil; import com.dfsek.terra.api.util.PopulationUtil;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.Chunk; import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.world.TerraWorld; import com.dfsek.terra.api.world.TerraWorld;
import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.World;
@@ -11,7 +12,6 @@ import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.api.world.biome.UserDefinedBiome; import com.dfsek.terra.api.world.biome.UserDefinedBiome;
import com.dfsek.terra.api.world.generator.TerraBlockPopulator; import com.dfsek.terra.api.world.generator.TerraBlockPopulator;
import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.vector.Vector3Impl;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Random; import java.util.Random;
@@ -44,7 +44,7 @@ public class OrePopulator implements TerraBlockPopulator {
try(ProfileFrame ignored = main.getProfiler().profile("ore:" + id)) { try(ProfileFrame ignored = main.getProfiler().profile("ore:" + id)) {
int amount = orePair.getRight().getAmount().get(random); int amount = orePair.getRight().getAmount().get(random);
for(int i = 0; i < amount; i++) { for(int i = 0; i < amount; i++) {
Vector3Impl location = new Vector3Impl(random.nextInt(16) + 16 * finalCx, orePair.getRight().getHeight().get(random), random.nextInt(16) + 16 * finalCz); Vector3 location = new Vector3(random.nextInt(16) + 16 * finalCx, orePair.getRight().getHeight().get(random), random.nextInt(16) + 16 * finalCz);
orePair.getLeft().generate(location, chunk, random); orePair.getLeft().generate(location, chunk, random);
} }
} }
@@ -12,7 +12,6 @@ import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.world.Flora; import com.dfsek.terra.api.world.Flora;
import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.generator.Palette; import com.dfsek.terra.api.world.generator.Palette;
import com.dfsek.terra.vector.Vector3Impl;
import net.jafama.FastMath; import net.jafama.FastMath;
import java.util.ArrayList; import java.util.ArrayList;
@@ -59,7 +58,7 @@ public class TerraFlora implements Flora {
@Override @Override
public List<Vector3> getValidSpawnsAt(Chunk chunk, int x, int z, Range range) { public List<Vector3> getValidSpawnsAt(Chunk chunk, int x, int z, Range range) {
int size = floraPalette.getSize(); int size = floraPalette.getSize();
Vector3 current = new Vector3Impl(x, search.equals(Search.UP) ? range.getMin() : range.getMax(), z); Vector3 current = new Vector3(x, search.equals(Search.UP) ? range.getMin() : range.getMax(), z);
List<Vector3> blocks = new ArrayList<>(); List<Vector3> blocks = new ArrayList<>();
int cx = chunk.getX() << 4; int cx = chunk.getX() << 4;
int cz = chunk.getZ() << 4; int cz = chunk.getZ() << 4;
@@ -4,8 +4,8 @@ import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.BlockType;
import com.dfsek.terra.api.util.collections.MaterialSet; import com.dfsek.terra.api.util.collections.MaterialSet;
import com.dfsek.terra.api.vector.Vector3;
import com.dfsek.terra.api.world.Chunk; import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.vector.Vector3Impl;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
@@ -26,7 +26,7 @@ public abstract class Ore {
this.materials = materials; this.materials = materials;
} }
public abstract void generate(Vector3Impl origin, Chunk c, Random r); public abstract void generate(Vector3 origin, Chunk c, Random r);
public BlockState getMaterial(BlockType replace) { public BlockState getMaterial(BlockType replace) {
return materials.getOrDefault(replace, material); return materials.getOrDefault(replace, material);

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