From e3b9e5e2f03933bf9eb91431406191f3a3237b38 Mon Sep 17 00:00:00 2001 From: andywiecko Date: Sat, 9 Sep 2023 11:16:08 +0200 Subject: [PATCH] chore(release): version 2.0.0 --- CHANGELOG.md | 25 +++++++++++++++++++++++-- Documentation~/benchmark-v1-v2.png | Bin 0 -> 70048 bytes README.md | 28 +++++++++++++++------------- package.json | 2 +- 4 files changed, 39 insertions(+), 16 deletions(-) create mode 100644 Documentation~/benchmark-v1-v2.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 5cfc5ce..f209358 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 For online version see [Github Releases]. +## [2.0.0] - 2023-09-09 + +### Added + +- Introduced the `Preprocessor` enum with the following options: `None`, `COM`, and `PCA`. This enum replaces the previous transformation settings (`UseLocalTransformation`/`UsePCATransformation`). +- Introduced the `Status` (with values `OK`, `ERR`) enum along with corresponding native data. This enum is now utilized for input validation, with functionality extending beyond the Unity editor to encompass validation in builds as well. +- Added a benchmark test for mesh refinement, which will be used for future performance measurement. + +### Changed + +- Default values for `TriangulationSettings`. +- Updated Unity Editor to version `2022.2.1f1`. +- Bumped dependencies: Burst to `1.8.7`, Collections to `2.2.0`. + +### Removed + +- Removed the following deprecated methods: `Schedule(NativeArray, ...)`. +- Removed the following deprecated properties: `Positions`, `Triangles`, `PositionsDeferred`, `PositionsDeferred`. +- Removed the internal `TriangulatorNativeData` as part of a significant refactor to simplify the code structure. Internal implementations were cleaned up, and code structure was simplified. + ## [1.5.0] - 2023-04-12 ### Added @@ -39,7 +59,7 @@ options in the triangulation settings, aka `RestoreBoundary`. - Support for holes in the mesh. - Upload project's logo generated using the above features. -### Changes +### Changed - More verbose warnings during input validation. @@ -49,7 +69,7 @@ options in the triangulation settings, aka `RestoreBoundary`. - Add support for the Constraint Delaunay Triangulation with mesh refinement. -### Changes +### Changed - Performance: Bower-Watson point insertion algorithm has been optimised and is based on the breadth-first search. - Refactor: moved a few methods from jobs into `TriangulatorNativeData`. @@ -80,6 +100,7 @@ options in the triangulation settings, aka `RestoreBoundary`. - Initial release version [Github Releases]: https://github.com/andywiecko/BurstTriangulator/releases +[2.0.0]: https://github.com/andywiecko/BurstTriangulator/releases/tag/v2.0.0 [1.5.0]: https://github.com/andywiecko/BurstTriangulator/releases/tag/v1.5.0 [1.4.0]: https://github.com/andywiecko/BurstTriangulator/releases/tag/v1.4.0 [1.3.0]: https://github.com/andywiecko/BurstTriangulator/releases/tag/v1.3.0 diff --git a/Documentation~/benchmark-v1-v2.png b/Documentation~/benchmark-v1-v2.png new file mode 100644 index 0000000000000000000000000000000000000000..9d37803fd38651a83de07722f1cd86612342f0e0 GIT binary patch literal 70048 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 9ce71e1..fc929eb 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ The package provides also constrained triangulation (with mesh refinement) which - [PCA transformation](#pca-transformation) - [Benchmark](#benchmark) - [Dependencies](#dependencies) - - [Roadmap v2.0](#roadmap-v20) + - [Things to consider](#things-to-consider) - [Bibliography](#bibliography) ## Getting started @@ -55,7 +55,7 @@ Add or modify scoped registries in the manifest and in the dependencies provide selected version of the package

 "dependencies": {
-    "com.andywiecko.burst.triangulator": "1.5.0",
+    "com.andywiecko.burst.triangulator": "2.0.0",
     ...
 
See Unity docs for more details https://docs.unity3d.com/2021.1/Documentation/Manual/upm-scoped.html @@ -383,23 +383,25 @@ The package uses [`Burst`][burst] compiler, which produces highly optimized nati Below one can see a log-log plot of elapsed time as a function of the final triangles count after mesh refinement. Using Burst can provide more or less two order of magnitude faster computation. +> **Note** +> The following figure was obtained with `v1.0`. + ![Burst Triangulator benchmark](Documentation~/burst-benchmark.png "Burst Triangulator benchmark") +Below, you'll find a performance comparison (Burst enabled) between `v1.0.0` and `v2.0.0` (for the refinement task). + +![benchmark-v1-v2](Documentation~/benchmark-v1-v2.png) + ## Dependencies - [`Unity.Burst`][burst] - [`Unity.Collections`][collections] -## Roadmap v2.0 +## Things to consider -- [ ] Cache circles for constraint edges. -- [ ] Update `edgeToTriangles` buffer instead rebuilding. -- [ ] Update default `Setting`. -- [ ] Remove native data `struct` (move logic to jobs). -- [X] ~~Remove obsoletes.~~ -- [X] ~~Bump packages and editor.~~ -- [X] ~~Introduce state to support runtime (build) validation.~~ -- [X] ~~"Extract" transformations.~~ +- [ ] Consider using BVT (or another data structure) to accelerate computing. +- [ ] Consider caching circles for constraint edges. +- [ ] Consider refactoring the data structure to update the `edgeToTriangles` buffer instead of rebuilding it. ## Bibliography @@ -410,5 +412,5 @@ Using Burst can provide more or less two order of magnitude faster computation. [bowyerwatson]: https://en.wikipedia.org/wiki/Bowyer%E2%80%93Watson_algorithm [rupperts]: https://en.wikipedia.org/wiki/Delaunay_refinement#Ruppert's_algorithm -[burst]: https://docs.unity3d.com/Packages/com.unity.burst@1.8/manual/index.html -[collections]: https://docs.unity3d.com/Packages/com.unity.collections@2.1/manual/index.html +[burst]: https://docs.unity3d.com/Packages/com.unity.burst@1.8 +[collections]: https://docs.unity3d.com/Packages/com.unity.collections@2.2 \ No newline at end of file diff --git a/package.json b/package.json index 83827ca..2dc09b3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.andywiecko.burst.triangulator", - "version": "1.5.0", + "version": "2.0.0", "displayName": "Burst Triangulator", "description": "A single-file package which provides simple Delaunay triangulation of the given set of points with mesh refinement.", "unity": "2022.2",