Beispiel #1
0
        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);
        }
Beispiel #2
0
 protected void ExchangeSingleChunkAsyncParallel(CompressedMarchingCubeChunk from, Vector3Int anchorPos, int lodPow, int sizePow, bool allowOveride)
 {
     from.PrepareDestruction();
     ExchangeChunkAsyncParallel(anchorPos, lodPow, sizePow, allowOveride, (c) => { FinishAsynchronChunk(from, c); });
 }