Skip to content

Commit

Permalink
Add a method to get the affected area of a Brush.
Browse files Browse the repository at this point in the history
  • Loading branch information
wizjany committed Feb 15, 2019
1 parent b94ade4 commit 4981697
Show file tree
Hide file tree
Showing 10 changed files with 88 additions and 0 deletions.
Expand Up @@ -23,6 +23,8 @@
import com.sk89q.worldedit.MaxChangedBlocksException;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Region;

/**
* A brush is a long-range build tool.
Expand All @@ -40,4 +42,15 @@ public interface Brush {
*/
public void build(EditSession editSession, Vector position, Pattern pattern, double size) throws MaxChangedBlocksException;

/**
* Get the region that represents the area that would be affected if called at the given position.
*
* @param session the editsession to build in
* @param position the brush target
* @param size the brush size
* @return the bounds of the affected area
*/
default public Region getBounds(EditSession session, Vector position, double size) {
return CuboidRegion.fromCenter(position, (int) Math.ceil(size));
}
}
Expand Up @@ -24,10 +24,13 @@
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.command.util.CreatureButcher;
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.extent.NullExtent;
import com.sk89q.worldedit.function.operation.Operations;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.function.visitor.EntityVisitor;
import com.sk89q.worldedit.regions.CylinderRegion;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.RegionOperationException;

import java.util.List;

Expand All @@ -46,4 +49,14 @@ public void build(EditSession editSession, Vector position, Pattern pattern, dou
Operations.completeLegacy(new EntityVisitor(entities.iterator(), flags.createFunction(editSession.getWorld().getWorldData().getEntityRegistry())));
}

@Override
public Region getBounds(EditSession session, Vector position, double size) {
CylinderRegion cyl = CylinderRegion.createRadius(session, position, size);
try {
cyl.contract(new Vector(0, -1, 0), new Vector(0, 1, 0));
return cyl;
} catch (RegionOperationException e) {
}
return cyl;
}
}
Expand Up @@ -26,7 +26,9 @@
import com.sk89q.worldedit.function.operation.Operation;
import com.sk89q.worldedit.function.operation.Operations;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.RegionOperationException;
import com.sk89q.worldedit.session.ClipboardHolder;

public class ClipboardBrush implements Brush {
Expand Down Expand Up @@ -56,4 +58,17 @@ public void build(EditSession editSession, Vector position, Pattern pattern, dou
Operations.completeLegacy(operation);
}

@Override
public Region getBounds(EditSession session, Vector position, double size) {
Clipboard clipboard = holder.getClipboard();
Region region = clipboard.getRegion();
Vector centerOffset = region.getCenter().subtract(clipboard.getOrigin());
try {
region.shift(usingOrigin ? position.subtract(region.getCenter()).add(centerOffset)
: position.subtract(region.getCenter()));
return region;
} catch (RegionOperationException e) {
}
return CuboidRegion.fromCenter(position, (int) size);
}
}
Expand Up @@ -22,11 +22,15 @@
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.MaxChangedBlocksException;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.Vector2D;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.blocks.BlockID;
import com.sk89q.worldedit.extent.NullExtent;
import com.sk89q.worldedit.function.pattern.BlockPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.function.pattern.Patterns;
import com.sk89q.worldedit.regions.CylinderRegion;
import com.sk89q.worldedit.regions.Region;

public class CylinderBrush implements Brush {

Expand All @@ -44,4 +48,9 @@ public void build(EditSession editSession, Vector position, Pattern pattern, dou
editSession.makeCylinder(position, Patterns.wrap(pattern), size, size, height, true);
}

@Override
public Region getBounds(EditSession session, Vector position, double size) {
return new CylinderRegion(position, new Vector2D(size + 0.5D, size + 0.5D),
position.getBlockY(), position.getBlockY() + height - 1);
}
}
Expand Up @@ -25,6 +25,8 @@
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.blocks.BlockID;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Region;

import java.util.*;

Expand Down Expand Up @@ -64,4 +66,9 @@ public void build(EditSession editSession, Vector position, Pattern pattern, dou
}
}

@Override
public Region getBounds(EditSession session, Vector position, double size) {
final double startY = fullHeight ? session.getWorld().getMaxY() : position.getBlockY() + size;
return new CuboidRegion(position.subtract(size, size, size), position.add(size, 0, size).setY(startY));
}
}
Expand Up @@ -22,11 +22,14 @@
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.MaxChangedBlocksException;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.Vector2D;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.blocks.BlockID;
import com.sk89q.worldedit.function.pattern.BlockPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.function.pattern.Patterns;
import com.sk89q.worldedit.regions.CylinderRegion;
import com.sk89q.worldedit.regions.Region;

public class HollowCylinderBrush implements Brush {

Expand All @@ -44,4 +47,9 @@ public void build(EditSession editSession, Vector position, Pattern pattern, dou
editSession.makeCylinder(position, Patterns.wrap(pattern), size, size, height, false);
}

@Override
public Region getBounds(EditSession session, Vector position, double size) {
return new CylinderRegion(position, new Vector2D(size + 0.5D, size + 0.5D),
position.getBlockY(), position.getBlockY() + height - 1);
}
}
Expand Up @@ -27,6 +27,8 @@
import com.sk89q.worldedit.function.pattern.BlockPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.function.pattern.Patterns;
import com.sk89q.worldedit.regions.EllipsoidRegion;
import com.sk89q.worldedit.regions.Region;

public class HollowSphereBrush implements Brush {

Expand All @@ -37,4 +39,9 @@ public void build(EditSession editSession, Vector position, Pattern pattern, dou
}
editSession.makeSphere(position, Patterns.wrap(pattern), size, size, size, false);
}

@Override
public Region getBounds(EditSession session, Vector position, double size) {
return new EllipsoidRegion(position, new Vector(size, size, size));
}
}
Expand Up @@ -27,6 +27,7 @@
import com.sk89q.worldedit.function.operation.Operation;
import com.sk89q.worldedit.function.operation.Operations;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.factory.RegionFactory;

public class OperationFactoryBrush implements Brush {
Expand All @@ -49,4 +50,8 @@ public void build(EditSession editSession, Vector position, Pattern pattern, dou
Operations.completeLegacy(operation);
}

@Override
public Region getBounds(EditSession session, Vector position, double size) {
return regionFactory.createCenteredAt(position, size + 0.5D);
}
}
Expand Up @@ -55,4 +55,8 @@ public void build(EditSession editSession, Vector position, Pattern pattern, dou
heightMap.applyFilter(filter, iterations);
}

@Override
public Region getBounds(EditSession session, Vector position, double size) {
return new CuboidRegion(position.subtract(size, size, size), position.add(size, size + 10, size));
}
}
Expand Up @@ -27,6 +27,8 @@
import com.sk89q.worldedit.function.pattern.BlockPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.function.pattern.Patterns;
import com.sk89q.worldedit.regions.EllipsoidRegion;
import com.sk89q.worldedit.regions.Region;

public class SphereBrush implements Brush {

Expand All @@ -37,4 +39,9 @@ public void build(EditSession editSession, Vector position, Pattern pattern, dou
}
editSession.makeSphere(position, Patterns.wrap(pattern), size, size, size, true);
}

@Override
public Region getBounds(EditSession session, Vector position, double size) {
return new EllipsoidRegion(session.getWorld(), position, new Vector(size + 0.5D, size + 0.5D, size + 0.5D));
}
}

0 comments on commit 4981697

Please sign in to comment.