/// <summary> /// Gets the surface with the specified description. /// </summary> public static Quadtree <F> Get(_SurfaceDesc <T, F> Surface) { Quadtree <F> surf; if (Surface.Lower.Depth == 0) { surf = Quadtree <F> .Singleton(Surface.SurfaceizeFunc(Surface.Lower.Value, Surface.Higher.Value, Surface.Axis)); } else { if (!_SurfaceCache.TryGetValue(Surface, out surf)) { // RECURSE! int axisind = (int)Surface.Axis; Quadtree <F>[] children = new Quadtree <F> [4]; for (int t = 0; t < 4; t++) { _SurfaceDesc <T, F> subsurf = new _SurfaceDesc <T, F>() { Axis = Surface.Axis, Lower = Surface.Lower[Octree.Indices[axisind, t, 1]], Higher = Surface.Higher[Octree.Indices[axisind, t, 0]], SurfaceizeFunc = Surface.SurfaceizeFunc }; children[t] = Get(subsurf); } surf = _SurfaceCache[Surface] = Quadtree <F> .Create(Surface.Lower.Depth, children); } } return(surf); }
// <summary> /// Gets the slice borders for the specified slice description. /// </summary> public static Quadtree <F> Get(_SliceDesc <T, F> Slice) { if (Slice.Octree.Depth == 0) { throw new ArgumentException(); } Quadtree <F> tree; if (!_SliceCache.TryGetValue(Slice, out tree)) { Axis a = Slice.Axis; int ai = (int)a; int l = Slice.Level; int hs = 1 << (Slice.Octree.Depth - 1); if (l == hs - 1) { Quadtree <F>[] children = new Quadtree <F> [4]; for (int r = 0; r < 4; r++) { children[r] = _SurfaceDesc <T, F> .Get(new _SurfaceDesc <T, F>() { Axis = a, Lower = Slice.Octree[Cubia.Octree.Indices[ai, r, 0]], Higher = Slice.Octree[Cubia.Octree.Indices[ai, r, 1]], SurfaceizeFunc = Slice.SurfaceizeFunc }); } tree = Quadtree <F> .Create(children[0].Depth + 1, children); } else { int i = l < hs ? 0 : 1; Quadtree <F>[] children = new Quadtree <F> [4]; for (int r = 0; r < 4; r++) { children[r] = _SliceDesc <T, F> .Get(new _SliceDesc <T, F>() { Axis = a, Level = l - (i *hs), SurfaceizeFunc = Slice.SurfaceizeFunc, Octree = Slice.Octree[Cubia.Octree.Indices[ai, r, i]] }); } tree = Quadtree <F> .Create(children[0].Depth + 1, children); } _SliceCache[Slice] = tree; } return(tree); }