Equation-defined cave radii

This commit is contained in:
dfsek
2020-11-28 18:56:02 -07:00
parent 4e11d5c1cf
commit 6eb5c0e0ec
5 changed files with 90 additions and 46 deletions

View File

@@ -12,15 +12,19 @@ import org.polydev.gaea.math.Range;
import org.polydev.gaea.util.FastRandom;
import org.polydev.gaea.world.carving.Carver;
import org.polydev.gaea.world.carving.Worm;
import parsii.eval.Expression;
import parsii.eval.Parser;
import parsii.eval.Scope;
import parsii.eval.Variable;
import parsii.tokenizer.ParseException;
import java.util.List;
import java.util.Random;
public class UserDefinedCarver extends Carver {
private final double[] start; // 0, 1, 2 = x, y, z.
private final double[] mutate; // 0, 1, 2 = x, y, z. 3 = radius.
private final double[] radiusMultiplier;
private final Range length;
private final Range radius;
private final int hash;
private final int topCut;
private final int bottomCut;
@@ -28,24 +32,38 @@ public class UserDefinedCarver extends Carver {
private Range recalc = new Range(8, 10);
private double recalcMagnitude = 3;
private final CarverTemplate config;
private final Expression xRad;
private final Expression yRad;
private final Expression zRad;
private final Variable lengthVar;
private final Variable position;
public UserDefinedCarver(Range height, Range radius, Range length, double[] start, double[] mutate, double[] radiusMultiplier, int hash, int topCut, int bottomCut, CarverTemplate config) {
public UserDefinedCarver(Range height, Range length, double[] start, double[] mutate, List<String> radii, Scope parent, int hash, int topCut, int bottomCut, CarverTemplate config) throws ParseException {
super(height.getMin(), height.getMax());
this.radius = radius;
this.length = length;
this.start = start;
this.mutate = mutate;
this.radiusMultiplier = radiusMultiplier;
this.hash = hash;
this.topCut = topCut;
this.bottomCut = bottomCut;
this.config = config;
Parser p = new Parser();
Scope s = new Scope().withParent(parent);
lengthVar = s.create("length");
position = s.create("position");
xRad = p.parse(radii.get(0), s);
yRad = p.parse(radii.get(1), s);
zRad = p.parse(radii.get(2), s);
}
@Override
public Worm getWorm(long l, Vector vector) {
Random r = new FastRandom(l + hash);
return new UserDefinedWorm(length.get(r) / 2, r, vector, radius.getMax(), topCut, bottomCut);
return new UserDefinedWorm(length.get(r) / 2, r, vector, topCut, bottomCut);
}
public void setStep(double step) {
@@ -75,19 +93,18 @@ public class UserDefinedCarver extends Carver {
private class UserDefinedWorm extends Worm {
private final Vector direction;
private final int maxRad;
private double runningRadius;
private int steps;
private int nextDirection = 0;
private double[] currentRotation = new double[3];
public UserDefinedWorm(int length, Random r, Vector origin, int maxRad, int topCut, int bottomCut) {
public UserDefinedWorm(int length, Random r, Vector origin, int topCut, int bottomCut) {
super(length, r, origin);
super.setTopCut(topCut);
super.setBottomCut(bottomCut);
runningRadius = radius.get(r);
this.maxRad = maxRad;
direction = new Vector((r.nextDouble() - 0.5D) * start[0], (r.nextDouble() - 0.5D) * start[1], (r.nextDouble() - 0.5D) * start[2]).normalize().multiply(step);
position.setValue(0);
lengthVar.setValue(length);
setRadius(new int[] {(int) (xRad.evaluate()), (int) (yRad.evaluate()), (int) (zRad.evaluate())});
}
@Override
@@ -102,9 +119,8 @@ public class UserDefinedCarver extends Carver {
nextDirection += recalc.get(getRandom());
}
steps++;
setRadius(new int[] {(int) (runningRadius * radiusMultiplier[0]), (int) (runningRadius * radiusMultiplier[1]), (int) (runningRadius * radiusMultiplier[2])});
runningRadius += (getRandom().nextDouble() - 0.5) * mutate[3];
runningRadius = FastMath.max(FastMath.min(runningRadius, maxRad), 1);
position.setValue(steps);
setRadius(new int[] {(int) (xRad.evaluate()), (int) (yRad.evaluate()), (int) (zRad.evaluate())});
direction.rotateAroundX(FastMath.toRadians(currentRotation[0] * mutate[0]));
direction.rotateAroundY(FastMath.toRadians(currentRotation[1] * mutate[1]));
direction.rotateAroundZ(FastMath.toRadians(currentRotation[2] * mutate[2]));