public OctTreeNodeEnum(Node Root) { _RootNode = Root; for (int n = 0; n < _NodeChain.Length; n++) { _NodeChain[n] = new OctTreeNodeEnumState(); } Reset(); }
public OctTreeNodeEnum_WithFilter(Node Root, Filter FilterOut) { _FilterOut = FilterOut; if (_FilterOut(Root)) { _RootNode = null; } else { _RootNode = Root; } for (int n = 0; n < _NodeChain.Length; n++) { _NodeChain[n] = new OctTreeNodeEnumState(); } 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: OctTreeNodeEnumState _Parent = _NodeChain[_NodeChainIndex]; if (_Parent._Node._0_0_0 != null && !_FilterOut(_Parent._Node)) { _Parent._SubdivisionIndex++; _NodeChainIndex++; _NodeChain[_NodeChainIndex]._SubdivisionIndex = 0; switch (_Parent._SubdivisionIndex) { case 1: _NodeChain[_NodeChainIndex]._Node = _Parent._Node._0_0_0; return(true); case 2: _NodeChain[_NodeChainIndex]._Node = _Parent._Node._0_1_0; return(true); case 3: _NodeChain[_NodeChainIndex]._Node = _Parent._Node._1_0_0; return(true); case 4: _NodeChain[_NodeChainIndex]._Node = _Parent._Node._1_1_0; return(true); case 5: _NodeChain[_NodeChainIndex]._Node = _Parent._Node._0_0_1; return(true); case 6: _NodeChain[_NodeChainIndex]._Node = _Parent._Node._0_1_1; return(true); case 7: _NodeChain[_NodeChainIndex]._Node = _Parent._Node._1_0_1; return(true); case 8: _NodeChain[_NodeChainIndex]._Node = _Parent._Node._1_1_1; return(true); default: if (_NodeChainIndex == 1) { return(false); } _NodeChainIndex -= 2; goto restart; } } else { if (_NodeChainIndex == 0) { return(false); } _NodeChainIndex -= 1; goto restart; } }