2018-08-12 14:03:07 +00:00
|
|
|
package com.boydti.fawe.object.brush;
|
|
|
|
|
|
|
|
import com.boydti.fawe.object.brush.heightmap.HeightMap;
|
|
|
|
import com.boydti.fawe.object.mask.AdjacentAnyMask;
|
2019-02-17 08:47:32 +00:00
|
|
|
import com.boydti.fawe.util.MathMan;
|
2018-08-12 14:03:07 +00:00
|
|
|
import com.sk89q.worldedit.EditSession;
|
|
|
|
import com.sk89q.worldedit.MaxChangedBlocksException;
|
|
|
|
import com.sk89q.worldedit.entity.Player;
|
|
|
|
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
|
|
|
import com.sk89q.worldedit.function.mask.Mask;
|
|
|
|
import com.sk89q.worldedit.function.mask.Masks;
|
|
|
|
import com.sk89q.worldedit.function.mask.SolidBlockMask;
|
|
|
|
import com.sk89q.worldedit.function.operation.Operations;
|
|
|
|
import com.sk89q.worldedit.function.pattern.Pattern;
|
2019-06-08 00:58:48 +00:00
|
|
|
import com.sk89q.worldedit.function.visitor.BreadthFirstSearch;
|
2018-08-12 14:03:07 +00:00
|
|
|
import com.sk89q.worldedit.function.visitor.RecursiveVisitor;
|
2018-12-23 16:19:33 +00:00
|
|
|
import com.sk89q.worldedit.math.BlockVector3;
|
2019-03-31 16:09:20 +00:00
|
|
|
import com.sk89q.worldedit.math.MutableVector3;
|
2018-12-23 16:19:33 +00:00
|
|
|
import com.sk89q.worldedit.math.Vector3;
|
2018-08-12 14:03:07 +00:00
|
|
|
import com.sk89q.worldedit.math.transform.AffineTransform;
|
|
|
|
import com.sk89q.worldedit.util.Location;
|
2019-06-08 00:58:48 +00:00
|
|
|
|
2018-08-12 14:03:07 +00:00
|
|
|
import java.io.InputStream;
|
|
|
|
import java.util.Arrays;
|
2019-06-08 00:58:48 +00:00
|
|
|
import java.util.concurrent.ThreadLocalRandom;
|
2018-08-12 14:03:07 +00:00
|
|
|
|
|
|
|
public class StencilBrush extends HeightBrush {
|
|
|
|
private final boolean onlyWhite;
|
|
|
|
|
|
|
|
public StencilBrush(InputStream stream, int rotation, double yscale, boolean onlyWhite, Clipboard clipboard) {
|
|
|
|
super(stream, rotation, yscale, false, true, clipboard);
|
|
|
|
this.onlyWhite = onlyWhite;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2018-12-23 16:19:33 +00:00
|
|
|
public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double sizeDouble) throws MaxChangedBlocksException {
|
2018-08-12 14:03:07 +00:00
|
|
|
final int cx = position.getBlockX();
|
|
|
|
final int cy = position.getBlockY();
|
|
|
|
final int cz = position.getBlockZ();
|
|
|
|
int size = (int) sizeDouble;
|
|
|
|
int size2 = (int) (sizeDouble * sizeDouble);
|
|
|
|
int maxY = editSession.getMaxY();
|
|
|
|
int add;
|
|
|
|
if (yscale < 0) {
|
|
|
|
add = maxY;
|
|
|
|
} else {
|
|
|
|
add = 0;
|
|
|
|
}
|
|
|
|
double scale = (yscale / sizeDouble) * (maxY + 1);
|
|
|
|
final HeightMap map = getHeightMap();
|
|
|
|
map.setSize(size);
|
|
|
|
int cutoff = onlyWhite ? maxY : 0;
|
|
|
|
final SolidBlockMask solid = new SolidBlockMask(editSession);
|
|
|
|
final AdjacentAnyMask adjacent = new AdjacentAnyMask(Masks.negate(solid));
|
|
|
|
|
|
|
|
|
|
|
|
Player player = editSession.getPlayer().getPlayer();
|
2019-06-08 00:58:48 +00:00
|
|
|
// BlockVector3 pos = player.getLocation();
|
2018-08-12 14:03:07 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Location loc = editSession.getPlayer().getPlayer().getLocation();
|
|
|
|
float yaw = loc.getYaw();
|
|
|
|
float pitch = loc.getPitch();
|
|
|
|
AffineTransform transform = new AffineTransform().rotateY((-yaw) % 360).rotateX(pitch - 90).inverse();
|
|
|
|
|
|
|
|
|
|
|
|
RecursiveVisitor visitor = new RecursiveVisitor(new Mask() {
|
2019-03-31 16:09:20 +00:00
|
|
|
private final MutableVector3 mutable = new MutableVector3();
|
2018-08-12 14:03:07 +00:00
|
|
|
@Override
|
2018-12-23 16:19:33 +00:00
|
|
|
public boolean test(BlockVector3 vector) {
|
2018-08-12 14:03:07 +00:00
|
|
|
if (solid.test(vector)) {
|
|
|
|
int dx = vector.getBlockX() - cx;
|
|
|
|
int dy = vector.getBlockY() - cy;
|
|
|
|
int dz = vector.getBlockZ() - cz;
|
|
|
|
|
2019-03-31 16:09:20 +00:00
|
|
|
Vector3 srcPos = transform.apply(mutable.setComponents(dx, dy, dz));
|
2018-12-23 16:19:33 +00:00
|
|
|
dx = MathMan.roundInt(srcPos.getX());
|
|
|
|
dz = MathMan.roundInt(srcPos.getZ());
|
2018-08-12 14:03:07 +00:00
|
|
|
|
|
|
|
int distance = dx * dx + dz * dz;
|
|
|
|
if (distance > size2 || Math.abs(dx) > 256 || Math.abs(dz) > 256) return false;
|
|
|
|
|
|
|
|
double raise = map.getHeight(dx, dz);
|
|
|
|
int val = (int) Math.ceil(raise * scale) + add;
|
|
|
|
if (val < cutoff) {
|
|
|
|
return true;
|
|
|
|
}
|
2019-06-08 00:58:48 +00:00
|
|
|
if (val >= 255 || ThreadLocalRandom.current().nextInt(maxY) < val) {
|
2018-08-12 14:03:07 +00:00
|
|
|
editSession.setBlock(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ(), pattern);
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}, vector -> true, Integer.MAX_VALUE, editSession);
|
2019-06-08 00:58:48 +00:00
|
|
|
visitor.setDirections(Arrays.asList(BreadthFirstSearch.DIAGONAL_DIRECTIONS));
|
2018-08-12 14:03:07 +00:00
|
|
|
visitor.visit(position);
|
|
|
|
Operations.completeBlindly(visitor);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void apply(double val) {
|
|
|
|
|
|
|
|
}
|
2019-06-08 00:58:48 +00:00
|
|
|
}
|