Пример #1
0
    public LODOctreeMan(ILODNodeDataMan[] lodNodeDataMans, int maxlod, int refreshThreshold = 1, Transform observer = null)
    {
        self     = this;
        _maxLod  = maxlod;
        Observer = observer;

        int xChunkCount = LODOctreeMan._xChunkCount;
        int yChunkCount = LODOctreeMan._yChunkCount;
        int zChunkCount = LODOctreeMan._zChunkCount;
        int xVoxelCount = LODOctreeMan._xVoxelCount;
        int yVoxelCount = LODOctreeMan._yVoxelCount;
        int zVoxelCount = LODOctreeMan._zVoxelCount;

        _curCamPos           = InitPos;
        _lastCamPos          = InitPos;
        _sqrRefreshThreshold = refreshThreshold * refreshThreshold;
        _treeSideLen         = Lod0NodeSize << LODOctreeMan._maxLod;
        _viewBoundsSize      = new IntVector3(xVoxelCount, yVoxelCount, zVoxelCount);
        _viewBoundsLod       = new Bounds[LODOctreeMan._maxLod + 1];
        int lod = 0;

        for (lod = LODOctreeMan._maxLod; lod >= 0; lod--)
        {
            int shift = LODOctreeMan._maxLod - lod;
            _viewBoundsLod[lod] = new Bounds(InitPos,
                                             new Vector3(xVoxelCount >> shift,
                                                         yVoxelCount >> shift,
                                                         zVoxelCount >> shift));
        }

#if false
        lodNodeDataMans = new ILODNodeDataMan[] { VFVoxelTerrain.self
                                                  , VFVoxelWater.self
                                                  , Block45Man.self };
#endif
        LODOctreeNode.ClearNodeDataCreation();
        foreach (ILODNodeDataMan ndataMan in lodNodeDataMans)
        {
            LODOctreeNode.AddNodeDataCreation(ndataMan);
            ndataMan.LodMan   = this;
            _procPostInit    += ndataMan.ProcPostLodInit;
            _procPostUpdate  += ndataMan.ProcPostLodUpdate;
            _procPostRefresh += ndataMan.ProcPostLodRefresh;
        }
        LODOctreeNode.InitHalfLen();
        _lodTreeNodes = new LODOctreeNode[LODOctreeMan._maxLod + 1][, , ];
        for (lod = 0; lod <= LODOctreeMan._maxLod; lod++)
        {
            _lodTreeNodes[lod] = new LODOctreeNode[xChunkCount >> lod, yChunkCount >> lod, zChunkCount >> lod];
        }

        _lodTrees = new LODOctree[LODOctreeMan._xLodRootChunkCount *
                                  LODOctreeMan._yLodRootChunkCount *
                                  LODOctreeMan._zLodRootChunkCount];
        int i = 0;
        for (int x = 0; x < LODOctreeMan._xLodRootChunkCount; x++)
        {
            for (int y = 0; y < LODOctreeMan._yLodRootChunkCount; y++)
            {
                for (int z = 0; z < LODOctreeMan._zLodRootChunkCount; z++)
                {
                    _lodTrees[i] = new LODOctree(this, LODOctreeMan._maxLod,
                                                 new IntVector3(x, y, z),
                                                 new IntVector3(_treeSideLen, _treeSideLen, _treeSideLen));
                    _lodTrees[i].FillTreeNodeArray(ref _lodTreeNodes);
                    i++;
                }
            }
        }

        if (_procPostInit != null)
        {
            _procPostInit();
        }

#if LODREFRESH_THREADING
        StartLodThread();
#endif
    }
Пример #2
0
 public static void AddNodeDataCreation(ILODNodeDataMan nodeDataMan)
 {
     handlerArrayCreateLODNodeData.Add(nodeDataMan.CreateLODNodeData);
     idxDataMax = handlerArrayCreateLODNodeData.Count;
     nodeDataMan.IdxInLODNodeData = idxDataMax - 1;
 }