From 23a35f809713706b0b2c0f19ee56912f847d9812 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 15 Jun 2022 18:59:12 -0700 Subject: [PATCH] implement blockstate cache in Column --- .../feature/locator/locators/PatternLocator.java | 7 ++++++- .../addons/feature/locator/patterns/MatchPattern.java | 8 ++++++-- .../terra/api/world/chunk/generation/util/Column.java | 11 ++++++++++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/PatternLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/PatternLocator.java index f3f525af9..575b2328e 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/PatternLocator.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/PatternLocator.java @@ -13,6 +13,8 @@ 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 net.jafama.FastMath; + public class PatternLocator implements Locator { private final Pattern pattern; @@ -25,6 +27,9 @@ public class PatternLocator implements Locator { @Override public BinaryColumn getSuitableCoordinates(Column column) { - return new BinaryColumn(search, y -> pattern.matches(y, column)); + int min = FastMath.max(column.getMinY(), search.getMin()); + int max = FastMath.min(column.getMaxY(), search.getMax()); + if(min >= max) return BinaryColumn.getNull(); + return new BinaryColumn(min, max, y -> pattern.matches(y, column)); } } diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/MatchPattern.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/MatchPattern.java index e92950a53..d68ece62e 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/MatchPattern.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/MatchPattern.java @@ -13,6 +13,8 @@ import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.world.chunk.generation.util.Column; +import net.jafama.FastMath; + public class MatchPattern implements Pattern { private final Range range; @@ -25,8 +27,10 @@ public class MatchPattern implements Pattern { @Override public boolean matches(int y, Column column) { - for(int i = range.getMin(); i < range.getMax(); i++) { - if(!matches.test(column.getBlock(y + i))) return false; + int min = FastMath.max(column.getMinY(), range.getMin() + y); + int max = FastMath.min(column.getMaxY(), range.getMax() + y); + for(int i = min; i < max; i++) { + if(!matches.test(column.getBlock(i))) return false; } return true; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Column.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Column.java index a3ee0c92f..962e77084 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Column.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Column.java @@ -27,6 +27,8 @@ public class Column { private final int max; private final T world; + private final BlockState[] cache; + public Column(int x, int z, T world) { this(x, z, world, world.getMinHeight(), world.getMaxHeight()); } @@ -37,6 +39,7 @@ public class Column { this.world = world; this.max = max; this.min = min; + this.cache = new BlockState[world.getMaxHeight() - world.getMinHeight()]; } public int getX() { @@ -48,7 +51,13 @@ public class Column { } public BlockState getBlock(int y) { - return world.getBlockState(x, y, z); + int i = y - world.getMinHeight(); + BlockState state = cache[i]; + if(state == null) { + state = world.getBlockState(x, y, z); + cache[i] = state; + } + return state; } public T getWorld() {