1 |
using System; |
2 |
using System.Collections.Generic; |
3 |
|
4 |
namespace Oni.Akira |
5 |
{ |
6 |
internal static class OctreeBuilder |
7 |
{ |
8 |
private static readonly BoundingBox rootBoundingBox = new BoundingBox(new Vector3(-4096.0f), new Vector3(4096.0f)); |
9 |
|
10 |
public static OctreeNode Build(PolygonMesh mesh, bool debug) |
11 |
{ |
12 |
IEnumerable<Polygon> polygons = mesh.Polygons; |
13 |
|
14 |
if (debug) |
15 |
polygons = polygons.Concatenate(mesh.Ghosts); |
16 |
|
17 |
var root = new OctreeNode(rootBoundingBox, polygons, mesh.Rooms); |
18 |
root.Build(); |
19 |
return root; |
20 |
} |
21 |
|
22 |
public static OctreeNode Build(PolygonMesh mesh, GunkFlags excludeFlags) |
23 |
{ |
24 |
var root = new OctreeNode(rootBoundingBox, mesh.Polygons.Where(p => (p.Flags & excludeFlags) == 0), mesh.Rooms); |
25 |
root.Build(); |
26 |
return root; |
27 |
} |
28 |
|
29 |
public static OctreeNode Build(PolygonMesh mesh, Func<Polygon, bool> polygonFilter) |
30 |
{ |
31 |
var root = new OctreeNode(rootBoundingBox, mesh.Polygons.Where(polygonFilter), mesh.Rooms); |
32 |
root.Build(); |
33 |
return root; |
34 |
} |
35 |
|
36 |
public static OctreeNode BuildRoomsOctree(PolygonMesh mesh) |
37 |
{ |
38 |
var root = new OctreeNode(rootBoundingBox, new Polygon[0], mesh.Rooms); |
39 |
root.Build(); |
40 |
return root; |
41 |
} |
42 |
} |
43 |
} |