Exemple #1
0
 public OctTreeNodeEnum(Node Root)
 {
     _RootNode = Root;
     for (int n = 0; n < _NodeChain.Length; n++)
     {
         _NodeChain[n] = new OctTreeNodeEnumState();
     }
     Reset();
 }
Exemple #2
0
 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();
 }
Exemple #3
0
            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;
                }
            }