Example #1
0
        private static void mergeBlocks()
        {
            int processed = 0;

            for (int a = _currentMergedGeneratedBlockId; a < _blocks.Count - 1; a++)
            {
RESTART:

                if (processed > 0)
                {
                    _currentMergedGeneratedBlockId = a;
                    break;
                }

                processed++;

                for (int b = _blocks.Count - 1; b > a; b--)
                {
                    for (int p = 0; p < _blocks[a].Indices.Count; p++)
                    {
                        var ap = _blocks[a].Indices[p];

                        if (_blocks[b].IsClose(_points.Points[ap], AISearch.BlockThreshold, AISearch.BlockCenterThreshold))
                        {
                            goto SUCCESS;
                        }
                    }

                    continue;

SUCCESS:

                    for (int p = 0; p < _blocks[b].Indices.Count; p++)
                    {
                        _blocks[a].Add(_blocks[b].Indices[p]);
                    }

                    _blockCache.Give(_blocks[b]);
                    _blocks.RemoveAt(b);

                    goto RESTART;
                }
            }

            for (int i = 0; i < _blocks.Count; i++)
            {
                var block = _blocks[i];
                block.Index = i;
                _blocks[i]  = block;
            }

            GeneratedPoints.Clear();
            _points.WriteTo(GeneratedPoints);

            for (int i = 0; i < _blocks.Count; i++)
            {
                var block = _blockCache.Take();
                _blocks[i].WriteTo(ref block);

                GeneratedBlocks.Add(block);
            }

            _isGenerating = false;
        }