mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-04-17 05:40:16 +00:00
Add point sets to layered gen
This commit is contained in:
@@ -17,6 +17,15 @@ import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerSamplerPackConfigT
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.palette.BiomeDefinedLayerPaletteTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.palette.PlatformAirLayerPaletteTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.palette.SimpleLayerPaletteTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.AdjacentPointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.SimplePointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.CubePointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.CuboidPointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.SphericalPointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.DifferencePointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.ExpressionFilterPointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.IntersectionPointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.UnionPointSetTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredicateTemplate;
|
||||
@@ -30,6 +39,8 @@ import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPale
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerListLayerPredicate.CoordinateTest;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
|
||||
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
||||
import com.dfsek.terra.api.Platform;
|
||||
@@ -47,6 +58,9 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(LayeredChunkGenerator.class);
|
||||
|
||||
public static final TypeKey<Supplier<ObjectTemplate<PointSet>>> POINT_SET_TYPE_TOKEN = new TypeKey<>() {
|
||||
};
|
||||
|
||||
public static final TypeKey<Supplier<ObjectTemplate<LayerSampler>>> LAYER_SAMPLER_TYPE_TOKEN = new TypeKey<>() {
|
||||
};
|
||||
|
||||
@@ -81,6 +95,25 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer {
|
||||
.getHandler(FunctionalEventHandler.class)
|
||||
.register(addon, ConfigPackPreLoadEvent.class)
|
||||
.priority(1000)
|
||||
.then(event -> {
|
||||
event.getPack().applyLoader(BooleanOperator.class,
|
||||
(type, o, loader, depthTracker) -> BooleanOperator.valueOf((String) o));
|
||||
|
||||
CheckedRegistry<Supplier<ObjectTemplate<PointSet>>> pointSetTypeRegistry = event.getPack().getOrCreateRegistry(
|
||||
POINT_SET_TYPE_TOKEN);
|
||||
pointSetTypeRegistry.register(addon.key("LIST"), SimplePointSetTemplate::new);
|
||||
pointSetTypeRegistry.register(addon.key("ADJACENT"), AdjacentPointSetTemplate::new);
|
||||
|
||||
pointSetTypeRegistry.register(addon.key("SPHERE"), SphericalPointSetTemplate::new);
|
||||
pointSetTypeRegistry.register(addon.key("CUBOID"), CuboidPointSetTemplate::new);
|
||||
pointSetTypeRegistry.register(addon.key("CUBE"), CubePointSetTemplate::new);
|
||||
|
||||
pointSetTypeRegistry.register(addon.key("UNION"), UnionPointSetTemplate::new);
|
||||
pointSetTypeRegistry.register(addon.key("INTERSECTION"), IntersectionPointSetTemplate::new);
|
||||
pointSetTypeRegistry.register(addon.key("DIFFERENCE"), DifferencePointSetTemplate::new);
|
||||
|
||||
pointSetTypeRegistry.register(addon.key("EXPRESSION"), ExpressionFilterPointSetTemplate::new);
|
||||
})
|
||||
.then(event -> {
|
||||
CheckedRegistry<Supplier<ObjectTemplate<LayerSampler>>> samplerTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TYPE_TOKEN);
|
||||
CheckedRegistry<InstanceWrapper<LayerSampler>> samplerRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TOKEN);
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.AdjacentPointSet;
|
||||
|
||||
|
||||
public class AdjacentPointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
return new AdjacentPointSet();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.SimplePointSet;
|
||||
import com.dfsek.terra.api.util.vector.Vector3Int;
|
||||
|
||||
|
||||
public class SimplePointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Value("points")
|
||||
private Set<Vector3Int> list;
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
return new SimplePointSet(list);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.CuboidPointSet;
|
||||
|
||||
|
||||
public class CubePointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Value("size")
|
||||
private int size;
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
return new CuboidPointSet(-size, -size, -size, size, size, size);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.CuboidPointSet;
|
||||
|
||||
|
||||
public class CuboidPointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Value("size.x")
|
||||
private int xSize;
|
||||
|
||||
@Value("size.y")
|
||||
private int ySize;
|
||||
|
||||
@Value("size.z")
|
||||
private int zSize;
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
return new CuboidPointSet(-xSize, -ySize, -zSize, xSize, ySize, zSize);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.SphericalPointSet;
|
||||
|
||||
|
||||
public class SphericalPointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Value("radius")
|
||||
private double radius;
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
return new SphericalPointSet(radius);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.DifferencePointSet;
|
||||
|
||||
|
||||
public class DifferencePointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Value("point-sets")
|
||||
private List<PointSet> set;
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
return new DifferencePointSet(set);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative;
|
||||
|
||||
import com.dfsek.paralithic.eval.tokenizer.ParseException;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.ExpressionFilterPointSet;
|
||||
|
||||
|
||||
public class ExpressionFilterPointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Value("point-set")
|
||||
private PointSet set;
|
||||
|
||||
@Value("expression")
|
||||
private String expression;
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
try {
|
||||
return new ExpressionFilterPointSet(set, expression);
|
||||
} catch(ParseException e) {
|
||||
throw new RuntimeException("Failed to parse expression.", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.IntersectionPointSet;
|
||||
|
||||
|
||||
public class IntersectionPointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Value("point-sets")
|
||||
private List<PointSet> sets;
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
return new IntersectionPointSet(sets);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.UnionPointSet;
|
||||
|
||||
|
||||
public class UnionPointSetTemplate implements ObjectTemplate<PointSet> {
|
||||
|
||||
@Value("point-sets")
|
||||
private List<PointSet> sets;
|
||||
|
||||
@Override
|
||||
public PointSet get() {
|
||||
return new UnionPointSet(sets);
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate.Operator;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator;
|
||||
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
|
||||
@@ -23,7 +23,7 @@ public class SamplerLayerPredicateTemplate implements ObjectTemplate<LayerPredic
|
||||
|
||||
@Value("operator")
|
||||
@Default
|
||||
private Operator operator = Operator.GreaterThan;
|
||||
private BooleanOperator operator = BooleanOperator.GreaterThan;
|
||||
|
||||
@Override
|
||||
public LayerPredicate get() {
|
||||
|
||||
@@ -4,14 +4,12 @@ import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerListLayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerListLayerPredicate.CoordinateTest;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate.Operator;
|
||||
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
|
||||
|
||||
@@ -20,19 +18,19 @@ public class SamplerListLayerPredicateTemplate implements ObjectTemplate<LayerPr
|
||||
@Value("sampler")
|
||||
private @Meta InstanceWrapper<LayerSampler> sampler;
|
||||
|
||||
@Value("tests")
|
||||
private List<CoordinateTest> tests;
|
||||
@Value("point-set")
|
||||
private PointSet points;
|
||||
|
||||
@Value("default-threshold")
|
||||
@Value("threshold")
|
||||
@Default
|
||||
private double defaultThreshold = 0;
|
||||
|
||||
@Value("default-operator")
|
||||
@Value("operator")
|
||||
@Default
|
||||
private Operator defaultOperator = Operator.GreaterThan;
|
||||
private BooleanOperator defaultOperator = BooleanOperator.GreaterThan;
|
||||
|
||||
@Override
|
||||
public LayerPredicate get() {
|
||||
return new SamplerListLayerPredicate(sampler.get(), defaultOperator, tests);
|
||||
return new SamplerListLayerPredicate(sampler.get(), defaultThreshold, defaultOperator, points);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.dfsek.terra.addons.chunkgenerator.layer.predicate;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
@@ -12,57 +13,17 @@ public class SamplerLayerPredicate implements LayerPredicate {
|
||||
|
||||
private final double threshold;
|
||||
|
||||
private final Operator operator;
|
||||
private final BooleanOperator operator;
|
||||
|
||||
public SamplerLayerPredicate(LayerSampler sampler, Operator operator, double threshold) {
|
||||
public SamplerLayerPredicate(LayerSampler sampler, BooleanOperator operator, double threshold) {
|
||||
this.sampler = sampler;
|
||||
this.operator = operator;
|
||||
this.threshold = threshold;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean test(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
|
||||
return operator.evaluate(sampler.sample(x, y, z, world, biomeProvider), threshold);
|
||||
public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) {
|
||||
return operator.evaluate(sampler.sample(x, y, z, worldProperties, biomeProvider), threshold);
|
||||
}
|
||||
|
||||
public enum Operator {
|
||||
GreaterThan {
|
||||
@Override
|
||||
public boolean evaluate(double a, double b) {
|
||||
return a > b;
|
||||
}
|
||||
},
|
||||
GreaterThanOrEqual {
|
||||
@Override
|
||||
public boolean evaluate(double a, double b) {
|
||||
return a >= b;
|
||||
}
|
||||
},
|
||||
LessThan {
|
||||
@Override
|
||||
public boolean evaluate(double a, double b) {
|
||||
return a < b;
|
||||
}
|
||||
},
|
||||
LessThanOrEqual {
|
||||
@Override
|
||||
public boolean evaluate(double a, double b) {
|
||||
return a <= b;
|
||||
}
|
||||
},
|
||||
Equals {
|
||||
@Override
|
||||
public boolean evaluate(double a, double b) {
|
||||
return a == b;
|
||||
}
|
||||
},
|
||||
NotEquals {
|
||||
@Override
|
||||
public boolean evaluate(double a, double b) {
|
||||
return a != b;
|
||||
}
|
||||
};
|
||||
|
||||
public abstract boolean evaluate(double a, double b);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,59 +1,33 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.layer.predicate;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate.Operator;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator;
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.api.util.vector.Vector3Int;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public class SamplerListLayerPredicate implements LayerPredicate {
|
||||
|
||||
private final List<CoordinateTest> tests;
|
||||
private final Operator operator;
|
||||
private final Vector3Int[] points;
|
||||
private final BooleanOperator operator;
|
||||
private final LayerSampler sampler;
|
||||
private final double threshold;
|
||||
|
||||
public SamplerListLayerPredicate(LayerSampler sampler, Operator operator, List<CoordinateTest> tests) {
|
||||
public SamplerListLayerPredicate(LayerSampler sampler, double threshold, BooleanOperator operator, PointSet points) {
|
||||
this.sampler = sampler;
|
||||
this.threshold = threshold;
|
||||
this.operator = operator;
|
||||
this.tests = tests;
|
||||
this.points = points.toArray();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean test(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
|
||||
for (CoordinateTest test : tests) {
|
||||
if (operator.evaluate(sampler.sample(x + test.x, y + test.y, z + test.z, world, biomeProvider), test.threshold)) return true;
|
||||
public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) {
|
||||
for (Vector3Int point : points) {
|
||||
if (operator.evaluate(sampler.sample(x + point.getX(), y + point.getY(), z + point.getZ(), worldProperties, biomeProvider), threshold)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public record CoordinateTest(int x, int y, int z, double threshold) {
|
||||
|
||||
public static class Template implements ObjectTemplate<CoordinateTest> {
|
||||
|
||||
@Value("x")
|
||||
private int x;
|
||||
|
||||
@Value("y")
|
||||
private int y;
|
||||
|
||||
@Value("z")
|
||||
private int z;
|
||||
|
||||
@Value("threshold")
|
||||
@Default
|
||||
private double threshold = 0;
|
||||
|
||||
@Override
|
||||
public CoordinateTest get() {
|
||||
return new CoordinateTest(x, y, z, threshold);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math;
|
||||
|
||||
public enum BooleanOperator {
|
||||
GreaterThan {
|
||||
@Override
|
||||
public boolean evaluate(double a, double b) {
|
||||
return a > b;
|
||||
}
|
||||
},
|
||||
GreaterThanOrEqual {
|
||||
@Override
|
||||
public boolean evaluate(double a, double b) {
|
||||
return a >= b;
|
||||
}
|
||||
},
|
||||
LessThan {
|
||||
@Override
|
||||
public boolean evaluate(double a, double b) {
|
||||
return a < b;
|
||||
}
|
||||
},
|
||||
LessThanOrEqual {
|
||||
@Override
|
||||
public boolean evaluate(double a, double b) {
|
||||
return a <= b;
|
||||
}
|
||||
},
|
||||
Equals {
|
||||
@Override
|
||||
public boolean evaluate(double a, double b) {
|
||||
return a == b;
|
||||
}
|
||||
},
|
||||
NotEquals {
|
||||
@Override
|
||||
public boolean evaluate(double a, double b) {
|
||||
return a != b;
|
||||
}
|
||||
};
|
||||
|
||||
public abstract boolean evaluate(double a, double b);
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.terra.api.util.vector.Vector3Int;
|
||||
|
||||
|
||||
public interface PointSet extends Supplier<Stream<Vector3Int>> {
|
||||
|
||||
default Vector3Int[] toArray() {
|
||||
return this.get().distinct().toArray(Vector3Int[]::new);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.api.util.vector.Vector3Int;
|
||||
|
||||
public class AdjacentPointSet implements PointSet {
|
||||
@Override
|
||||
public Stream<Vector3Int> get() {
|
||||
return Stream.of(
|
||||
Vector3Int.of(0, 0, -1),
|
||||
Vector3Int.of(0, 0, 1),
|
||||
Vector3Int.of(0, -1, 0),
|
||||
Vector3Int.of(0, 1, 0),
|
||||
Vector3Int.of(-1, 0, 0),
|
||||
Vector3Int.of(1, 0, 0)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.api.util.vector.Vector3Int;
|
||||
|
||||
|
||||
public class SimplePointSet implements PointSet {
|
||||
|
||||
private final Stream<Vector3Int> points;
|
||||
|
||||
public SimplePointSet(Set<Vector3Int> points) {
|
||||
this.points = points.stream();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Vector3Int> get() {
|
||||
return points;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.api.util.vector.Vector3Int;
|
||||
|
||||
|
||||
public class CuboidPointSet implements PointSet {
|
||||
|
||||
private final Stream<Vector3Int> points;
|
||||
|
||||
public CuboidPointSet(int x1, int y1, int z1, int x2, int y2, int z2) {
|
||||
Set<Vector3Int> points = new HashSet<>();
|
||||
for (int x = x1; x <= x2; x = x + 1) {
|
||||
for (int y = y1; y <= y2; y = y + 1) {
|
||||
for (int z = z1; z <= z2; z = z + 1) {
|
||||
points.add(Vector3Int.of(x, y, z));
|
||||
}
|
||||
}
|
||||
}
|
||||
this.points = points.stream();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Vector3Int> get() {
|
||||
return points;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric;
|
||||
|
||||
import net.jafama.FastMath;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.api.util.vector.Vector3Int;
|
||||
|
||||
|
||||
public class SphericalPointSet implements PointSet {
|
||||
|
||||
private final Stream<Vector3Int> points;
|
||||
|
||||
public SphericalPointSet(double radius) {
|
||||
Stream.Builder<Vector3Int> streamBuilder = Stream.builder();
|
||||
int roundedRadius = FastMath.ceilToInt(radius);
|
||||
for(int x = -roundedRadius; x <= roundedRadius; x++) {
|
||||
for(int y = -roundedRadius; y <= roundedRadius; y++) {
|
||||
for(int z = -roundedRadius; z <= roundedRadius; z++) {
|
||||
Vector3Int pos = Vector3Int.of(x, y, z);
|
||||
double length = pos.toVector3().length();
|
||||
if (length == 0) continue;
|
||||
if (length > radius) continue;
|
||||
streamBuilder.add(pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
this.points = streamBuilder.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Vector3Int> get() {
|
||||
return points;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.api.util.vector.Vector3Int;
|
||||
|
||||
public class DifferencePointSet implements PointSet {
|
||||
|
||||
private final Stream<Vector3Int> points;
|
||||
|
||||
public DifferencePointSet(List<PointSet> sets) {
|
||||
points = sets.stream()
|
||||
.map(PointSet::get)
|
||||
.map(s -> s.collect(Collectors.toSet()))
|
||||
.reduce(Sets::difference).orElse(Collections.emptySet())
|
||||
.stream();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Vector3Int> get() {
|
||||
return points;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative;
|
||||
|
||||
import com.dfsek.paralithic.Expression;
|
||||
import com.dfsek.paralithic.eval.parser.Parser;
|
||||
import com.dfsek.paralithic.eval.parser.Scope;
|
||||
import com.dfsek.paralithic.eval.tokenizer.ParseException;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.api.util.vector.Vector3Int;
|
||||
|
||||
|
||||
public class ExpressionFilterPointSet implements PointSet {
|
||||
|
||||
private final Stream<Vector3Int> points;
|
||||
|
||||
public ExpressionFilterPointSet(PointSet set, String eq) throws ParseException {
|
||||
Parser parser = new Parser();
|
||||
Scope scope = new Scope();
|
||||
scope.addInvocationVariable("x");
|
||||
scope.addInvocationVariable("y");
|
||||
scope.addInvocationVariable("z");
|
||||
Expression expression = parser.parse(eq, scope);
|
||||
this.points = set.get().filter(v -> expression.evaluate(v.getX(), v.getY(), v.getZ()) == 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Vector3Int> get() {
|
||||
return points;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.api.util.vector.Vector3Int;
|
||||
|
||||
public class IntersectionPointSet implements PointSet {
|
||||
|
||||
private final Stream<Vector3Int> points;
|
||||
|
||||
public IntersectionPointSet(List<PointSet> sets) {
|
||||
points = sets.stream()
|
||||
.map(PointSet::get)
|
||||
.map(s -> s.collect(Collectors.toSet()))
|
||||
.reduce(Sets::intersection).orElse(Collections.emptySet())
|
||||
.stream();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Vector3Int> get() {
|
||||
return points;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet;
|
||||
import com.dfsek.terra.api.util.vector.Vector3Int;
|
||||
|
||||
public class UnionPointSet implements PointSet {
|
||||
|
||||
private final Stream<Vector3Int> points;
|
||||
|
||||
public UnionPointSet(List<PointSet> sets) {
|
||||
points = sets.stream()
|
||||
.map(PointSet::get)
|
||||
.map(s -> s.collect(Collectors.toSet()))
|
||||
.reduce(Sets::union).orElse(Collections.emptySet())
|
||||
.stream();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Vector3Int> get() {
|
||||
return points;
|
||||
}
|
||||
}
|
||||
@@ -52,10 +52,10 @@ loom {
|
||||
|
||||
launches {
|
||||
named("client") {
|
||||
property("fabric.log.level", "debug")
|
||||
property("fabric.log.level", "info")
|
||||
}
|
||||
named("server") {
|
||||
property("fabric.log.level", "debug")
|
||||
property("fabric.log.level", "info")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user