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 }
public static void AddNodeDataCreation(ILODNodeDataMan nodeDataMan) { handlerArrayCreateLODNodeData.Add(nodeDataMan.CreateLODNodeData); idxDataMax = handlerArrayCreateLODNodeData.Count; nodeDataMan.IdxInLODNodeData = idxDataMax - 1; }