2014-04-04 01:32:51 +00:00
|
|
|
/*
|
2014-04-04 20:57:27 +00:00
|
|
|
* WorldEdit, a Minecraft world manipulation toolkit
|
|
|
|
* Copyright (C) sk89q <http://www.sk89q.com>
|
|
|
|
* Copyright (C) WorldEdit team and contributors
|
2014-04-04 01:32:51 +00:00
|
|
|
*
|
2014-04-04 22:03:18 +00:00
|
|
|
* This program is free software: you can redistribute it and/or modify it
|
|
|
|
* under the terms of the GNU Lesser General Public License as published by the
|
|
|
|
* Free Software Foundation, either version 3 of the License, or
|
2014-04-04 01:32:51 +00:00
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
2014-04-04 22:03:18 +00:00
|
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
|
|
|
* for more details.
|
2014-04-04 01:32:51 +00:00
|
|
|
*
|
2014-04-04 22:03:18 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
2014-04-04 01:32:51 +00:00
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
2014-04-04 20:57:27 +00:00
|
|
|
*/
|
2014-04-04 01:32:51 +00:00
|
|
|
|
|
|
|
package com.sk89q.worldedit.regions.selector;
|
|
|
|
|
2014-04-04 20:57:27 +00:00
|
|
|
import com.sk89q.worldedit.*;
|
2014-04-04 01:32:51 +00:00
|
|
|
import com.sk89q.worldedit.Vector;
|
|
|
|
import com.sk89q.worldedit.internal.cui.CUIRegion;
|
|
|
|
import com.sk89q.worldedit.internal.cui.SelectionPointEvent;
|
|
|
|
import com.sk89q.worldedit.internal.cui.SelectionPolygonEvent;
|
|
|
|
import com.sk89q.worldedit.internal.cui.SelectionShapeEvent;
|
|
|
|
import com.sk89q.worldedit.regions.ConvexPolyhedralRegion;
|
|
|
|
import com.sk89q.worldedit.regions.Region;
|
2014-04-04 02:50:05 +00:00
|
|
|
import com.sk89q.worldedit.regions.RegionSelector;
|
2014-04-04 01:32:51 +00:00
|
|
|
import com.sk89q.worldedit.regions.polyhedron.Triangle;
|
|
|
|
|
2014-04-04 20:57:27 +00:00
|
|
|
import javax.annotation.Nullable;
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
import static com.google.common.base.Preconditions.checkNotNull;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A {@link RegionSelector} for {@link ConvexPolyhedralRegion}s.
|
|
|
|
*/
|
|
|
|
public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions.ConvexPolyhedralRegionSelector implements RegionSelector, CUIRegion {
|
|
|
|
|
2014-04-04 01:32:51 +00:00
|
|
|
private int maxVertices;
|
|
|
|
private final ConvexPolyhedralRegion region;
|
|
|
|
private BlockVector pos1;
|
|
|
|
|
2014-04-04 20:57:27 +00:00
|
|
|
/**
|
|
|
|
* Create a new selector.
|
|
|
|
*
|
|
|
|
* @param world the world
|
|
|
|
* @param maxVertices the maximum number of vertices, where a number below 0 means unbounded
|
|
|
|
*/
|
|
|
|
public ConvexPolyhedralRegionSelector(@Nullable LocalWorld world, int maxVertices) {
|
2014-04-04 01:32:51 +00:00
|
|
|
this.maxVertices = maxVertices;
|
|
|
|
region = new ConvexPolyhedralRegion(world);
|
|
|
|
}
|
|
|
|
|
2014-04-04 20:57:27 +00:00
|
|
|
/**
|
|
|
|
* Create a new selector.
|
|
|
|
*
|
|
|
|
* @param oldSelector the old selector
|
|
|
|
* @param maxVertices the maximum number of vertices, where a number below 0 means unbounded
|
|
|
|
*/
|
2014-04-04 01:32:51 +00:00
|
|
|
public ConvexPolyhedralRegionSelector(RegionSelector oldSelector, int maxVertices) {
|
2014-04-04 20:57:27 +00:00
|
|
|
checkNotNull(oldSelector);
|
|
|
|
|
2014-04-04 01:32:51 +00:00
|
|
|
this.maxVertices = maxVertices;
|
|
|
|
if (oldSelector instanceof ConvexPolyhedralRegionSelector) {
|
|
|
|
final ConvexPolyhedralRegionSelector convexPolyhedralRegionSelector = (ConvexPolyhedralRegionSelector) oldSelector;
|
|
|
|
|
|
|
|
pos1 = convexPolyhedralRegionSelector.pos1;
|
|
|
|
region = new ConvexPolyhedralRegion(convexPolyhedralRegionSelector.region);
|
|
|
|
} else {
|
|
|
|
final Region oldRegion;
|
|
|
|
try {
|
|
|
|
oldRegion = oldSelector.getRegion();
|
|
|
|
} catch (IncompleteRegionException e) {
|
|
|
|
region = new ConvexPolyhedralRegion(oldSelector.getIncompleteRegion().getWorld());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
final int minY = oldRegion.getMinimumPoint().getBlockY();
|
|
|
|
final int maxY = oldRegion.getMaximumPoint().getBlockY();
|
|
|
|
|
|
|
|
region = new ConvexPolyhedralRegion(oldRegion.getWorld());
|
|
|
|
|
|
|
|
for (final BlockVector2D pt : new ArrayList<BlockVector2D>(oldRegion.polygonize(maxVertices < 0 ? maxVertices : maxVertices / 2))) {
|
|
|
|
region.addVertex(pt.toVector(minY));
|
|
|
|
region.addVertex(pt.toVector(maxY));
|
|
|
|
}
|
|
|
|
|
|
|
|
learnChanges();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean selectPrimary(Vector pos) {
|
|
|
|
clear();
|
|
|
|
pos1 = pos.toBlockVector();
|
|
|
|
return region.addVertex(pos);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean selectSecondary(Vector pos) {
|
|
|
|
if (maxVertices >= 0 && region.getVertices().size() > maxVertices) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return region.addVertex(pos);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public BlockVector getPrimaryPosition() throws IncompleteRegionException {
|
|
|
|
return pos1;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Region getRegion() throws IncompleteRegionException {
|
|
|
|
if (!region.isDefined()) {
|
|
|
|
throw new IncompleteRegionException();
|
|
|
|
}
|
|
|
|
|
|
|
|
return region;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Region getIncompleteRegion() {
|
|
|
|
return region;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isDefined() {
|
|
|
|
return region.isDefined();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getArea() {
|
|
|
|
return region.getArea();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void learnChanges() {
|
|
|
|
pos1 = region.getVertices().iterator().next().toBlockVector();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void clear() {
|
|
|
|
region.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getTypeName() {
|
|
|
|
return "Convex Polyhedron";
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public List<String> getInformationLines() {
|
|
|
|
List<String> ret = new ArrayList<String>();
|
|
|
|
|
|
|
|
ret.add("Vertices: "+region.getVertices().size());
|
|
|
|
ret.add("Triangles: "+region.getTriangles().size());
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void explainPrimarySelection(LocalPlayer player, LocalSession session, Vector pos) {
|
|
|
|
session.describeCUI(player);
|
|
|
|
|
|
|
|
player.print("Started new selection with vertex "+pos+".");
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void explainSecondarySelection(LocalPlayer player, LocalSession session, Vector pos) {
|
|
|
|
session.describeCUI(player);
|
|
|
|
|
|
|
|
player.print("Added vertex "+pos+" to the selection.");
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void explainRegionAdjust(LocalPlayer player, LocalSession session) {
|
|
|
|
session.describeCUI(player);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getProtocolVersion() {
|
|
|
|
return 3;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getTypeID() {
|
|
|
|
return "polyhedron";
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void describeCUI(LocalSession session, LocalPlayer player) {
|
|
|
|
Collection<Vector> vertices = region.getVertices();
|
|
|
|
Collection<Triangle> triangles = region.getTriangles();
|
|
|
|
|
|
|
|
player.dispatchCUIEvent(new SelectionShapeEvent(getTypeID()));
|
|
|
|
|
|
|
|
Map<Vector, Integer> vertexIds = new HashMap<Vector, Integer>(vertices.size());
|
|
|
|
int lastVertexId = -1;
|
|
|
|
for (Vector vertex : vertices) {
|
|
|
|
vertexIds.put(vertex, ++lastVertexId);
|
|
|
|
session.dispatchCUIEvent(player, new SelectionPointEvent(lastVertexId, vertex, getArea()));
|
|
|
|
}
|
|
|
|
|
|
|
|
for (Triangle triangle : triangles) {
|
|
|
|
final int[] v = new int[3];
|
|
|
|
for (int i = 0; i < 3; ++i) {
|
|
|
|
v[i] = vertexIds.get(triangle.getVertex(i));
|
|
|
|
}
|
|
|
|
session.dispatchCUIEvent(player, new SelectionPolygonEvent(v));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getLegacyTypeID() {
|
|
|
|
return "cuboid";
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void describeLegacyCUI(LocalSession session, LocalPlayer player) {
|
|
|
|
if (isDefined()) {
|
|
|
|
session.dispatchCUIEvent(player, new SelectionPointEvent(0, region.getMinimumPoint(), getArea()));
|
|
|
|
session.dispatchCUIEvent(player, new SelectionPointEvent(1, region.getMaximumPoint(), getArea()));
|
|
|
|
} else {
|
|
|
|
session.dispatchCUIEvent(player, new SelectionShapeEvent(getLegacyTypeID()));
|
|
|
|
}
|
|
|
|
}
|
2014-04-04 20:57:27 +00:00
|
|
|
|
2014-04-04 01:32:51 +00:00
|
|
|
}
|