mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2026-10-26 14:00:26 +00:00
Memoize perfection block classes
- Classify column blocks once per state run during perfection scans
This commit is contained in:
1 parent
3bd76d47a9
commit
41142ee5b5
1 file changed
+27
-10
@@ -36,6 +36,8 @@ import java.util.Map;
|
|||||||
import it.unimi.dsi.fastutil.ints.IntArrayList;
|
import it.unimi.dsi.fastutil.ints.IntArrayList;
|
||||||
|
|
||||||
public class IrisPerfectionModifier extends EngineAssignedModifier<NativeBlockState> {
|
public class IrisPerfectionModifier extends EngineAssignedModifier<NativeBlockState> {
|
||||||
|
private static final int SOLID = 1;
|
||||||
|
private static final int SPIKE = 2;
|
||||||
private static final BoundBlockState AIR = BoundBlockState.of("AIR");
|
private static final BoundBlockState AIR = BoundBlockState.of("AIR");
|
||||||
private static final BoundBlockState WATER = BoundBlockState.of("WATER");
|
private static final BoundBlockState WATER = BoundBlockState.of("WATER");
|
||||||
private static final Map<String, BoundBlockState> ORE_BASES = buildOreBases();
|
private static final Map<String, BoundBlockState> ORE_BASES = buildOreBases();
|
||||||
@@ -97,19 +99,22 @@ public class IrisPerfectionModifier extends EngineAssignedModifier<NativeBlockSt
|
|||||||
|
|
||||||
private void perfectSlice(Hunk<NativeBlockState> output, int x) {
|
private void perfectSlice(Hunk<NativeBlockState> output, int x) {
|
||||||
IntArrayList surfaces = new IntArrayList();
|
IntArrayList surfaces = new IntArrayList();
|
||||||
|
StateClasses classes = new StateClasses();
|
||||||
for (int z = 0; z < 16; z++) {
|
for (int z = 0; z < 16; z++) {
|
||||||
boolean changed;
|
boolean changed;
|
||||||
do {
|
do {
|
||||||
surfaces.clear();
|
surfaces.clear();
|
||||||
int top = getHeight(output, x, z);
|
int top = getHeight(output, x, z, classes);
|
||||||
boolean inside = true;
|
boolean inside = true;
|
||||||
surfaces.add(top);
|
surfaces.add(top);
|
||||||
for (int y = top; y >= 0; y--) {
|
for (int y = top; y >= 0; y--) {
|
||||||
NativeBlockState block = output.get(x, y, z);
|
NativeBlockState block = output.get(x, y, z);
|
||||||
if (IrisSpeleothems.isSpike(block)) {
|
int flags = classes.of(block);
|
||||||
|
if ((flags & SPIKE) != 0) {
|
||||||
block = normalizeSpike(block, output, x, z, y, AIR.get(), WATER.get());
|
block = normalizeSpike(block, output, x, z, y, AIR.get(), WATER.get());
|
||||||
|
flags = classes.of(block);
|
||||||
}
|
}
|
||||||
boolean now = block != null && !(B.isAir(block) || B.isFluid(block));
|
boolean now = (flags & SOLID) != 0;
|
||||||
if (now != inside) {
|
if (now != inside) {
|
||||||
inside = now;
|
inside = now;
|
||||||
if (inside) {
|
if (inside) {
|
||||||
@@ -203,17 +208,29 @@ public class IrisPerfectionModifier extends EngineAssignedModifier<NativeBlockSt
|
|||||||
burst.complete();
|
burst.complete();
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getHeight(Hunk<NativeBlockState> output, int x, int z) {
|
private int getHeight(Hunk<NativeBlockState> output, int x, int z, StateClasses classes) {
|
||||||
for (int i = Math.min(output.getHeight() - 1, ColumnExtent.highestStoredY(output, x, z)); i >= 0; i--) {
|
for (int i = Math.min(output.getHeight() - 1, ColumnExtent.highestStoredY(output, x, z)); i >= 0; i--) {
|
||||||
NativeBlockState b = output.get(x, i, z);
|
if ((classes.of(output.get(x, i, z)) & SOLID) != 0) {
|
||||||
|
return i;
|
||||||
if (b != null) {
|
|
||||||
if (!B.isAir(b) && !B.isFluid(b)) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final class StateClasses {
|
||||||
|
private NativeBlockState last;
|
||||||
|
private int lastFlags;
|
||||||
|
|
||||||
|
private int of(NativeBlockState state) {
|
||||||
|
if (state == null) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (state != last) {
|
||||||
|
last = state;
|
||||||
|
lastFlags = (state.isAir() || state.isFluid() ? 0 : SOLID) | (IrisSpeleothems.isSpike(state) ? SPIKE : 0);
|
||||||
|
}
|
||||||
|
return lastFlags;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user