From ec8422bc13ddb2f12795d39b4b289571b2d2a76b Mon Sep 17 00:00:00 2001 From: Jesse Boyd Date: Sat, 29 Jun 2019 02:09:56 +1000 Subject: [PATCH] 1f14d4652efb59f904f3dd077766822415c59c83 --- .../worldedit/command/SelectionCommands.java | 2 +- .../worldedit/regions/EllipsoidRegion.java | 42 ++++++++++++++++--- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java index 080d5424c..bb1e3e37f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java @@ -723,7 +723,7 @@ public class SelectionCommands { @Command( aliases = {"/sel", ";", "/desel", "/deselect"}, flags = "d", - usage = "[cuboid|extend|poly|ellipsoid|sphere|cyl|convex]", + usage = "[cuboid|extend|poly|polyhedron|ellipsoid|sphere|cyl|convex|fuzzy]", desc = "Choose a region selector", min = 0, max = 1 diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/EllipsoidRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/EllipsoidRegion.java index 57348c6a6..c1184afb9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/EllipsoidRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/EllipsoidRegion.java @@ -43,6 +43,10 @@ public class EllipsoidRegion extends AbstractRegion { */ private Vector3 radius; + private Vector3 radiusSqr; + private int radiusLengthSqr; + private boolean sphere; + /** * Construct a new instance of this ellipsoid region. * @@ -92,7 +96,7 @@ public class EllipsoidRegion extends AbstractRegion { @Override public int getHeight() { - return (int) (2 * radius.getY()); + return Math.max((int) (2 * radius.getY()), 256); } @Override @@ -123,14 +127,14 @@ public class EllipsoidRegion extends AbstractRegion { @Override public void expand(BlockVector3... changes) throws RegionOperationException { center = center.add(calculateDiff(changes)); - radius = radius.add(calculateChanges(changes)); + setRadius(radius.add(calculateChanges(changes))); } @Override public void contract(BlockVector3... changes) throws RegionOperationException { center = center.subtract(calculateDiff(changes)); Vector3 newRadius = radius.subtract(calculateChanges(changes)); - radius = Vector3.at(1.5, 1.5, 1.5).getMaximum(newRadius); + setRadius(Vector3.at(1.5, 1.5, 1.5).getMaximum(newRadius)); } @Override @@ -172,7 +176,14 @@ public class EllipsoidRegion extends AbstractRegion { * @param radius the radius */ public void setRadius(Vector3 radius) { - this.radius = radius.add(0.5, 0.5, 0.5); + this.radius = radius; + radiusSqr = radius.multiply(radius); + radiusLengthSqr = (int) radiusSqr.getX(); + if (radius.getY() == radius.getX() && radius.getX() == radius.getZ()) { + this.sphere = true; + } else { + this.sphere = false; + } } @Override @@ -201,7 +212,28 @@ public class EllipsoidRegion extends AbstractRegion { @Override public boolean contains(BlockVector3 position) { - return position.subtract(center).toVector3().divide(radius).lengthSq() <= 1; + int cx = position.getBlockX() - center.getBlockX(); + int cx2 = cx * cx; + if (cx2 > radiusSqr.getBlockX()) { + return false; + } + int cz = position.getBlockZ() - center.getBlockZ(); + int cz2 = cz * cz; + if (cz2 > radiusSqr.getBlockZ()) { + return false; + } + int cy = position.getBlockY() - center.getBlockY(); + int cy2 = cy * cy; + if (radiusSqr.getBlockY() < 255 && cy2 > radiusSqr.getBlockY()) { + return false; + } + if (sphere) { + return cx2 + cy2 + cz2 <= radiusLengthSqr; + } + double cxd = (double) cx / radius.getBlockX(); + double cyd = (double) cy / radius.getBlockY(); + double czd = (double) cz / radius.getBlockZ(); + return cxd * cxd + cyd * cyd + czd * czd <= 1; } /**