Re-add smooth filtering via a mask.

Instead of trying to maintain a list of "natural terrain blocks", just
let the user specify a mask of blocks to use for the height map filter.

https://gfycat.com/severaljauntycondor
This commit is contained in:
wizjany
2019-02-26 18:15:35 -05:00
parent 9eeb0acffe
commit 243d6476ac
5 changed files with 47 additions and 17 deletions

View File

@ -42,6 +42,7 @@ import com.sk89q.worldedit.command.util.CreatureButcher;
import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.function.mask.BlockTypeMask;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.pattern.BlockPattern;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3;
@ -158,24 +159,24 @@ public class BrushCommands {
@Command(
aliases = { "smooth" },
usage = "[size] [iterations]",
usage = "[size] [iterations] [filter]",
desc = "Choose the terrain softener brush",
help =
"Chooses the terrain softener brush.",
"Chooses the terrain softener brush. Optionally, specify a mask of blocks to be used for the heightmap.\n" +
"For example, '/brush smooth 2 4 grass_block,dirt,stone'.",
min = 0,
max = 2
max = 3
)
@CommandPermissions("worldedit.brush.smooth")
public void smoothBrush(Player player, LocalSession session, EditSession editSession,
@Optional("2") double radius, @Optional("4") int iterations) throws WorldEditException {
@Optional("2") double radius, @Optional("4") int iterations, @Optional Mask mask) throws WorldEditException {
worldEdit.checkMaxBrushRadius(radius);
BrushTool tool = session.getBrushTool(player.getItemInHand(HandSide.MAIN_HAND).getType());
tool.setSize(radius);
tool.setBrush(new SmoothBrush(iterations), "worldedit.brush.smooth");
tool.setBrush(new SmoothBrush(iterations, mask), "worldedit.brush.smooth");
player.print(String.format("Smooth brush equipped (%.0f x %dx, using any block).", radius, iterations));
player.print(String.format("Smooth brush equipped (%.0f x %dx, using %s).", radius, iterations, mask == null ? "any block" : "filter"));
}
@Command(

View File

@ -240,17 +240,19 @@ public class RegionCommands {
@Command(
aliases = { "/smooth" },
usage = "[iterations]",
usage = "[iterations] [filter]",
desc = "Smooth the elevation in the selection",
help =
"Smooths the elevation in the selection.",
"Smooths the elevation in the selection.\n" +
"Optionally, restricts the height map to a set of blocks specified with mask syntax.\n" +
"For example, '//smooth 1 grass_block,dirt,stone' would only smooth natural surface terrain.",
min = 0,
max = 1
max = 2
)
@CommandPermissions("worldedit.region.smooth")
@Logging(REGION)
public void smooth(Player player, EditSession editSession, @Selection Region region, @Optional("1") int iterations) throws WorldEditException {
HeightMap heightMap = new HeightMap(editSession, region);
public void smooth(Player player, EditSession editSession, @Selection Region region, @Optional("1") int iterations, @Optional Mask mask) throws WorldEditException {
HeightMap heightMap = new HeightMap(editSession, region, mask);
HeightMapFilter filter = new HeightMapFilter(new GaussianKernel(5, 1.0));
int affected = heightMap.applyFilter(filter, iterations);
player.print("Terrain's height map smoothed. " + affected + " block(s) changed.");

View File

@ -21,6 +21,7 @@ package com.sk89q.worldedit.command.tool.brush;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.MaxChangedBlocksException;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.Vector3;
@ -31,12 +32,20 @@ import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.util.Location;
import javax.annotation.Nullable;
public class SmoothBrush implements Brush {
private final Mask mask;
private int iterations;
public SmoothBrush(int iterations) {
this(iterations, null);
}
public SmoothBrush(int iterations, @Nullable Mask mask) {
this.iterations = iterations;
this.mask = mask;
}
@Override
@ -45,7 +54,7 @@ public class SmoothBrush implements Brush {
Location min = new Location(editSession.getWorld(), posDouble.subtract(size, size, size));
BlockVector3 max = posDouble.add(size, size + 10, size).toBlockPoint();
Region region = new CuboidRegion(editSession.getWorld(), min.toVector().toBlockPoint(), max);
HeightMap heightMap = new HeightMap(editSession, region);
HeightMap heightMap = new HeightMap(editSession, region, mask);
HeightMapFilter filter = new HeightMapFilter(new GaussianKernel(5, 1.0));
heightMap.applyFilter(filter, iterations);
}