forked from Syomus/ProceduralToolkit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
PathClipper.cs
216 lines (200 loc) · 10.7 KB
/
PathClipper.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
using System;
using System.Collections.Generic;
using ProceduralToolkit.ClipperLib;
using UnityEngine;
namespace ProceduralToolkit
{
/// <summary>
/// Clipper wrapper
/// </summary>
public class PathClipper
{
/// <summary>
/// If set to true, polygons returned by clipping operations will have orientations opposite to their normal orientations.
/// </summary>
public bool reverseSolution
{
get => clipper.ReverseSolution;
set => clipper.ReverseSolution = value;
}
/// <summary>
/// If set to true, polygons returned by clipping operations will be strictly simple, otherwise they may be weakly simple.
/// Computationally expensive.
/// </summary>
public bool strictlySimple
{
get => clipper.StrictlySimple;
set => clipper.StrictlySimple = value;
}
/// <summary>
/// If set to true, collinear vertices in input paths will not be removed before clipping.
/// </summary>
public bool preserveCollinear
{
get => clipper.PreserveCollinear;
set => clipper.PreserveCollinear = value;
}
private readonly Clipper clipper;
/// <summary>
/// Constructs a new PathClipper
/// </summary>
/// <param name="initOptions"> A set of flags controlling the corresponding properties. </param>
public PathClipper(InitOptions initOptions = 0)
{
clipper = new Clipper((int) initOptions);
}
/// <summary>
/// Adds a path to a Clipper object in preparation for clipping.
/// </summary>
/// <param name="path"> Vertices of the path. </param>
/// <param name="polyType"> Type of the path (Subject or Clip). </param>
/// <param name="closed"> Controls whether the path is closed. Clipping paths must always be closed. </param>
/// <returns> False if the path is invalid for clipping, true otherwise. </returns>
public bool AddPath(IList<Vector2> path, PolyType polyType, bool closed = true)
{
return clipper.AddPath(ClipperUtility.ToIntPath(path), polyType, closed);
}
/// <summary>
/// Adds a path to a Clipper object in preparation for clipping.
/// </summary>
/// <param name="path"> Vertices of the path. </param>
/// <param name="polyType"> Type of the path (Subject or Clip). </param>
/// <param name="closed"> Controls whether the path is closed. Clipping paths must always be closed. </param>
/// <returns> False if the path is invalid for clipping, true otherwise. </returns>
public bool AddPath(List<Vector2> path, PolyType polyType, bool closed = true)
{
return clipper.AddPath(ClipperUtility.ToIntPath(path), polyType, closed);
}
/// <summary>
/// Adds a path to a Clipper object in preparation for clipping.
/// </summary>
/// <param name="path"> Vertices of the path. </param>
/// <param name="polyType"> Type of the path (Subject or Clip). </param>
/// <param name="closed"> Controls whether the path is closed. Clipping paths must always be closed. </param>
/// <returns> False if the path is invalid for clipping, true otherwise. </returns>
public bool AddPath(List<IntPoint> path, PolyType polyType, bool closed = true)
{
return clipper.AddPath(path, polyType, closed);
}
/// <summary>
/// Adds paths to a Clipper object in preparation for clipping.
/// </summary>
/// <param name="paths"> List of paths. </param>
/// <param name="polyType"> Type of the path (Subject or Clip). </param>
/// <param name="closed"> Controls whether the path is closed. Clipping paths must always be closed. </param>
/// <returns> False if all paths are invalid for clipping, true otherwise. </returns>
public bool AddPaths(List<List<Vector2>> paths, PolyType polyType, bool closed = true)
{
return clipper.AddPaths(ClipperUtility.ToIntPaths(paths), polyType, closed);
}
/// <summary>
/// Adds paths to a Clipper object in preparation for clipping.
/// </summary>
/// <param name="paths"> List of paths. </param>
/// <param name="polyType"> Type of the path (Subject or Clip). </param>
/// <param name="closed"> Controls whether the path is closed. Clipping paths must always be closed. </param>
/// <returns> False if all paths are invalid for clipping, true otherwise. </returns>
public bool AddPaths(List<List<IntPoint>> paths, PolyType polyType, bool closed = true)
{
return clipper.AddPaths(paths, polyType, closed);
}
/// <summary>
/// Performs the clipping operation.
/// Can be called multiple times without reassigning subject and clip polygons
/// (ie when different clipping operations are required on the same polygon sets).
/// </summary>
/// <param name="clipType"> Type of the clipping operation. </param>
/// <param name="output"> The List that will receive the result of the clipping operation. </param>
/// <param name="fillType"> Fill rule that will be applied to the paths. </param>
/// <returns> True if the operation was successful, false otherwise. </returns>
public bool Clip(ClipType clipType, ref List<List<Vector2>> output, PolyFillType fillType = PolyFillType.pftEvenOdd)
{
return Clip(clipType, ref output, fillType, fillType);
}
/// <summary>
/// Performs the clipping operation.
/// Can be called multiple times without reassigning subject and clip polygons
/// (ie when different clipping operations are required on the same polygon sets).
/// </summary>
/// <param name="clipType"> Type of the clipping operation. </param>
/// <param name="output"> The List that will receive the result of the clipping operation. </param>
/// <param name="subjectFillType"> Fill rule that will be applied to the subject paths. </param>
/// <param name="clipFillType"> Fill rule that will be applied to the clip paths. </param>
/// <returns> True if the operation was successful, false otherwise. </returns>
public bool Clip(ClipType clipType, ref List<List<Vector2>> output, PolyFillType subjectFillType, PolyFillType clipFillType)
{
var intOutput = new List<List<IntPoint>>();
bool succeeded = clipper.Execute(clipType, intOutput, subjectFillType, clipFillType);
ClipperUtility.ToVector2Paths(intOutput, ref output);
return succeeded;
}
/// <summary>
/// Performs the clipping operation.
/// Can be called multiple times without reassigning subject and clip polygons
/// (ie when different clipping operations are required on the same polygon sets).
/// </summary>
/// <param name="clipType"> Type of the clipping operation. </param>
/// <param name="output"> The List that will receive the result of the clipping operation. </param>
/// <param name="fillType"> Fill rule that will be applied to the paths. </param>
/// <returns> True if the operation was successful, false otherwise. </returns>
public bool Clip(ClipType clipType, ref List<List<IntPoint>> output, PolyFillType fillType = PolyFillType.pftEvenOdd)
{
return Clip(clipType, ref output, fillType, fillType);
}
/// <summary>
/// Performs the clipping operation.
/// Can be called multiple times without reassigning subject and clip polygons
/// (ie when different clipping operations are required on the same polygon sets).
/// </summary>
/// <param name="clipType"> Type of the clipping operation. </param>
/// <param name="output"> The List that will receive the result of the clipping operation. </param>
/// <param name="subjectFillType"> Fill rule that will be applied to the subject paths. </param>
/// <param name="clipFillType"> Fill rule that will be applied to the clip paths. </param>
/// <returns> True if the operation was successful, false otherwise. </returns>
public bool Clip(ClipType clipType, ref List<List<IntPoint>> output, PolyFillType subjectFillType, PolyFillType clipFillType)
{
return clipper.Execute(clipType, output, subjectFillType, clipFillType);
}
/// <summary>
/// Performs the clipping operation.
/// Can be called multiple times without reassigning subject and clip polygons
/// (ie when different clipping operations are required on the same polygon sets).
/// </summary>
/// <param name="clipType"> Type of the clipping operation. </param>
/// <param name="output"> The PolyTree that will receive the result of the clipping operation. </param>
/// <param name="fillType"> Fill rule that will be applied to the paths. </param>
/// <returns> True if the operation was successful, false otherwise. </returns>
public bool Clip(ClipType clipType, ref PolyTree output, PolyFillType fillType = PolyFillType.pftEvenOdd)
{
return Clip(clipType, ref output, fillType, fillType);
}
/// <summary>
/// Performs the clipping operation.
/// Can be called multiple times without reassigning subject and clip polygons
/// (ie when different clipping operations are required on the same polygon sets).
/// </summary>
/// <param name="clipType"> Type of the clipping operation. </param>
/// <param name="output"> The PolyTree that will receive the result of the clipping operation. </param>
/// <param name="subjectFillType"> Fill rule that will be applied to the subject paths. </param>
/// <param name="clipFillType"> Fill rule that will be applied to the clip paths. </param>
/// <returns> True if the operation was successful, false otherwise. </returns>
public bool Clip(ClipType clipType, ref PolyTree output, PolyFillType subjectFillType, PolyFillType clipFillType)
{
return clipper.Execute(clipType, output, subjectFillType, clipFillType);
}
/// <summary>
/// Clears all paths from the Clipper object, allowing new paths to be assigned.
/// </summary>
public void Clear()
{
clipper.Clear();
}
[Flags]
public enum InitOptions : int
{
ReverseSolution = 1,
StrictlySimple = 2,
PreserveCollinear = 4,
}
}
}