private void SplitChunkAndIncreaseLod(CompressedMarchingCubeChunk chunk, int toLodPower, int newSizePow) { int[][] anchors = chunk.Leaf.GetAllChildGlobalAnchorPosition(); CompressedMarchingCubeChunk[] newChunks = new CompressedMarchingCubeChunk[8]; for (int i = 0; i < 8; i++) { Vector3Int v3 = IntArrToVector3(anchors[i]); //TODO:use already referenced parent to set children newChunks[i] = GetThreadedChunkObjectAt(v3, toLodPower, newSizePow, true); } chunk.PrepareDestruction(); object listLock = new object(); List <CompressedMarchingCubeChunk> chunks = new List <CompressedMarchingCubeChunk>(); Action <CompressedMarchingCubeChunk> f = (c) => { //c.Hide(); lock (listLock) { chunks.Add(c); } if (chunks.Count == 8) { lock (exchangeLocker) { worldUpdater.readyExchangeChunks.Push(new ReadyChunkExchange(chunk, chunks)); } } }; DispatchMultipleChunksAsync(newChunks, f); }
protected void ExchangeSingleChunkAsyncParallel(CompressedMarchingCubeChunk from, Vector3Int anchorPos, int lodPow, int sizePow, bool allowOveride) { from.PrepareDestruction(); ExchangeChunkAsyncParallel(anchorPos, lodPow, sizePow, allowOveride, (c) => { FinishAsynchronChunk(from, c); }); }