public OctTreeNodeEnum_Box(Node Root, long X, long Y, long Z, ulong Width, ulong Height, ulong Depth) { _X = X; _Y = Y; _Z = Z; if (Width > (ulong)long.MaxValue) { throw new Exception("Box query is too big"); } if (Height > (ulong)long.MaxValue) { throw new Exception("Box query is too big"); } if (Depth > (ulong)long.MaxValue) { throw new Exception("Box query is too big"); } _Width = (long)Width; _Height = (long)Height; _Depth = (long)Depth; _EndX = _X + (long)_Width; _EndY = _Y + (long)_Height; _EndZ = _Z + (long)_Depth; _RootNode = Root; for (int n = 0; n < _NodeChain.Length; n++) { _NodeChain[n] = new OcTreeNodeEnumState(); } Reset(); }
public bool MoveNext() { // MoveNext is call first so we need a special case for the initialization if (_First) { _First = false; if (_RootNode != null) { return(true); } else { return(false); } } restart: OcTreeNodeEnumState _Parent = _NodeChain[_NodeChainIndex]; if (_Parent._Node._0_0_0 != null && (_Parent._Included || Intersect(_Parent._Node))) { _Parent._SubdivisionIndex++; _NodeChainIndex++; _NodeChain[_NodeChainIndex]._SubdivisionIndex = 0; switch (_Parent._SubdivisionIndex) { case 1: _NodeChain[_NodeChainIndex]._Node = _Parent._Node._0_0_0; if (_Parent._Included) { _NodeChain[_NodeChainIndex]._Included = true; } else { _NodeChain[_NodeChainIndex]._Included = Included(_NodeChain[_NodeChainIndex]._Node); } return(true); case 2: _NodeChain[_NodeChainIndex]._Node = _Parent._Node._0_1_0; if (_Parent._Included) { _NodeChain[_NodeChainIndex]._Included = true; } else { _NodeChain[_NodeChainIndex]._Included = Included(_NodeChain[_NodeChainIndex]._Node); } return(true); case 3: _NodeChain[_NodeChainIndex]._Node = _Parent._Node._1_0_0; if (_Parent._Included) { _NodeChain[_NodeChainIndex]._Included = true; } else { _NodeChain[_NodeChainIndex]._Included = Included(_NodeChain[_NodeChainIndex]._Node); } return(true); case 4: _NodeChain[_NodeChainIndex]._Node = _Parent._Node._1_1_0; if (_Parent._Included) { _NodeChain[_NodeChainIndex]._Included = true; } else { _NodeChain[_NodeChainIndex]._Included = Included(_NodeChain[_NodeChainIndex]._Node); } return(true); case 5: _NodeChain[_NodeChainIndex]._Node = _Parent._Node._0_0_1; if (_Parent._Included) { _NodeChain[_NodeChainIndex]._Included = true; } else { _NodeChain[_NodeChainIndex]._Included = Included(_NodeChain[_NodeChainIndex]._Node); } return(true); case 6: _NodeChain[_NodeChainIndex]._Node = _Parent._Node._0_1_1; if (_Parent._Included) { _NodeChain[_NodeChainIndex]._Included = true; } else { _NodeChain[_NodeChainIndex]._Included = Included(_NodeChain[_NodeChainIndex]._Node); } return(true); case 7: _NodeChain[_NodeChainIndex]._Node = _Parent._Node._1_0_1; if (_Parent._Included) { _NodeChain[_NodeChainIndex]._Included = true; } else { _NodeChain[_NodeChainIndex]._Included = Included(_NodeChain[_NodeChainIndex]._Node); } return(true); case 8: _NodeChain[_NodeChainIndex]._Node = _Parent._Node._1_1_1; if (_Parent._Included) { _NodeChain[_NodeChainIndex]._Included = true; } else { _NodeChain[_NodeChainIndex]._Included = Included(_NodeChain[_NodeChainIndex]._Node); } return(true); default: if (_NodeChainIndex == 1) { return(false); } _NodeChainIndex -= 2; goto restart; } } else { if (_NodeChainIndex == 0) { return(false); } _NodeChainIndex -= 1; goto restart; } }