Fix mask optimize

This commit is contained in:
Jesse Boyd 2019-11-14 17:25:37 +00:00
parent 69e1c53076
commit 2670e66ce2
No known key found for this signature in database
GPG Key ID: 59F1DE6293AF6E1F
3 changed files with 23 additions and 7 deletions

View File

@ -1118,7 +1118,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
new RegionMask(new EllipsoidRegion(null, origin, Vector3.at(radius, radius, radius))),
new BoundedHeightMask(
Math.max(origin.getBlockY() - depth + 1, getMinimumPoint().getBlockY()),
Math.min(getMaximumPoint().getBlockY(), origin.getBlockY())),
Math.min(getMaxY(), origin.getBlockY())),
Masks.negate(new ExistingBlockMask(this)));
// Want to replace blocks

View File

@ -180,12 +180,22 @@ public class BlockMask extends ABlockMask {
public Mask tryCombine(Mask mask) {
if (mask instanceof ABlockMask) {
ABlockMask other = (ABlockMask) mask;
boolean modified = false;
boolean hasAny = false;
for (int i = 0; i < ordinals.length; i++) {
if (ordinals[i]) {
ordinals[i] = other.test(BlockState.getFromOrdinal(i));
boolean result = other.test(BlockState.getFromOrdinal(i));
hasAny |= result;
modified |= !result;
ordinals[i] = result;
}
}
return this;
if (modified) {
if (!hasAny) {
return Masks.alwaysFalse();
}
return this;
}
}
return null;
}
@ -194,12 +204,17 @@ public class BlockMask extends ABlockMask {
public Mask tryOr(Mask mask) {
if (mask instanceof ABlockMask) {
ABlockMask other = (ABlockMask) mask;
boolean modified = false;
for (int i = 0; i < ordinals.length; i++) {
if (!ordinals[i]) {
ordinals[i] = other.test(BlockState.getFromOrdinal(i));
boolean result = other.test(BlockState.getFromOrdinal(i));
modified |= result;
ordinals[i] = result;
}
}
return this;
if (modified) {
return this;
}
}
return null;
}

View File

@ -144,10 +144,10 @@ public class MaskIntersection extends AbstractMask {
Set<Map.Entry<Mask, Mask>> failedCombines = new HashSet<>();
// Combine the masks
boolean changed = false;
while (changed |= combineMasks(pairingFunction(), failedCombines));
while (combineMasks(pairingFunction(), failedCombines)) changed = true;
// Optimize / combine
do changed |= optimizeMasks(optimized);
while (changed |= combineMasks(pairingFunction(), failedCombines) && --maxIteration > 0);
while (combineMasks(pairingFunction(), failedCombines) && --maxIteration > 0);
if (maxIteration == 0) {
getLogger(MaskIntersection.class).debug("Failed optimize MaskIntersection");
@ -169,6 +169,7 @@ public class MaskIntersection extends AbstractMask {
outer:
for (Mask mask : masks) {
for (Mask other : masks) {
if (mask == other) continue;
AbstractMap.SimpleEntry<Mask, Mask> pair = new AbstractMap.SimpleEntry<>(mask, other);
if (failedCombines.contains(pair)) continue;
Mask combined = pairing.apply(pair);