From 2670e66ce21f4d8ed64f29cb6261ae0e2c7da0e0 Mon Sep 17 00:00:00 2001 From: Jesse Boyd Date: Thu, 14 Nov 2019 17:25:37 +0000 Subject: [PATCH] Fix mask optimize --- .../java/com/sk89q/worldedit/EditSession.java | 2 +- .../worldedit/function/mask/BlockMask.java | 23 +++++++++++++++---- .../function/mask/MaskIntersection.java | 5 ++-- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java index 37dd8ea24..8f780c36a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java @@ -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 diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java index c36c5fb82..a0b67290f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java @@ -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; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java index 751ee073b..d7743c520 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java @@ -144,10 +144,10 @@ public class MaskIntersection extends AbstractMask { Set> 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 pair = new AbstractMap.SimpleEntry<>(mask, other); if (failedCombines.contains(pair)) continue; Mask combined = pairing.apply(pair);