Add point sets to layered gen

This commit is contained in:
Astrash
2022-07-30 11:58:59 +10:00
parent 50397a4a6b
commit d9bd9135de
25 changed files with 536 additions and 96 deletions

View File

@@ -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);

View File

@@ -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();
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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() {

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}
}
}

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -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)
);
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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")
}
}
}