| 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 |
} |