private void LoadRegionAround(DataPoint p)
        {
            p.GetComponent<Renderer>().enabled = true;

            var maxRows = _generatedObjects.GetLength(0) - 1;
            var maxCols = _generatedObjects.GetLength(1) - 1;

            var startRow = Mathf.Max(p.RowIndex - LoadRegionRadius, 0);
            var endRow = Mathf.Min(p.RowIndex + LoadRegionRadius, maxRows);

            var startCol = Mathf.Max(p.ColumnIndex - LoadRegionRadius, 0);
            var endCol = Mathf.Min(p.ColumnIndex + LoadRegionRadius, maxCols);

            for (int row = startRow; row <= endRow; row++)
            {
                for (int col = startCol; col <= endCol; col++)
                {
                    if (row == p.RowIndex && col == p.ColumnIndex)
                    {
                        continue;
                    }

                    if (_generatedObjects[row, col] == null)
                    {
                        var newPoint = Heatmap.GenerateDataPoint(row, col);
                        newPoint.GetComponent<Renderer>().enabled = false;
                        _generatedObjects[row, col] = newPoint;
                    }
                }
            }
        }
        private void UnloadRegionAround(DataPoint p)
        {
            p.GetComponent<Renderer>().enabled = false;

            var maxRows = _generatedObjects.GetLength(0) - 1;
            var maxCols = _generatedObjects.GetLength(1) - 1;

            // Note: the surrounding datapoints should always be active, so that panning
            // always loads data if user pans model completely outside
            // -> max(1, ...); min(max - 1, ...) instead of 0
            var startRow = Mathf.Max(p.RowIndex - LoadRegionRadius, 1);
            var endRow = Mathf.Min(p.RowIndex + LoadRegionRadius, maxRows - 1);

            var startCol = Mathf.Max(p.ColumnIndex - LoadRegionRadius, 1);
            var endCol = Mathf.Min(p.ColumnIndex + LoadRegionRadius, maxCols - 1);

            for (int row = startRow; row <= endRow; row++)
            {
                for (int col = startCol; col <= endCol; col++)
                {
                    if (row == p.RowIndex && col == p.ColumnIndex)
                    {
                        continue;
                    }

                    var oldPoint = _generatedObjects[row, col];

                    if (oldPoint != null && !(oldPoint.GetComponent<Renderer>().isVisible))
                    {
                        _generatedObjects[row, col] = null;
                        Destroy(oldPoint);
                    }
                }
            }
        }