package org.mt4j.components.visibleComponents.shapes; import java.util.ArrayList; import java.util.List; import org.mt4j.components.visibleComponents.GeometryInfo; import org.mt4j.components.visibleComponents.shapes.mesh.MTTriangleMesh; import org.mt4j.util.math.Vertex; import org.mt4j.util.opengl.GluTrianglulator; import processing.core.PApplet; public class MTComplexPolygon extends MTTriangleMesh { public static final int WINDING_RULE_ODD = GluTrianglulator.WINDING_RULE_ODD; public static final int WINDING_RULE_NONZERO = GluTrianglulator.WINDING_RULE_NONZERO; //TODO override the intersection/containspoint methods to only use outline? //-> else we do expensive checks against each triangle //TODO note that its expensive to re/set vertices often //TODO note that using setGeometryInfo directly is discouraged here public MTComplexPolygon(PApplet app, Vertex[] vertices) { super(app, new GeometryInfo(app, new Vertex[]{}), false); this.setVertices(vertices); this.setNoStroke(false); } public MTComplexPolygon(PApplet app, List<Vertex[]> contours) { this(app, contours, GluTrianglulator.WINDING_RULE_ODD); } public MTComplexPolygon(PApplet app, List<Vertex[]> contours, int windingRule) { super(app, new GeometryInfo(app, new Vertex[]{}), false); this.setVertices(contours, windingRule); this.setNoStroke(false); } public void setVertices(List<Vertex[]> contours, int windingRule) { this.setOutlineContours(contours); GluTrianglulator triangulator = new GluTrianglulator(getRenderer()); List<Vertex> tris = triangulator.tesselate(contours, windingRule); triangulator.deleteTess(); super.setVertices(tris.toArray(new Vertex[tris.size()])); } @Override public void setVertices(Vertex[] vertices) { List<Vertex[]> contours = new ArrayList<Vertex[]>(); contours.add(vertices); this.setOutlineContours(contours); GluTrianglulator triangulator = new GluTrianglulator(getRenderer()); Vertex[] tris = triangulator.tesselate(vertices); triangulator.deleteTess(); super.setVertices(tris); } }