Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/gfx/tests/gtest/TestBSPTree.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include "gtest/gtest.h"
8
9
#include "BSPTree.h"
10
#include "Polygon.h"
11
#include "PolygonTestUtils.h"
12
13
#include <deque>
14
#include <list>
15
16
using namespace mozilla::gfx;
17
using namespace mozilla::layers;
18
typedef mozilla::gfx::Polygon MozPolygon;
19
20
namespace {
21
22
static void RunTest(std::deque<MozPolygon> aPolygons,
23
                    std::deque<MozPolygon> aExpected)
24
0
{
25
0
  std::list<LayerPolygon> layers;
26
0
  for (MozPolygon& polygon : aPolygons) {
27
0
    layers.push_back(LayerPolygon(nullptr, std::move(polygon)));
28
0
  }
29
0
30
0
  const BSPTree tree(layers);
31
0
  const nsTArray<LayerPolygon> order = tree.GetDrawOrder();
32
0
33
0
  EXPECT_EQ(aExpected.size(), order.Length());
34
0
35
0
  for (size_t i = 0; i < order.Length(); ++i) {
36
0
    EXPECT_TRUE(aExpected[i] == *order[i].geometry);
37
0
  }
38
0
}
39
40
} // namespace
41
42
43
TEST(BSPTree, SameNode)
44
0
{
45
0
  const std::deque<MozPolygon> polygons {
46
0
    MozPolygon {
47
0
      Point4D(0.0f, 0.0f, 0.0f, 1.0f),
48
0
      Point4D(1.0f, 0.0f, 0.0f, 1.0f),
49
0
      Point4D(1.0f, 1.0f, 0.0f, 1.0f),
50
0
      Point4D(0.0f, 1.0f, 0.0f, 1.0f)
51
0
    },
52
0
    MozPolygon {
53
0
      Point4D(0.0f, 0.0f, 0.0f, 1.0f),
54
0
      Point4D(1.0f, 0.0f, 0.0f, 1.0f),
55
0
      Point4D(1.0f, 1.0f, 0.0f, 1.0f),
56
0
      Point4D(0.0f, 1.0f, 0.0f, 1.0f)
57
0
    }
58
0
  };
59
0
60
0
  ::RunTest(polygons, polygons);
61
0
}
62
63
TEST(BSPTree, OneChild)
64
0
{
65
0
  const MozPolygon p1 {
66
0
    Point4D(0.0f, 0.0f, 0.0f, 1.0f),
67
0
    Point4D(1.0f, 0.0f, 0.0f, 1.0f),
68
0
    Point4D(1.0f, 1.0f, 0.0f, 1.0f),
69
0
    Point4D(0.0f, 1.0f, 0.0f, 1.0f)
70
0
  };
71
0
72
0
  const MozPolygon p2 {
73
0
    Point4D(0.0f, 0.0f, 1.0f, 1.0f),
74
0
    Point4D(1.0f, 0.0f, 1.0f, 1.0f),
75
0
    Point4D(1.0f, 1.0f, 1.0f, 1.0f),
76
0
    Point4D(0.0f, 1.0f, 1.0f, 1.0f)
77
0
  };
78
0
79
0
  ::RunTest({p1, p2}, {p1, p2});
80
0
  ::RunTest({p2, p1}, {p1, p2});
81
0
}
82
83
TEST(BSPTree, SharedEdge1)
84
0
{
85
0
  MozPolygon p1 {
86
0
    Point4D(1.0f, 0.0f, 1.0f, 1.0f),
87
0
    Point4D(0.0f, 0.0f, 1.0f, 1.0f),
88
0
    Point4D(0.0f, 1.0f, 1.0f, 1.0f),
89
0
    Point4D(1.0f, 1.0f, 1.0f, 1.0f)
90
0
  };
91
0
92
0
  MozPolygon p2 {
93
0
    Point4D(1.0f, 0.0f, 1.0f, 1.0f),
94
0
    Point4D(1.0f, 1.0f, 1.0f, 1.0f),
95
0
    Point4D(2.0f, 2.0f, 1.0f, 1.0f),
96
0
    Point4D(2.0f, 0.0f, 1.0f, 1.0f)
97
0
  };
98
0
99
0
  ::RunTest({p1, p2}, {p1, p2});
100
0
}
101
102
TEST(BSPTree, SharedEdge2)
103
0
{
104
0
  MozPolygon p1 {
105
0
    Point4D(1.0f, 0.0f, 1.0f, 1.0f),
106
0
    Point4D(0.0f, 0.0f, 1.0f, 1.0f),
107
0
    Point4D(0.0f, 1.0f, 1.0f, 1.0f),
108
0
    Point4D(1.0f, 1.0f, 1.0f, 1.0f)
109
0
  };
110
0
111
0
  MozPolygon p2 {
112
0
    Point4D(1.0f, 0.0f, 1.0f, 1.0f),
113
0
    Point4D(1.0f, 1.0f, 1.0f, 1.0f),
114
0
    Point4D(2.0f, 2.0f, 0.0f, 1.0f),
115
0
    Point4D(2.0f, 0.0f, 0.0f, 1.0f)
116
0
  };
117
0
118
0
  ::RunTest({p1, p2}, {p2, p1});
119
0
}
120
121
TEST(BSPTree, SplitSharedEdge)
122
0
{
123
0
  MozPolygon p1 {
124
0
    Point4D(1.0f, 0.0f, 1.0f, 1.0f),
125
0
    Point4D(0.0f, 0.0f, 1.0f, 1.0f),
126
0
    Point4D(0.0f, 1.0f, 1.0f, 1.0f),
127
0
    Point4D(1.0f, 1.0f, 1.0f, 1.0f)
128
0
  };
129
0
130
0
  MozPolygon p2 {
131
0
    Point4D(1.0f, 0.0f, 2.0f, 1.0f),
132
0
    Point4D(1.0f, 1.0f, 2.0f, 1.0f),
133
0
    Point4D(1.0f, 1.0f, 0.0f, 1.0f),
134
0
    Point4D(1.0f, 0.0f, 0.0f, 1.0f)
135
0
  };
136
0
137
0
  const std::deque<MozPolygon> expected {
138
0
    MozPolygon {
139
0
      Point4D(1.0f, 1.0f, 1.0f, 1.0f),
140
0
      Point4D(1.0f, 1.0f, 0.0f, 1.0f),
141
0
      Point4D(1.0f, 0.0f, 0.0f, 1.0f),
142
0
      Point4D(1.0f, 0.0f, 1.0f, 1.0f)
143
0
    },
144
0
    MozPolygon {
145
0
      Point4D(1.0f, 0.0f, 1.0f, 1.0f),
146
0
      Point4D(0.0f, 0.0f, 1.0f, 1.0f),
147
0
      Point4D(0.0f, 1.0f, 1.0f, 1.0f),
148
0
      Point4D(1.0f, 1.0f, 1.0f, 1.0f)
149
0
    },
150
0
    MozPolygon {
151
0
      Point4D(1.0f, 0.0f, 2.0f, 1.0f),
152
0
      Point4D(1.0f, 1.0f, 2.0f, 1.0f),
153
0
      Point4D(1.0f, 1.0f, 1.0f, 1.0f),
154
0
      Point4D(1.0f, 0.0f, 1.0f, 1.0f)
155
0
    }
156
0
  };
157
0
158
0
  ::RunTest({p1, p2}, expected);
159
0
}
160
161
TEST(BSPTree, SplitSimple1)
162
0
{
163
0
  MozPolygon p1 {
164
0
    Point4D(0.0f, 0.0f, 1.0f, 1.0f),
165
0
    Point4D(1.0f, 0.0f, 1.0f, 1.0f),
166
0
    Point4D(1.0f, 1.0f, 1.0f, 1.0f),
167
0
    Point4D(0.0f, 1.0f, 1.0f, 1.0f)
168
0
  };
169
0
170
0
  MozPolygon p2 {
171
0
    Point4D(0.0f, 0.0f, 2.0f, 1.0f),
172
0
    Point4D(1.0f, 0.0f, 2.0f, 1.0f),
173
0
    Point4D(1.0f, 1.0f, 0.0f, 1.0f),
174
0
    Point4D(0.0f, 1.0f, 0.0f, 1.0f)
175
0
  };
176
0
177
0
  const std::deque<MozPolygon> expected {
178
0
    MozPolygon {
179
0
      Point4D(0.0f, 1.0f, 0.0f, 1.0f),
180
0
      Point4D(0.0f, 0.5f, 1.0f, 1.0f),
181
0
      Point4D(1.0f, 0.5f, 1.0f, 1.0f),
182
0
      Point4D(1.0f, 1.0f, 0.0f, 1.0f)
183
0
    },
184
0
    p1,
185
0
    MozPolygon {
186
0
      Point4D(0.0f, 0.0f, 2.0f, 1.0f),
187
0
      Point4D(1.0f, 0.0f, 2.0f, 1.0f),
188
0
      Point4D(1.0f, 0.5f, 1.0f, 1.0f),
189
0
      Point4D(0.0f, 0.5f, 1.0f, 1.0f)
190
0
    }
191
0
  };
192
0
193
0
  ::RunTest({p1, p2}, expected);
194
0
}
195
196
0
TEST(BSPTree, SplitSimple2) {
197
0
  const std::deque<MozPolygon> polygons {
198
0
    MozPolygon {
199
0
      Point4D(-5.00000f, -5.00000f, 0.00000f, 1.0f),
200
0
      Point4D(-5.00000f, 5.00000f, 0.00000f, 1.0f),
201
0
      Point4D(5.00000f, 5.00000f, 0.00000f, 1.0f),
202
0
      Point4D(5.00000f, -5.00000f, 0.00000f, 1.0f)
203
0
    },
204
0
    MozPolygon {
205
0
      Point4D(0.00000f, -5.00000f, -5.00000f, 1.0f),
206
0
      Point4D(0.00000f, 5.00000f, -5.00000f, 1.0f),
207
0
      Point4D(0.00000f, 5.00000f, 5.00000f, 1.0f),
208
0
      Point4D(0.00000f, -5.00000f, 5.00000f, 1.0f)
209
0
    }
210
0
  };
211
0
212
0
  const std::deque<MozPolygon> expected {
213
0
    MozPolygon {
214
0
      Point4D(0.00000f, -5.00000f, 0.00000f, 1.0f),
215
0
      Point4D(0.00000f, -5.00000f, -5.00000f, 1.0f),
216
0
      Point4D(0.00000f, 5.00000f, -5.00000f, 1.0f),
217
0
      Point4D(0.00000f, 5.00000f, 0.00000f, 1.0f)
218
0
    },
219
0
    MozPolygon {
220
0
      Point4D(-5.00000f, -5.00000f, 0.00000f, 1.0f),
221
0
      Point4D(-5.00000f, 5.00000f, 0.00000f, 1.0f),
222
0
      Point4D(5.00000f, 5.00000f, 0.00000f, 1.0f),
223
0
      Point4D(5.00000f, -5.00000f, 0.00000f, 1.0f)
224
0
    },
225
0
    MozPolygon {
226
0
      Point4D(0.00000f, 5.00000f, 0.00000f, 1.0f),
227
0
      Point4D(0.00000f, 5.00000f, 5.00000f, 1.0f),
228
0
      Point4D(0.00000f, -5.00000f, 5.00000f, 1.0f),
229
0
      Point4D(0.00000f, -5.00000f, 0.00000f, 1.0f)
230
0
    }
231
0
  };
232
0
  ::RunTest(polygons, expected);
233
0
}
234
235
0
TEST(BSPTree, NoSplit1) {
236
0
  const std::deque<MozPolygon> polygons {
237
0
    MozPolygon {
238
0
      Point4D(0.00000f, 10.00000f, 0.00000f, 1.0f),
239
0
      Point4D(0.00000f, 0.00000f, 0.00000f, 1.0f),
240
0
      Point4D(10.00000f, 0.00000f, 0.00000f, 1.0f),
241
0
      Point4D(10.00000f, 10.00000f, 0.00000f, 1.0f)
242
0
    },
243
0
    MozPolygon {
244
0
      Point4D(0.00000f, 10.00000f, -5.00000f, 1.0f),
245
0
      Point4D(0.00000f, 0.00000f, -5.00000f, 1.0f),
246
0
      Point4D(10.00000f, 0.00000f, -5.00000f, 1.0f),
247
0
      Point4D(10.00000f, 10.00000f, -5.00000f, 1.0f)
248
0
    },
249
0
    MozPolygon {
250
0
      Point4D(0.00000f, 10.00000f, 5.00000f, 1.0f),
251
0
      Point4D(0.00000f, 0.00000f, 5.00000f, 1.0f),
252
0
      Point4D(10.00000f, 0.00000f, 5.00000f, 1.0f),
253
0
      Point4D(10.00000f, 10.00000f, 5.00000f, 1.0f)
254
0
    }
255
0
  };
256
0
257
0
  const std::deque<MozPolygon> expected {
258
0
    MozPolygon {
259
0
      Point4D(0.00000f, 10.00000f, -5.00000f, 1.0f),
260
0
      Point4D(0.00000f, 0.00000f, -5.00000f, 1.0f),
261
0
      Point4D(10.00000f, 0.00000f, -5.00000f, 1.0f),
262
0
      Point4D(10.00000f, 10.00000f, -5.00000f, 1.0f)
263
0
    },
264
0
    MozPolygon {
265
0
      Point4D(0.00000f, 10.00000f, 0.00000f, 1.0f),
266
0
      Point4D(0.00000f, 0.00000f, 0.00000f, 1.0f),
267
0
      Point4D(10.00000f, 0.00000f, 0.00000f, 1.0f),
268
0
      Point4D(10.00000f, 10.00000f, 0.00000f, 1.0f)
269
0
    },
270
0
    MozPolygon {
271
0
      Point4D(0.00000f, 10.00000f, 5.00000f, 1.0f),
272
0
      Point4D(0.00000f, 0.00000f, 5.00000f, 1.0f),
273
0
      Point4D(10.00000f, 0.00000f, 5.00000f, 1.0f),
274
0
      Point4D(10.00000f, 10.00000f, 5.00000f, 1.0f)
275
0
    }
276
0
  };
277
0
  ::RunTest(polygons, expected);
278
0
}
279
280
0
TEST(BSPTree, NoSplit2) {
281
0
  const std::deque<MozPolygon> polygons {
282
0
    MozPolygon {
283
0
      Point4D(-5.00000f, -5.00000f, 0.00000f, 1.0f),
284
0
      Point4D(-5.00000f, 5.00000f, 0.00000f, 1.0f),
285
0
      Point4D(5.00000f, 5.00000f, 0.00000f, 1.0f),
286
0
      Point4D(5.00000f, -5.00000f, 0.00000f, 1.0f)
287
0
    },
288
0
    MozPolygon {
289
0
      Point4D(0.00000f, 5.00000f, -15.00000f, 1.0f),
290
0
      Point4D(0.00000f, -5.00000f, -15.00000f, 1.0f),
291
0
      Point4D(0.00000f, -5.00000f, -10.00000f, 1.0f),
292
0
      Point4D(0.00000f, 5.00000f, -10.00000f, 1.0f)
293
0
    }
294
0
  };
295
0
296
0
  const std::deque<MozPolygon> expected {
297
0
    MozPolygon {
298
0
      Point4D(0.00000f, 5.00000f, -15.00000f, 1.0f),
299
0
      Point4D(0.00000f, -5.00000f, -15.00000f, 1.0f),
300
0
      Point4D(0.00000f, -5.00000f, -10.00000f, 1.0f),
301
0
      Point4D(0.00000f, 5.00000f, -10.00000f, 1.0f)
302
0
    },
303
0
    MozPolygon {
304
0
      Point4D(-5.00000f, -5.00000f, 0.00000f, 1.0f),
305
0
      Point4D(-5.00000f, 5.00000f, 0.00000f, 1.0f),
306
0
      Point4D(5.00000f, 5.00000f, 0.00000f, 1.0f),
307
0
      Point4D(5.00000f, -5.00000f, 0.00000f, 1.0f)
308
0
    }
309
0
  };
310
0
  ::RunTest(polygons, expected);
311
0
}
312
313
0
TEST(BSPTree, TwoPlaneIntersectRotate0degrees) {
314
0
  const std::deque<MozPolygon> polygons {
315
0
    MozPolygon {
316
0
      Point4D(-0.00000f, 2.00000f, 2.00000f, 1.0f),
317
0
      Point4D(-0.00000f, -2.00000f, 2.00000f, 1.0f),
318
0
      Point4D(0.00010f, -2.00000f, -2.00000f, 1.0f),
319
0
      Point4D(0.00010f, 2.00000f, -2.00000f, 1.0f)
320
0
    },
321
0
    MozPolygon {
322
0
      Point4D(2.00000f, 0.00000f, 2.00000f, 1.0f),
323
0
      Point4D(2.00000f, -0.00000f, -2.00000f, 1.0f),
324
0
      Point4D(-2.00000f, 0.00000f, -2.00000f, 1.0f),
325
0
      Point4D(-2.00000f, 0.00010f, 2.00000f, 1.0f)
326
0
    }
327
0
  };
328
0
329
0
  const std::deque<MozPolygon> expected {
330
0
    MozPolygon {
331
0
      Point4D(2.00000f, 0.00000f, 2.00000f, 1.0f),
332
0
      Point4D(2.00000f, -0.00000f, -2.00000f, 1.0f),
333
0
      Point4D(-2.00000f, 0.00000f, -2.00000f, 1.0f),
334
0
      Point4D(-2.00000f, 0.00010f, 2.00000f, 1.0f)
335
0
    },
336
0
    MozPolygon {
337
0
      Point4D(-0.00000f, 2.00000f, 2.00000f, 1.0f),
338
0
      Point4D(-0.00000f, -2.00000f, 2.00000f, 1.0f),
339
0
      Point4D(0.00010f, -2.00000f, -2.00000f, 1.0f),
340
0
      Point4D(0.00010f, 2.00000f, -2.00000f, 1.0f)
341
0
    }
342
0
  };
343
0
  ::RunTest(polygons, expected);
344
0
}
345
346
0
TEST(BSPTree, TwoPlaneIntersectRotate20degrees) {
347
0
  const std::deque<MozPolygon> polygons {
348
0
    MozPolygon {
349
0
      Point4D(-0.00000f, 1.19540f, 2.56350f, 1.0f),
350
0
      Point4D(-0.00000f, -2.56340f, 1.19540f, 1.0f),
351
0
      Point4D(0.00010f, -1.19530f, -2.56340f, 1.0f),
352
0
      Point4D(0.00010f, 2.56350f, -1.19530f, 1.0f)
353
0
    },
354
0
    MozPolygon {
355
0
      Point4D(2.00000f, -0.68400f, 1.87940f, 1.0f),
356
0
      Point4D(2.00000f, 0.68410f, -1.87930f, 1.0f),
357
0
      Point4D(-2.00000f, 0.68410f, -1.87930f, 1.0f),
358
0
      Point4D(-2.00000f, -0.68400f, 1.87940f, 1.0f)
359
0
    }
360
0
  };
361
0
362
0
  const std::deque<MozPolygon> expected {
363
0
    MozPolygon {
364
0
      Point4D(2.00000f, -0.68400f, 1.87940f, 1.0f),
365
0
      Point4D(2.00000f, 0.68410f, -1.87930f, 1.0f),
366
0
      Point4D(-2.00000f, 0.68410f, -1.87930f, 1.0f),
367
0
      Point4D(-2.00000f, -0.68400f, 1.87940f, 1.0f)
368
0
    },
369
0
    MozPolygon {
370
0
      Point4D(-0.00000f, 1.19540f, 2.56350f, 1.0f),
371
0
      Point4D(-0.00000f, -2.56340f, 1.19540f, 1.0f),
372
0
      Point4D(0.00010f, -1.19530f, -2.56340f, 1.0f),
373
0
      Point4D(0.00010f, 2.56350f, -1.19530f, 1.0f)
374
0
    }
375
0
  };
376
0
  ::RunTest(polygons, expected);
377
0
}
378
379
0
TEST(BSPTree, TwoPlaneIntersectRotate40degrees) {
380
0
  const std::deque<MozPolygon> polygons {
381
0
    MozPolygon {
382
0
      Point4D(-0.00000f, -0.73200f, 2.73210f, 1.0f),
383
0
      Point4D(-0.00000f, -2.73200f, -0.73200f, 1.0f),
384
0
      Point4D(0.00010f, 0.73210f, -2.73200f, 1.0f),
385
0
      Point4D(0.00010f, 2.73210f, 0.73210f, 1.0f)
386
0
    },
387
0
    MozPolygon {
388
0
      Point4D(2.00000f, -1.73200f, 1.00000f, 1.0f),
389
0
      Point4D(2.00000f, 1.73210f, -0.99990f, 1.0f),
390
0
      Point4D(-2.00000f, 1.73210f, -0.99990f, 1.0f),
391
0
      Point4D(-2.00000f, -1.73200f, 1.00000f, 1.0f)
392
0
    }
393
0
  };
394
0
395
0
  const std::deque<MozPolygon> expected {
396
0
    MozPolygon {
397
0
      Point4D(2.00000f, -1.73200f, 1.00000f, 1.0f),
398
0
      Point4D(2.00000f, 1.73210f, -0.99990f, 1.0f),
399
0
      Point4D(-2.00000f, 1.73210f, -0.99990f, 1.0f),
400
0
      Point4D(-2.00000f, -1.73200f, 1.00000f, 1.0f)
401
0
    },
402
0
    MozPolygon {
403
0
      Point4D(-0.00000f, -0.73200f, 2.73210f, 1.0f),
404
0
      Point4D(-0.00000f, -2.73200f, -0.73200f, 1.0f),
405
0
      Point4D(0.00010f, 0.73210f, -2.73200f, 1.0f),
406
0
      Point4D(0.00010f, 2.73210f, 0.73210f, 1.0f)
407
0
    }
408
0
  };
409
0
  ::RunTest(polygons, expected);
410
0
}
411
412
0
TEST(BSPTree, TwoPlaneIntersectRotate60degrees) {
413
0
  const std::deque<MozPolygon> polygons {
414
0
    MozPolygon {
415
0
      Point4D(-0.00000f, -2.73200f, 0.73210f, 1.0f),
416
0
      Point4D(-0.00000f, -0.73200f, -2.73200f, 1.0f),
417
0
      Point4D(0.00010f, 2.73210f, -0.73200f, 1.0f),
418
0
      Point4D(0.00010f, 0.73210f, 2.73210f, 1.0f)
419
0
    },
420
0
    MozPolygon {
421
0
      Point4D(2.00000f, -1.73200f, -1.00000f, 1.0f),
422
0
      Point4D(2.00000f, 1.73210f, 1.00010f, 1.0f),
423
0
      Point4D(-2.00000f, 1.73210f, 1.00010f, 1.0f),
424
0
      Point4D(-2.00000f, -1.73200f, -1.00000f, 1.0f)
425
0
    }
426
0
  };
427
0
428
0
  const std::deque<MozPolygon> expected {
429
0
    MozPolygon {
430
0
      Point4D(-2.00000f, 1.26793f, 0.73210f, 1.0f),
431
0
      Point4D(-2.00000f, -1.73200f, -1.00000f, 1.0f),
432
0
      Point4D(2.00000f, -1.73200f, -1.00000f, 1.0f),
433
0
      Point4D(2.00000f, 1.26793f, 0.73210f, 1.0f)
434
0
    },
435
0
    MozPolygon {
436
0
      Point4D(-0.00000f, -2.73200f, 0.73210f, 1.0f),
437
0
      Point4D(-0.00000f, -0.73200f, -2.73200f, 1.0f),
438
0
      Point4D(0.00010f, 2.73210f, -0.73200f, 1.0f),
439
0
      Point4D(0.00010f, 0.73210f, 2.73210f, 1.0f)
440
0
    },
441
0
    MozPolygon {
442
0
      Point4D(2.00000f, 1.26793f, 0.73210f, 1.0f),
443
0
      Point4D(2.00000f, 1.73210f, 1.00010f, 1.0f),
444
0
      Point4D(-2.00000f, 1.73210f, 1.00010f, 1.0f),
445
0
      Point4D(-2.00000f, 1.26793f, 0.73210f, 1.0f)
446
0
    }
447
0
  };
448
0
  ::RunTest(polygons, expected);
449
0
}
450
451
0
TEST(BSPTree, TwoPlaneIntersectRotate80degrees) {
452
0
  const std::deque<MozPolygon> polygons {
453
0
    MozPolygon {
454
0
      Point4D(-0.00000f, -1.19530f, -2.56340f, 1.0f),
455
0
      Point4D(-0.00000f, 2.56350f, -1.19530f, 1.0f),
456
0
      Point4D(0.00010f, 1.19540f, 2.56350f, 1.0f),
457
0
      Point4D(0.00010f, -2.56340f, 1.19540f, 1.0f)
458
0
    },
459
0
    MozPolygon {
460
0
      Point4D(2.00000f, 0.68410f, -1.87930f, 1.0f),
461
0
      Point4D(2.00000f, -0.68400f, 1.87940f, 1.0f),
462
0
      Point4D(-2.00000f, -0.68400f, 1.87940f, 1.0f),
463
0
      Point4D(-2.00000f, 0.68410f, -1.87930f, 1.0f)
464
0
    }
465
0
  };
466
0
467
0
  const std::deque<MozPolygon> expected {
468
0
    MozPolygon {
469
0
      Point4D(-0.00000f, -1.19530f, -2.56340f, 1.0f),
470
0
      Point4D(-0.00000f, 2.56350f, -1.19530f, 1.0f),
471
0
      Point4D(0.00010f, 1.19540f, 2.56350f, 1.0f),
472
0
      Point4D(0.00010f, -2.56340f, 1.19540f, 1.0f)
473
0
    },
474
0
    MozPolygon {
475
0
      Point4D(2.00000f, 0.68410f, -1.87930f, 1.0f),
476
0
      Point4D(2.00000f, -0.68400f, 1.87940f, 1.0f),
477
0
      Point4D(-2.00000f, -0.68400f, 1.87940f, 1.0f),
478
0
      Point4D(-2.00000f, 0.68410f, -1.87930f, 1.0f)
479
0
    }
480
0
  };
481
0
  ::RunTest(polygons, expected);
482
0
}
483
484
0
TEST(BSPTree, TwoPlaneIntersectRotate100degrees) {
485
0
  const std::deque<MozPolygon> polygons {
486
0
    MozPolygon {
487
0
      Point4D(-0.00000f, 2.73210f, -0.73200f, 1.0f),
488
0
      Point4D(-0.00000f, 0.73210f, 2.73210f, 1.0f),
489
0
      Point4D(0.00010f, -2.73200f, 0.73210f, 1.0f),
490
0
      Point4D(0.00010f, -0.73200f, -2.73200f, 1.0f)
491
0
    },
492
0
    MozPolygon {
493
0
      Point4D(2.00000f, 1.73210f, 1.00010f, 1.0f),
494
0
      Point4D(2.00000f, -1.73200f, -1.00000f, 1.0f),
495
0
      Point4D(-2.00000f, -1.73200f, -1.00000f, 1.0f),
496
0
      Point4D(-2.00000f, 1.73210f, 1.00010f, 1.0f)
497
0
    }
498
0
  };
499
0
500
0
  const std::deque<MozPolygon> expected {
501
0
    MozPolygon {
502
0
      Point4D(2.00000f, -1.26783f, -0.73200f, 1.0f),
503
0
      Point4D(2.00000f, -1.73200f, -1.00000f, 1.0f),
504
0
      Point4D(-2.00000f, -1.73200f, -1.00000f, 1.0f),
505
0
      Point4D(-2.00000f, -1.26783f, -0.73200f, 1.0f)
506
0
    },
507
0
    MozPolygon {
508
0
      Point4D(-0.00000f, 2.73210f, -0.73200f, 1.0f),
509
0
      Point4D(-0.00000f, 0.73210f, 2.73210f, 1.0f),
510
0
      Point4D(0.00010f, -2.73200f, 0.73210f, 1.0f),
511
0
      Point4D(0.00010f, -0.73200f, -2.73200f, 1.0f)
512
0
    },
513
0
    MozPolygon {
514
0
      Point4D(-2.00000f, -1.26783f, -0.73200f, 1.0f),
515
0
      Point4D(-2.00000f, 1.73210f, 1.00010f, 1.0f),
516
0
      Point4D(2.00000f, 1.73210f, 1.00010f, 1.0f),
517
0
      Point4D(2.00000f, -1.26783f, -0.73200f, 1.0f)
518
0
    }
519
0
  };
520
0
  ::RunTest(polygons, expected);
521
0
}
522
523
0
TEST(BSPTree, TwoPlaneIntersectRotate120degrees) {
524
0
  const std::deque<MozPolygon> polygons {
525
0
    MozPolygon {
526
0
      Point4D(-0.00000f, -0.73200f, 2.73210f, 1.0f),
527
0
      Point4D(-0.00000f, -2.73200f, -0.73200f, 1.0f),
528
0
      Point4D(0.00010f, 0.73210f, -2.73200f, 1.0f),
529
0
      Point4D(0.00010f, 2.73210f, 0.73210f, 1.0f)
530
0
    },
531
0
    MozPolygon {
532
0
      Point4D(2.00000f, -1.73200f, 1.00000f, 1.0f),
533
0
      Point4D(2.00000f, 1.73210f, -0.99990f, 1.0f),
534
0
      Point4D(-2.00000f, 1.73210f, -0.99990f, 1.0f),
535
0
      Point4D(-2.00000f, -1.73200f, 1.00000f, 1.0f)
536
0
    }
537
0
  };
538
0
539
0
  const std::deque<MozPolygon> expected {
540
0
    MozPolygon {
541
0
      Point4D(2.00000f, -1.73200f, 1.00000f, 1.0f),
542
0
      Point4D(2.00000f, 1.73210f, -0.99990f, 1.0f),
543
0
      Point4D(-2.00000f, 1.73210f, -0.99990f, 1.0f),
544
0
      Point4D(-2.00000f, -1.73200f, 1.00000f, 1.0f)
545
0
    },
546
0
    MozPolygon {
547
0
      Point4D(-0.00000f, -0.73200f, 2.73210f, 1.0f),
548
0
      Point4D(-0.00000f, -2.73200f, -0.73200f, 1.0f),
549
0
      Point4D(0.00010f, 0.73210f, -2.73200f, 1.0f),
550
0
      Point4D(0.00010f, 2.73210f, 0.73210f, 1.0f)
551
0
    }
552
0
  };
553
0
  ::RunTest(polygons, expected);
554
0
}
555
556
0
TEST(BSPTree, TwoPlaneIntersectRotate140degrees) {
557
0
  const std::deque<MozPolygon> polygons {
558
0
    MozPolygon {
559
0
      Point4D(-0.00000f, -1.19530f, -2.56340f, 1.0f),
560
0
      Point4D(-0.00000f, 2.56350f, -1.19530f, 1.0f),
561
0
      Point4D(0.00010f, 1.19540f, 2.56350f, 1.0f),
562
0
      Point4D(0.00010f, -2.56340f, 1.19540f, 1.0f)
563
0
    },
564
0
    MozPolygon {
565
0
      Point4D(2.00000f, 0.68410f, -1.87930f, 1.0f),
566
0
      Point4D(2.00000f, -0.68400f, 1.87940f, 1.0f),
567
0
      Point4D(-2.00000f, -0.68400f, 1.87940f, 1.0f),
568
0
      Point4D(-2.00000f, 0.68410f, -1.87930f, 1.0f)
569
0
    }
570
0
  };
571
0
572
0
  const std::deque<MozPolygon> expected {
573
0
    MozPolygon {
574
0
      Point4D(-0.00000f, -1.19530f, -2.56340f, 1.0f),
575
0
      Point4D(-0.00000f, 2.56350f, -1.19530f, 1.0f),
576
0
      Point4D(0.00010f, 1.19540f, 2.56350f, 1.0f),
577
0
      Point4D(0.00010f, -2.56340f, 1.19540f, 1.0f)
578
0
    },
579
0
    MozPolygon {
580
0
      Point4D(2.00000f, 0.68410f, -1.87930f, 1.0f),
581
0
      Point4D(2.00000f, -0.68400f, 1.87940f, 1.0f),
582
0
      Point4D(-2.00000f, -0.68400f, 1.87940f, 1.0f),
583
0
      Point4D(-2.00000f, 0.68410f, -1.87930f, 1.0f)
584
0
    }
585
0
  };
586
0
  ::RunTest(polygons, expected);
587
0
}
588
589
0
TEST(BSPTree, TwoPlaneIntersectRotate160degrees) {
590
0
  const std::deque<MozPolygon> polygons {
591
0
    MozPolygon {
592
0
      Point4D(-0.00000f, 2.00000f, 2.00000f, 1.0f),
593
0
      Point4D(-0.00000f, -2.00000f, 2.00000f, 1.0f),
594
0
      Point4D(0.00010f, -2.00000f, -2.00000f, 1.0f),
595
0
      Point4D(0.00010f, 2.00000f, -2.00000f, 1.0f)
596
0
    },
597
0
    MozPolygon {
598
0
      Point4D(2.00000f, -0.00000f, 2.00000f, 1.0f),
599
0
      Point4D(2.00000f, 0.00010f, -2.00000f, 1.0f),
600
0
      Point4D(-2.00000f, 0.00010f, -2.00000f, 1.0f),
601
0
      Point4D(-2.00000f, -0.00000f, 2.00000f, 1.0f)
602
0
    }
603
0
  };
604
0
605
0
  const std::deque<MozPolygon> expected {
606
0
    MozPolygon {
607
0
      Point4D(2.00000f, -0.00000f, 2.00000f, 1.0f),
608
0
      Point4D(2.00000f, 0.00010f, -2.00000f, 1.0f),
609
0
      Point4D(-2.00000f, 0.00010f, -2.00000f, 1.0f),
610
0
      Point4D(-2.00000f, -0.00000f, 2.00000f, 1.0f)
611
0
    },
612
0
    MozPolygon {
613
0
      Point4D(-0.00000f, 2.00000f, 2.00000f, 1.0f),
614
0
      Point4D(-0.00000f, -2.00000f, 2.00000f, 1.0f),
615
0
      Point4D(0.00010f, -2.00000f, -2.00000f, 1.0f),
616
0
      Point4D(0.00010f, 2.00000f, -2.00000f, 1.0f)
617
0
    }
618
0
  };
619
0
  ::RunTest(polygons, expected);
620
0
}
621
622
0
TEST(BSPTree, TwoPlaneIntersectRotate180degrees) {
623
0
  const std::deque<MozPolygon> polygons {
624
0
    MozPolygon {
625
0
      Point4D(-0.00000f, -2.00000f, -2.00000f, 1.0f),
626
0
      Point4D(-0.00000f, 2.00000f, -2.00000f, 1.0f),
627
0
      Point4D(0.00010f, 2.00000f, 2.00000f, 1.0f),
628
0
      Point4D(0.00010f, -2.00000f, 2.00000f, 1.0f)
629
0
    },
630
0
    MozPolygon {
631
0
      Point4D(2.00000f, 0.00010f, -2.00000f, 1.0f),
632
0
      Point4D(2.00000f, -0.00000f, 2.00000f, 1.0f),
633
0
      Point4D(-2.00000f, -0.00000f, 2.00000f, 1.0f),
634
0
      Point4D(-2.00000f, 0.00010f, -2.00000f, 1.0f)
635
0
    }
636
0
  };
637
0
638
0
  const std::deque<MozPolygon> expected {
639
0
    MozPolygon {
640
0
      Point4D(-0.00000f, -2.00000f, -2.00000f, 1.0f),
641
0
      Point4D(-0.00000f, 2.00000f, -2.00000f, 1.0f),
642
0
      Point4D(0.00010f, 2.00000f, 2.00000f, 1.0f),
643
0
      Point4D(0.00010f, -2.00000f, 2.00000f, 1.0f)
644
0
    },
645
0
    MozPolygon {
646
0
      Point4D(2.00000f, 0.00010f, -2.00000f, 1.0f),
647
0
      Point4D(2.00000f, -0.00000f, 2.00000f, 1.0f),
648
0
      Point4D(-2.00000f, -0.00000f, 2.00000f, 1.0f),
649
0
      Point4D(-2.00000f, 0.00010f, -2.00000f, 1.0f)
650
0
    }
651
0
  };
652
0
  ::RunTest(polygons, expected);
653
0
}
654
655
0
TEST(BSPTree, TwoPlaneIntersectRotate200degrees) {
656
0
  const std::deque<MozPolygon> polygons {
657
0
    MozPolygon {
658
0
      Point4D(-0.00000f, 1.19540f, 2.56350f, 1.0f),
659
0
      Point4D(-0.00000f, -2.56340f, 1.19540f, 1.0f),
660
0
      Point4D(0.00010f, -1.19530f, -2.56340f, 1.0f),
661
0
      Point4D(0.00010f, 2.56350f, -1.19530f, 1.0f)
662
0
    },
663
0
    MozPolygon {
664
0
      Point4D(2.00000f, -0.68400f, 1.87940f, 1.0f),
665
0
      Point4D(2.00000f, 0.68410f, -1.87930f, 1.0f),
666
0
      Point4D(-2.00000f, 0.68410f, -1.87930f, 1.0f),
667
0
      Point4D(-2.00000f, -0.68400f, 1.87940f, 1.0f)
668
0
    }
669
0
  };
670
0
671
0
  const std::deque<MozPolygon> expected {
672
0
    MozPolygon {
673
0
      Point4D(2.00000f, -0.68400f, 1.87940f, 1.0f),
674
0
      Point4D(2.00000f, 0.68410f, -1.87930f, 1.0f),
675
0
      Point4D(-2.00000f, 0.68410f, -1.87930f, 1.0f),
676
0
      Point4D(-2.00000f, -0.68400f, 1.87940f, 1.0f)
677
0
    },
678
0
    MozPolygon {
679
0
      Point4D(-0.00000f, 1.19540f, 2.56350f, 1.0f),
680
0
      Point4D(-0.00000f, -2.56340f, 1.19540f, 1.0f),
681
0
      Point4D(0.00010f, -1.19530f, -2.56340f, 1.0f),
682
0
      Point4D(0.00010f, 2.56350f, -1.19530f, 1.0f)
683
0
    }
684
0
  };
685
0
  ::RunTest(polygons, expected);
686
0
}
687
688
0
TEST(BSPTree, TwoPlaneIntersectRotate220degrees) {
689
0
  const std::deque<MozPolygon> polygons {
690
0
    MozPolygon {
691
0
      Point4D(-0.00000f, 0.73210f, -2.73200f, 1.0f),
692
0
      Point4D(-0.00000f, 2.73210f, 0.73210f, 1.0f),
693
0
      Point4D(0.00010f, -0.73200f, 2.73210f, 1.0f),
694
0
      Point4D(0.00010f, -2.73200f, -0.73200f, 1.0f)
695
0
    },
696
0
    MozPolygon {
697
0
      Point4D(2.00000f, 1.73210f, -0.99990f, 1.0f),
698
0
      Point4D(2.00000f, -1.73200f, 1.00000f, 1.0f),
699
0
      Point4D(-2.00000f, -1.73200f, 1.00000f, 1.0f),
700
0
      Point4D(-2.00000f, 1.73210f, -0.99990f, 1.0f)
701
0
    }
702
0
  };
703
0
704
0
  const std::deque<MozPolygon> expected {
705
0
    MozPolygon {
706
0
      Point4D(-0.00000f, 0.73210f, -2.73200f, 1.0f),
707
0
      Point4D(-0.00000f, 2.73210f, 0.73210f, 1.0f),
708
0
      Point4D(0.00010f, -0.73200f, 2.73210f, 1.0f),
709
0
      Point4D(0.00010f, -2.73200f, -0.73200f, 1.0f)
710
0
    },
711
0
    MozPolygon {
712
0
      Point4D(2.00000f, 1.73210f, -0.99990f, 1.0f),
713
0
      Point4D(2.00000f, -1.73200f, 1.00000f, 1.0f),
714
0
      Point4D(-2.00000f, -1.73200f, 1.00000f, 1.0f),
715
0
      Point4D(-2.00000f, 1.73210f, -0.99990f, 1.0f)
716
0
    }
717
0
  };
718
0
  ::RunTest(polygons, expected);
719
0
}
720
721
0
TEST(BSPTree, TwoPlaneIntersectRotate240degrees) {
722
0
  const std::deque<MozPolygon> polygons {
723
0
    MozPolygon {
724
0
      Point4D(-0.00000f, -2.73200f, 0.73210f, 1.0f),
725
0
      Point4D(-0.00000f, -0.73200f, -2.73200f, 1.0f),
726
0
      Point4D(0.00010f, 2.73210f, -0.73200f, 1.0f),
727
0
      Point4D(0.00010f, 0.73210f, 2.73210f, 1.0f)
728
0
    },
729
0
    MozPolygon {
730
0
      Point4D(2.00000f, -1.73200f, -1.00000f, 1.0f),
731
0
      Point4D(2.00000f, 1.73210f, 1.00010f, 1.0f),
732
0
      Point4D(-2.00000f, 1.73210f, 1.00010f, 1.0f),
733
0
      Point4D(-2.00000f, -1.73200f, -1.00000f, 1.0f)
734
0
    }
735
0
  };
736
0
737
0
  const std::deque<MozPolygon> expected {
738
0
    MozPolygon {
739
0
      Point4D(-2.00000f, 1.26793f, 0.73210f, 1.0f),
740
0
      Point4D(-2.00000f, -1.73200f, -1.00000f, 1.0f),
741
0
      Point4D(2.00000f, -1.73200f, -1.00000f, 1.0f),
742
0
      Point4D(2.00000f, 1.26793f, 0.73210f, 1.0f)
743
0
    },
744
0
    MozPolygon {
745
0
      Point4D(-0.00000f, -2.73200f, 0.73210f, 1.0f),
746
0
      Point4D(-0.00000f, -0.73200f, -2.73200f, 1.0f),
747
0
      Point4D(0.00010f, 2.73210f, -0.73200f, 1.0f),
748
0
      Point4D(0.00010f, 0.73210f, 2.73210f, 1.0f)
749
0
    },
750
0
    MozPolygon {
751
0
      Point4D(2.00000f, 1.26793f, 0.73210f, 1.0f),
752
0
      Point4D(2.00000f, 1.73210f, 1.00010f, 1.0f),
753
0
      Point4D(-2.00000f, 1.73210f, 1.00010f, 1.0f),
754
0
      Point4D(-2.00000f, 1.26793f, 0.73210f, 1.0f)
755
0
    }
756
0
  };
757
0
  ::RunTest(polygons, expected);
758
0
}
759
760
0
TEST(BSPTree, TwoPlaneIntersectRotate260degrees) {
761
0
  const std::deque<MozPolygon> polygons {
762
0
    MozPolygon {
763
0
      Point4D(-0.00000f, 1.19540f, 2.56350f, 1.0f),
764
0
      Point4D(-0.00000f, -2.56340f, 1.19540f, 1.0f),
765
0
      Point4D(0.00010f, -1.19530f, -2.56340f, 1.0f),
766
0
      Point4D(0.00010f, 2.56350f, -1.19530f, 1.0f)
767
0
    },
768
0
    MozPolygon {
769
0
      Point4D(2.00000f, -0.68400f, 1.87940f, 1.0f),
770
0
      Point4D(2.00000f, 0.68410f, -1.87930f, 1.0f),
771
0
      Point4D(-2.00000f, 0.68410f, -1.87930f, 1.0f),
772
0
      Point4D(-2.00000f, -0.68400f, 1.87940f, 1.0f)
773
0
    }
774
0
  };
775
0
776
0
  const std::deque<MozPolygon> expected {
777
0
    MozPolygon {
778
0
      Point4D(2.00000f, -0.68400f, 1.87940f, 1.0f),
779
0
      Point4D(2.00000f, 0.68410f, -1.87930f, 1.0f),
780
0
      Point4D(-2.00000f, 0.68410f, -1.87930f, 1.0f),
781
0
      Point4D(-2.00000f, -0.68400f, 1.87940f, 1.0f)
782
0
    },
783
0
    MozPolygon {
784
0
      Point4D(-0.00000f, 1.19540f, 2.56350f, 1.0f),
785
0
      Point4D(-0.00000f, -2.56340f, 1.19540f, 1.0f),
786
0
      Point4D(0.00010f, -1.19530f, -2.56340f, 1.0f),
787
0
      Point4D(0.00010f, 2.56350f, -1.19530f, 1.0f)
788
0
    }
789
0
  };
790
0
  ::RunTest(polygons, expected);
791
0
}
792
793
0
TEST(BSPTree, TwoPlaneIntersectRotate280degrees) {
794
0
  const std::deque<MozPolygon> polygons {
795
0
    MozPolygon {
796
0
      Point4D(-0.00000f, 2.73210f, -0.73200f, 1.0f),
797
0
      Point4D(-0.00000f, 0.73210f, 2.73210f, 1.0f),
798
0
      Point4D(0.00010f, -2.73200f, 0.73210f, 1.0f),
799
0
      Point4D(0.00010f, -0.73200f, -2.73200f, 1.0f)
800
0
    },
801
0
    MozPolygon {
802
0
      Point4D(2.00000f, 1.73210f, 1.00010f, 1.0f),
803
0
      Point4D(2.00000f, -1.73200f, -1.00000f, 1.0f),
804
0
      Point4D(-2.00000f, -1.73200f, -1.00000f, 1.0f),
805
0
      Point4D(-2.00000f, 1.73210f, 1.00010f, 1.0f)
806
0
    }
807
0
  };
808
0
809
0
  const std::deque<MozPolygon> expected {
810
0
    MozPolygon {
811
0
      Point4D(2.00000f, -1.26783f, -0.73200f, 1.0f),
812
0
      Point4D(2.00000f, -1.73200f, -1.00000f, 1.0f),
813
0
      Point4D(-2.00000f, -1.73200f, -1.00000f, 1.0f),
814
0
      Point4D(-2.00000f, -1.26783f, -0.73200f, 1.0f)
815
0
    },
816
0
    MozPolygon {
817
0
      Point4D(-0.00000f, 2.73210f, -0.73200f, 1.0f),
818
0
      Point4D(-0.00000f, 0.73210f, 2.73210f, 1.0f),
819
0
      Point4D(0.00010f, -2.73200f, 0.73210f, 1.0f),
820
0
      Point4D(0.00010f, -0.73200f, -2.73200f, 1.0f)
821
0
    },
822
0
    MozPolygon {
823
0
      Point4D(-2.00000f, -1.26783f, -0.73200f, 1.0f),
824
0
      Point4D(-2.00000f, 1.73210f, 1.00010f, 1.0f),
825
0
      Point4D(2.00000f, 1.73210f, 1.00010f, 1.0f),
826
0
      Point4D(2.00000f, -1.26783f, -0.73200f, 1.0f)
827
0
    }
828
0
  };
829
0
  ::RunTest(polygons, expected);
830
0
}
831
832
0
TEST(BSPTree, TwoPlaneIntersectRotate300degrees) {
833
0
  const std::deque<MozPolygon> polygons {
834
0
    MozPolygon {
835
0
      Point4D(-0.00000f, 0.73210f, -2.73200f, 1.0f),
836
0
      Point4D(-0.00000f, 2.73210f, 0.73210f, 1.0f),
837
0
      Point4D(0.00010f, -0.73200f, 2.73210f, 1.0f),
838
0
      Point4D(0.00010f, -2.73200f, -0.73200f, 1.0f)
839
0
    },
840
0
    MozPolygon {
841
0
      Point4D(2.00000f, 1.73210f, -0.99990f, 1.0f),
842
0
      Point4D(2.00000f, -1.73200f, 1.00000f, 1.0f),
843
0
      Point4D(-2.00000f, -1.73200f, 1.00000f, 1.0f),
844
0
      Point4D(-2.00000f, 1.73210f, -0.99990f, 1.0f)
845
0
    }
846
0
  };
847
0
848
0
  const std::deque<MozPolygon> expected {
849
0
    MozPolygon {
850
0
      Point4D(-0.00000f, 0.73210f, -2.73200f, 1.0f),
851
0
      Point4D(-0.00000f, 2.73210f, 0.73210f, 1.0f),
852
0
      Point4D(0.00010f, -0.73200f, 2.73210f, 1.0f),
853
0
      Point4D(0.00010f, -2.73200f, -0.73200f, 1.0f)
854
0
    },
855
0
    MozPolygon {
856
0
      Point4D(2.00000f, 1.73210f, -0.99990f, 1.0f),
857
0
      Point4D(2.00000f, -1.73200f, 1.00000f, 1.0f),
858
0
      Point4D(-2.00000f, -1.73200f, 1.00000f, 1.0f),
859
0
      Point4D(-2.00000f, 1.73210f, -0.99990f, 1.0f)
860
0
    }
861
0
  };
862
0
  ::RunTest(polygons, expected);
863
0
}
864
865
0
TEST(BSPTree, TwoPlaneIntersectRotate320degrees) {
866
0
  const std::deque<MozPolygon> polygons {
867
0
    MozPolygon {
868
0
      Point4D(-0.00000f, -1.19530f, -2.56340f, 1.0f),
869
0
      Point4D(-0.00000f, 2.56350f, -1.19530f, 1.0f),
870
0
      Point4D(0.00010f, 1.19540f, 2.56350f, 1.0f),
871
0
      Point4D(0.00010f, -2.56340f, 1.19540f, 1.0f)
872
0
    },
873
0
    MozPolygon {
874
0
      Point4D(2.00000f, 0.68410f, -1.87930f, 1.0f),
875
0
      Point4D(2.00000f, -0.68400f, 1.87940f, 1.0f),
876
0
      Point4D(-2.00000f, -0.68400f, 1.87940f, 1.0f),
877
0
      Point4D(-2.00000f, 0.68410f, -1.87930f, 1.0f)
878
0
    }
879
0
  };
880
0
881
0
  const std::deque<MozPolygon> expected {
882
0
    MozPolygon {
883
0
      Point4D(-0.00000f, -1.19530f, -2.56340f, 1.0f),
884
0
      Point4D(-0.00000f, 2.56350f, -1.19530f, 1.0f),
885
0
      Point4D(0.00010f, 1.19540f, 2.56350f, 1.0f),
886
0
      Point4D(0.00010f, -2.56340f, 1.19540f, 1.0f)
887
0
    },
888
0
    MozPolygon {
889
0
      Point4D(2.00000f, 0.68410f, -1.87930f, 1.0f),
890
0
      Point4D(2.00000f, -0.68400f, 1.87940f, 1.0f),
891
0
      Point4D(-2.00000f, -0.68400f, 1.87940f, 1.0f),
892
0
      Point4D(-2.00000f, 0.68410f, -1.87930f, 1.0f)
893
0
    }
894
0
  };
895
0
  ::RunTest(polygons, expected);
896
0
}
897
898
0
TEST(BSPTree, TwoPlaneIntersectRotate340degrees) {
899
0
  const std::deque<MozPolygon> polygons {
900
0
    MozPolygon {
901
0
      Point4D(-0.00000f, -2.00000f, -2.00000f, 1.0f),
902
0
      Point4D(-0.00000f, 2.00000f, -2.00000f, 1.0f),
903
0
      Point4D(0.00010f, 2.00000f, 2.00000f, 1.0f),
904
0
      Point4D(0.00010f, -2.00000f, 2.00000f, 1.0f)
905
0
    },
906
0
    MozPolygon {
907
0
      Point4D(2.00000f, 0.00010f, -2.00000f, 1.0f),
908
0
      Point4D(2.00000f, -0.00000f, 2.00000f, 1.0f),
909
0
      Point4D(-2.00000f, -0.00000f, 2.00000f, 1.0f),
910
0
      Point4D(-2.00000f, 0.00010f, -2.00000f, 1.0f)
911
0
    }
912
0
  };
913
0
914
0
  const std::deque<MozPolygon> expected {
915
0
    MozPolygon {
916
0
      Point4D(-0.00000f, -2.00000f, -2.00000f, 1.0f),
917
0
      Point4D(-0.00000f, 2.00000f, -2.00000f, 1.0f),
918
0
      Point4D(0.00010f, 2.00000f, 2.00000f, 1.0f),
919
0
      Point4D(0.00010f, -2.00000f, 2.00000f, 1.0f)
920
0
    },
921
0
    MozPolygon {
922
0
      Point4D(2.00000f, 0.00010f, -2.00000f, 1.0f),
923
0
      Point4D(2.00000f, -0.00000f, 2.00000f, 1.0f),
924
0
      Point4D(-2.00000f, -0.00000f, 2.00000f, 1.0f),
925
0
      Point4D(-2.00000f, 0.00010f, -2.00000f, 1.0f)
926
0
    }
927
0
  };
928
0
  ::RunTest(polygons, expected);
929
0
}
930
931
0
TEST(BSPTree, TwoPlaneIntersectRotate360degrees) {
932
0
  const std::deque<MozPolygon> polygons {
933
0
    MozPolygon {
934
0
      Point4D(-0.00000f, -2.00000f, -2.00000f, 1.0f),
935
0
      Point4D(-0.00000f, 2.00000f, -2.00000f, 1.0f),
936
0
      Point4D(0.00010f, 2.00000f, 2.00000f, 1.0f),
937
0
      Point4D(0.00010f, -2.00000f, 2.00000f, 1.0f)
938
0
    },
939
0
    MozPolygon {
940
0
      Point4D(2.00000f, 0.00010f, -2.00000f, 1.0f),
941
0
      Point4D(2.00000f, -0.00000f, 2.00000f, 1.0f),
942
0
      Point4D(-2.00000f, -0.00000f, 2.00000f, 1.0f),
943
0
      Point4D(-2.00000f, 0.00010f, -2.00000f, 1.0f)
944
0
    }
945
0
  };
946
0
947
0
  const std::deque<MozPolygon> expected {
948
0
    MozPolygon {
949
0
      Point4D(-0.00000f, -2.00000f, -2.00000f, 1.0f),
950
0
      Point4D(-0.00000f, 2.00000f, -2.00000f, 1.0f),
951
0
      Point4D(0.00010f, 2.00000f, 2.00000f, 1.0f),
952
0
      Point4D(0.00010f, -2.00000f, 2.00000f, 1.0f)
953
0
    },
954
0
    MozPolygon {
955
0
      Point4D(2.00000f, 0.00010f, -2.00000f, 1.0f),
956
0
      Point4D(2.00000f, -0.00000f, 2.00000f, 1.0f),
957
0
      Point4D(-2.00000f, -0.00000f, 2.00000f, 1.0f),
958
0
      Point4D(-2.00000f, 0.00010f, -2.00000f, 1.0f)
959
0
    }
960
0
  };
961
0
  ::RunTest(polygons, expected);
962
0
}