public void ExecuteClip(IClip clip) { BlockSimplification.epsilon = (int64)(simplifyEpsilonPercent / 100f * blockSize * VectorEx.float2int64); List <Vector2i> clipVertices = clip.GetVertices(); ClipBounds bounds = clip.GetBounds(); int x1 = Mathf.Max(0, (int)(bounds.lowerPoint.x / blockSize)); if (x1 > resolutionX - 1) { return; } int y1 = Mathf.Max(0, (int)(bounds.lowerPoint.y / blockSize)); if (y1 > resolutionY - 1) { return; } int x2 = Mathf.Min(resolutionX - 1, (int)(bounds.upperPoint.x / blockSize)); if (x2 < 0) { return; } int y2 = Mathf.Min(resolutionY - 1, (int)(bounds.upperPoint.y / blockSize)); if (y2 < 0) { return; } for (int x = x1; x <= x2; x++) { for (int y = y1; y <= y2; y++) { if (clip.CheckBlockOverlapping(new Vector2f((x + 0.5f) * blockSize, (y + 0.5f) * blockSize), blockSize)) { DestructibleBlock block = blocks[x + resolutionX * y]; List <List <Vector2i> > solutions = new List <List <Vector2i> >(); ClipperLib.Clipper clipper = new ClipperLib.Clipper(); clipper.AddPolygons(block.Polygons, ClipperLib.PolyType.ptSubject); clipper.AddPolygon(clipVertices, ClipperLib.PolyType.ptClip); clipper.Execute(ClipperLib.ClipType.ctDifference, solutions, ClipperLib.PolyFillType.pftNonZero, ClipperLib.PolyFillType.pftNonZero); UpdateBlockBounds(x, y); block.UpdateGeometryWithMoreVertices(solutions, width, height, depth); } } } }