# grainscape 1.0.0

## Dependency changes

* Migrated from `raster`/`sp` to `terra`/`sf` for all spatial operations:
  - `terra` and `sf` added to `Imports`;
  - `raster` and `sp` dependencies removed entirely.
* Vignette diagrams are now generated from code with `DiagrammeRsvg` and `rsvg` (added to
  `Suggests`); `webshot2` is no longer needed for the vignettes and was removed from `Suggests`.

## Breaking changes

* `MPG()`, `patchFilter()`, and `ggGS()` no longer accept `RasterLayer` inputs;
  pass `SpatRaster` objects (from `terra`) instead;
* `corridor()`, `distance()`, and `point()` no longer accept `SpatialPoints` inputs;
  pass a two-column matrix or `sf` object instead;
* Slot types in `mpg`, `goc`, `grain`, and `corridor` S4 classes have changed from
  `RasterLayer`/`SpatialPoints`/`SpatialLines`/`SpatialLinesDataFrame` to `SpatRaster`/`sf`;
* The long-deprecated `gs`-prefixed functions (`gsMPG()`, `gsGOC()`, `gsGOCCorridor()`,
  `gsGOCDistance()`, `gsGOCPoint()`, `gsGOCVisualize()`, `gsGraphDataFrame()`, `gsMPGstitch()`)
  are now defunct and error with a pointer to their replacement (deprecated since 0.4.0; #10);

## New features

* New exported plotting helpers `plotResistance()` and `plotWithResistance()`: draw a
  resistance surface with a consistent colour scheme (and a discrete-value legend), and
  place it as an equally-sized reference panel beside a network plot for visual comparison.
  Both are demonstrated in the vignette's introductory figures (`plotWithResistance()` uses
  `cowplot`).

## Bugfixes

* Fixed incorrect least-cost paths in MPG (#72);
* Fixed a regression in the #72 work where legitimate, non-redundant MPG links were dropped on
  high-variance resistance surfaces: the indirect-path search could treat an unset cell id
  (the internal `-99` sentinel) as a pivot patch, fabricating a bogus two-hop route that
  suppressed a valid direct link. Such malformed links are now rejected and non-patch pivots
  are ignored (#72);
* Fixed patches being left isolated in the MPG: a patch cell that was never added as an
  active cell during spreading (e.g. a single-cell patch) kept the internal `-99` id, so it
  was an unresolved link endpoint and all of its links were silently dropped. Every cell's id
  is now seeded from the voronoi map at initialization, so such patches are linked correctly
  (#72);
* Fixed an infinite loop (hang) in `MPG()`: a resistance surface whose first cell is `NA` left
  the C++ engine's internal cost range as `NaN`, so every patch cell was assigned a `NaN`
  resistance and never "settled", spinning forever. The engine now derives the cost range while
  skipping `NA` cells, and fully initializes its spreading-state struct, hardening it against
  this class of hang (#72);
* Fixed a Voronoi tessellation bias on high-variance resistance surfaces: patch (source) cells
  now begin spreading at the uniform minimum cost rather than the resistance of the cell they
  happen to overlap. Previously a patch sitting on a high-resistance cell spread late and lost
  territory to its neighbours, distorting the tessellation (and, in the extreme, leaving a
  patch with a single-cell region and no links). The fix changes only the tessellation: link
  weights are accumulated from the entered cells' resistances (independent of the source cell),
  so on the package's test surfaces the MPG and its weights are unchanged, and still match
  independent least-cost paths exactly (#72);
* Fixed `graphdf` returning a transposed (single-column) data frame for MPGs with only one link;
* `patchFilter()` no longer errors on R < 4.6 (with recent `terra`): it masked small patches via
  `out[out %in% rmpatch] <- NA`, which relies on `%in%` dispatching for a `SpatRaster` and fails
  with "'match' requires vector arguments" under older R; it now uses `terra::subst()` (#76);
* `point()` (and `distance()`, which calls it) now emit the "coords correspond to NA cells" warning once per call instead of once per coordinate-threshold combination (#50);
* The `corridor` `plot()` method now uses the `linewidth` aesthetic (rather than the deprecated
  `size` aesthetic) for its link segments, silencing a `ggplot2` (>= 3.4.0) deprecation warning;

## Vignette

* The "Calculating the minimum planar graph" vignette now generates its UML class diagrams, the
  algorithm flow chart, and the `Engine` call graphs directly from Graphviz/`DiagrammeR`
  specifications (rendered to vector PDFs with `DiagrammeRsvg` and `rsvg`) rather than embedding
  static images, so they stay in sync with the C++ engine; its technical reference was also
  updated for the #72 least-cost-path changes (the `settled_map`, `createLinks()`, and the
  `parentResistance` field) (#75);
* Corrected the thresholded-MPG figure (Figure 6), which plotted links *above* the dispersal
  threshold instead of the retained links *below* it (so the cheap, low-resistance links
  between neighbouring patches were hidden);
* Made the Euclidean-vs-resistance path-distance table robust by matching rows on the node
  pair (rather than column-binding two independently sorted tables), and the "patch 7
  neighbours" table now filters explicitly for patch 7. The minimum-planar-graph figure above
  that table now labels exactly node 7 and its linked neighbours, derived from the graph rather
  than a hard-coded list of patch ids.

# grainscape 0.5.0

## Dependency changes

* none

## Bugfixes

* none

## New features & enhancements

* none

# grainscape 0.5.0

## Dependency changes

* Require R 4.2 or higher (for native pipe and placeholder)
* Add `DiagrammeR`, `dplyr`, `webshot2` and `withr` to Suggests for use with vignettes and tests

## Bugfixes

* Fixed documentation issues and 'memory not mapped' segfault errors on R-devel (#73)
* Improved handling of user-added attributes in exported objects (#71)
* Fixed partial match warnings
* Use replacements for deprecated `igraph` functions

## New features & enhancements

* Use native R pipe throughout instead of `magrittr` pipe
* Improved documentation

# grainscape 0.4.4

## Dependency changes

* Removed retiring spatial packages `rgdal` and `rgeos` (#68);
* Use `sf` for writing shapefiles;

## Bugfixes

* Improved plotting of lattice MPGs (#51);
* Removed unused `eucPerimWeight` from documentation (#56);
* Improved error messaging for undefined thresholds in `GOC()` (#57);

## New features & enhancements

* none

# grainscape 0.4.3

## Dependency changes

* none

## Bugfixes

* none

## New features & enhancements

* added MEE paper citation and updated package `DESCRIPTION` & `README`.

# grainscape 0.4.2

## Dependency changes

* removed unused dependency `hunspell` from Suggests

## Bugfixes

* reduced package tarball size

## New features & enhancements

* none

# grainscape 0.4.1

## Dependency changes

* none

## Bugfixes

* fix error on R-devel exposed by change to `matrix` class
* fixed error in `theme_grainscape()` example

## New features & enhancements

* added package hexsticker

# grainscape 0.4.0

## Dependency changes

* Requires R >= 3.5
* remove `rgeos` dependency and deprecate use of `sp` argument to many functions (#38)

## Bugfixes

* numerous bug fixes

## New features & enhancements

* reimplement an algorithm to calculate the minimum planar graph using C++;
  no longer relies on SELES binary and is now cross-platform.
* use updated `igraph` functions internally
* updated vignette / tutorial (#5)
* renamed functions to remove `gs` and `gsGOC` prefixes; old names have been deprecated and will be removed in a future release (#10)
* `MPG()` can now handle large rasters
* use S4 classes and methods (#3, #19)
* improved plotting using `ggplot2` by default (#22, #47)
* new functions `export()` (#39) and `patchFilter()` (#40)
* fix typos (#58, @jsta)

## Removed features

* removed `gsMPGstitch()` as it was unreliable

# grainscape 0.3.0

* original version from R-forge (http://grainscape.r-forge.r-project.org/)
* uses a SELES binary to calculate the minimum planar graph (Windows only)
