short-circuit locators

This commit is contained in:
dfsek
2022-02-14 09:30:45 -07:00
parent 0f767c6896
commit 68f8c8cea8
11 changed files with 71 additions and 71 deletions
@@ -27,13 +27,7 @@ public class AdjacentPatternLocator implements Locator {
@Override
public BinaryColumn getSuitableCoordinates(Column<?> column) {
BinaryColumn locations = new BinaryColumn(search);
for(int y : search) {
if(isValid(y, column)) locations.set(y);
}
return locations;
return new BinaryColumn(search, y -> isValid(y, column));
}
private boolean isValid(int y, Column<?> column) {
@@ -11,6 +11,7 @@ import com.dfsek.terra.api.structure.feature.BinaryColumn;
import com.dfsek.terra.api.structure.feature.Locator;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.world.chunk.generation.util.Column;
import com.dfsek.terra.api.world.chunk.generation.util.Column.BinaryColumnBuilder;
import java.util.Random;
@@ -44,13 +45,13 @@ public class GaussianRandomLocator implements Locator {
int size = points.get(r);
BinaryColumn results = new BinaryColumn(column.getMinY(), column.getMaxY());
BinaryColumnBuilder results = column.newBinaryColumn();
for(int i = 0; i < size; i++) {
int h = (int) r.nextGaussian(mean, standardDeviation);
if(h >= column.getMaxY() || h < column.getMinY()) continue;
results.set(h);
}
return results;
return results.build();
}
}
@@ -25,12 +25,6 @@ public class PatternLocator implements Locator {
@Override
public BinaryColumn getSuitableCoordinates(Column<?> column) {
BinaryColumn locations = new BinaryColumn(column.getMinY(), column.getMaxY());
for(int y : search) {
if(pattern.matches(y, column)) locations.set(y);
}
return locations;
return new BinaryColumn(column.getMinY(), column.getMaxY(), y -> pattern.matches(y, column));
}
}
@@ -13,6 +13,7 @@ import com.dfsek.terra.api.structure.feature.BinaryColumn;
import com.dfsek.terra.api.structure.feature.Locator;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.world.chunk.generation.util.Column;
import com.dfsek.terra.api.world.chunk.generation.util.Column.BinaryColumnBuilder;
public class RandomLocator implements Locator {
@@ -39,13 +40,13 @@ public class RandomLocator implements Locator {
int size = points.get(r);
BinaryColumn results = new BinaryColumn(column.getMinY(), column.getMaxY());
BinaryColumnBuilder results = column.newBinaryColumn();
for(int i = 0; i < size; i++) {
int h = height.get(r);
if(h >= column.getMaxY() || h < column.getMinY()) continue;
results.set(h);
}
return results;
return results.build();
}
}
@@ -22,13 +22,9 @@ public class Sampler3DLocator implements Locator {
@Override
public BinaryColumn getSuitableCoordinates(Column<?> column) {
BinaryColumn results = column.newBinaryColumn();
long seed = column.getWorld().getSeed();
int x = column.getX();
int z = column.getZ();
column.forEach(y -> {
if(sampler.noise(seed, x, y, z) > 0) results.set(y);
});
return results;
return column.newBinaryColumn(y -> sampler.noise(seed, x, y, z) > 0);
}
}
@@ -7,6 +7,8 @@
package com.dfsek.terra.addons.feature.locator.locators;
import com.dfsek.terra.api.world.chunk.generation.util.Column.BinaryColumnBuilder;
import net.jafama.FastMath;
import java.util.List;
@@ -26,7 +28,7 @@ public class SamplerLocator implements Locator {
@Override
public BinaryColumn getSuitableCoordinates(Column<?> column) {
BinaryColumn results = new BinaryColumn(column.getMinY(), column.getMaxY());
BinaryColumnBuilder results = column.newBinaryColumn();
long seed = column.getWorld().getSeed();
samplers.forEach(sampler -> {
@@ -35,6 +37,6 @@ public class SamplerLocator implements Locator {
results.set(y);
});
return results;
return results.build();
}
}
@@ -11,6 +11,7 @@ import com.dfsek.terra.api.structure.feature.BinaryColumn;
import com.dfsek.terra.api.structure.feature.Locator;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.world.chunk.generation.util.Column;
import com.dfsek.terra.api.world.chunk.generation.util.Column.BinaryColumnBuilder;
public class SurfaceLocator implements Locator {
@@ -22,12 +23,12 @@ public class SurfaceLocator implements Locator {
@Override
public BinaryColumn getSuitableCoordinates(Column<?> column) {
BinaryColumn location = new BinaryColumn(column.getMinY(), column.getMaxY());
BinaryColumnBuilder builder = column.newBinaryColumn();
for(int y : search) {
if(column.getBlock(y).isAir() && !column.getBlock(y - 1).isAir()) {
location.set(y);
builder.set(y);
}
}
return location;
return builder.build();
}
}
@@ -22,13 +22,11 @@ public class TopLocator implements Locator {
@Override
public BinaryColumn getSuitableCoordinates(Column<?> column) {
BinaryColumn location = new BinaryColumn(column.getMinY(), column.getMaxY());
for(int y : search) {
if(column.getBlock(y).isAir() && !column.getBlock(y - 1).isAir()) {
location.set(y);
return location;
return new BinaryColumn(y, y+1, yi -> true);
}
}
return location;
return BinaryColumn.getNull();
}
}