Example #1
0
        public static ArrayGrid <T> MapToSubGrid <T>(this ArrayGrid <T> grid, Vector2Int sourceAreaPos, Vector2Int sourceAreaSize, Vector2Int subGridSize, bool clampOutOfBounds = true)
        {
            if (!clampOutOfBounds)
            {
                if (!grid.IsValidPosition(sourceAreaPos))
                {
                    return(new ArrayGrid <T>());
                }

                if (!grid.IsValidPosition(sourceAreaPos + sourceAreaSize - Vector2Int.one))
                {
                    return(new ArrayGrid <T>());
                }
            }
            else
            {
                sourceAreaPos.Clamp(Vector2Int.zero, grid.MaxValidPosition);

                Vector2Int sourceAreaMax = sourceAreaPos + sourceAreaSize;
                sourceAreaMax.Clamp(Vector2Int.zero, grid.Size);

                sourceAreaSize = sourceAreaMax - sourceAreaPos;

                if (sourceAreaSize.x <= 0 || sourceAreaSize.y <= 0)
                {
                    return(new ArrayGrid <T>());
                }
            }

            ArrayGrid <T> subGrid = new ArrayGrid <T>(subGridSize);

            var subGridIter = subGrid.GetEnumerator2D();

            Vector2 scale = new Vector2((float)sourceAreaSize.x / subGridSize.x, (float)sourceAreaSize.y / subGridSize.y);

            while (subGridIter.MoveNext())
            {
                Vector2Int subCurrent       = subGridIter.Current;
                Vector2    scaledSubCurrent = new Vector2(subCurrent.x * scale.x, subCurrent.y * scale.y);
                Vector2Int sourcePos        = sourceAreaPos + Vector2Int.FloorToInt(scaledSubCurrent);

                subGrid[subCurrent] = grid[sourcePos];
            }

            return(subGrid);
        }