예제 #1
0
    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);
    }
예제 #2
0
 public MergePathObject3D(string name, ClipperLib.ClipType clipType)
 {
     this.operationName = name;
     this.clipType      = clipType;
     Name = name;
 }
예제 #3
0
파일: CForm.cs 프로젝트: dkxce/PlitkaCalc
        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);
        }