GameObject SpawnSegment(bool leftSide) { clipType = leftSide ? ClipperLib.ClipType.ctIntersection : ClipperLib.ClipType.ctDifference; ClipperLib.PolyTree tree = new ClipperLib.PolyTree(); clip.Execute(clipType, tree, ClipperLib.PolyFillType.pftNonZero, ClipperLib.PolyFillType.pftNonZero); List <Vector3> verts = new List <Vector3>(); List <Vector3> norms = new List <Vector3>(); List <Vector2> uvs = new List <Vector2>(); List <int> faces = new List <int>(); int idx = 0; foreach (ClipperLib.PolyNode child in tree.Childs) { if (!child.IsHole) { renderTree(child, verts, norms, uvs, faces, ref idx); } } if (verts.Count == 0) { return(null); } Mesh mesh = new Mesh(); mesh.Clear(); mesh.vertices = verts.ToArray(); mesh.uv = uvs.ToArray(); mesh.normals = norms.ToArray(); mesh.triangles = faces.ToArray(); GameObject obj = GameObject.Instantiate <GameObject>(sliceInfo.slicePrefab); obj.GetComponent <MeshFilter>().mesh = mesh; obj.GetComponent <MeshRenderer>().material = sliceInfo.renderObject.material; Transform t = obj.transform; t.localPosition = transform.localPosition; t.localRotation = transform.localRotation; t.localScale = transform.localScale; Vector3 min = new Vector3(1000, 1000, 0); Vector3 max = new Vector3(-1000, -1000, 0); foreach (Vector3 v in verts) { min = Vector3.Min(min, v); max = Vector3.Max(max, v); } BoxCollider2D c = obj.GetComponent <BoxCollider2D>(); c.offset = (max + min) / 2; c.size = max - min; return(obj); }
public MergePathObject3D(string name, ClipperLib.ClipType clipType) { this.operationName = name; this.clipType = clipType; Name = name; }
private Zones.TPolygon[] CalcOutOfBoundsPoly(Zones.TPolygon Tile, Zones.TPolygon BoxRect, ClipperLib.ClipType clipType) { List <List <ClipperLib.IntPoint> > subj = new List <List <ClipperLib.IntPoint> >(); subj.Add(new List <ClipperLib.IntPoint>()); for (int i = 0; i < Tile.Dots.Length; i++) { subj[0].Add(new ClipperLib.IntPoint((long)Tile[i].X, (long)Tile[i].Y)); } List <List <ClipperLib.IntPoint> > clip = new List <List <ClipperLib.IntPoint> >(); clip.Add(new List <ClipperLib.IntPoint>(4)); for (int i = 0; i < BoxRect.Dots.Length; i++) { clip[0].Add(new ClipperLib.IntPoint((long)BoxRect[i].X, (long)BoxRect[i].Y)); } List <ClipperLib.ExPolygon> solution = new List <ClipperLib.ExPolygon>(); ClipperLib.Clipper c = new ClipperLib.Clipper(); c.AddPolygons(clip, ClipperLib.PolyType.ptSubject); c.AddPolygons(subj, ClipperLib.PolyType.ptClip); bool res = (c.Execute(clipType, solution)); // , ClipperLib.PolyFillType.pftEvenOdd, ClipperLib.PolyFillType.pftEvenOdd if (res) { if (solution.Count > 0) { List <Zones.TPolygon> pols = new List <Zones.TPolygon>(); for (int s = 0; s < solution.Count; s++) { Zones.TPolygon poly = new Zones.TPolygon((ushort)solution[s].outer.Count); for (int i = 0; i < poly.Dots.Length; i++) { poly[i] = new Zones.TPoint((double)solution[s].outer[i].X, (double)solution[s].outer[i].Y); } pols.Add(poly); } ; return(pols.ToArray()); } } ; return(null); }