Skip to content

Commit ade5fc6

Browse files
committed
Update for 0.8.12 release
1 parent 033ee0c commit ade5fc6

33 files changed

Lines changed: 1309 additions & 117 deletions

File tree

CHANGELOG.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,22 @@
11
# Change Log
22

3+
## [0.8.12](https://github.com/nicklockwood/Euclid/releases/tag/0.8.12) (2025-10-25)
4+
5+
- Fixed crash when creating a path from empty subpaths
6+
- Fixed `Mesh.minkowskiSum()` output for off-center input meshes
7+
- Improved `Mesh.detesselate()` algorithm (now merges more polygons than before)
8+
- The `Path.closed()` method and `Path.isClosed` property now behave correctly for subpaths
9+
- Improved subpaths implementation (more reliably preserves distinct subpaths)
10+
- Fixed assertion in `Plane.init` for very small or degenerate triangles
11+
- Fixed assertion in internal `Polygon.insertPoint()` method
12+
- Fixed assertion in internal `detessellate()` method
13+
- Fixed bug with internal `sanitizePoints()` method introducing neighboring duplicate points
14+
- Deprecated optional cancellation handlers in `Path.clipped()` and `Polygon.clipped()`
15+
- Added optional `color` parameter to `Path.text()` constructor
16+
317
## [0.8.11](https://github.com/nicklockwood/Euclid/releases/tag/0.8.11) (2025-10-12)
418

5-
- Fix regression in `Mesh.loft()` method when one or more input paths has a single point
19+
- Fixed regression in `Mesh.loft()` method when one or more input paths has a single point
620
- Made more long-running Mesh shape operations cancellable
721

822
## [0.8.10](https://github.com/nicklockwood/Euclid/releases/tag/0.8.10) (2025-10-05)

Euclid.docc/Extensions/Path.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
### Creating Text Paths
3030

31-
- ``Path/text(_:font:width:detail:)``
31+
- ``Path/text(_:font:width:detail:color:)``
3232
- ``Path/text(_:width:detail:)``
3333

3434
### Path Properties

Euclid.podspec.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "Euclid",
3-
"version": "0.8.11",
3+
"version": "0.8.12",
44
"license": {
55
"type": "MIT",
66
"file": "LICENSE.md"
@@ -10,7 +10,7 @@
1010
"authors": "Nick Lockwood",
1111
"source": {
1212
"git": "https://github.com/nicklockwood/Euclid.git",
13-
"tag": "0.8.11"
13+
"tag": "0.8.12"
1414
},
1515
"source_files": "Sources",
1616
"requires_arc": true,

Euclid.xcodeproj/project.pbxproj

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -912,7 +912,7 @@
912912
"@executable_path/../Frameworks",
913913
"@loader_path/Frameworks",
914914
);
915-
MARKETING_VERSION = 0.8.11;
915+
MARKETING_VERSION = 0.8.12;
916916
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
917917
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
918918
OTHER_SWIFT_FLAGS = "-Xfrontend -warn-long-expression-type-checking=75";
@@ -951,7 +951,7 @@
951951
"@executable_path/../Frameworks",
952952
"@loader_path/Frameworks",
953953
);
954-
MARKETING_VERSION = 0.8.11;
954+
MARKETING_VERSION = 0.8.12;
955955
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
956956
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14";
957957
OTHER_SWIFT_FLAGS = "-Xfrontend -warn-long-expression-type-checking=75";
@@ -1035,7 +1035,7 @@
10351035
"$(inherited)",
10361036
"@executable_path/Frameworks",
10371037
);
1038-
MARKETING_VERSION = 0.8.11;
1038+
MARKETING_VERSION = 0.8.12;
10391039
PRODUCT_BUNDLE_IDENTIFIER = com.charcoaldesign.EuclidExample;
10401040
PRODUCT_NAME = EuclidExample;
10411041
SDKROOT = iphoneos;
@@ -1068,7 +1068,7 @@
10681068
"$(inherited)",
10691069
"@executable_path/Frameworks",
10701070
);
1071-
MARKETING_VERSION = 0.8.11;
1071+
MARKETING_VERSION = 0.8.12;
10721072
PRODUCT_BUNDLE_IDENTIFIER = com.charcoaldesign.EuclidExample;
10731073
PRODUCT_NAME = EuclidExample;
10741074
SDKROOT = iphoneos;
@@ -1097,7 +1097,7 @@
10971097
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
10981098
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
10991099
MACOSX_DEPLOYMENT_TARGET = 10.14;
1100-
MARKETING_VERSION = 0.8.11;
1100+
MARKETING_VERSION = 0.8.12;
11011101
PRODUCT_BUNDLE_IDENTIFIER = com.charcoaldesign.PerformanceTests;
11021102
PRODUCT_NAME = "$(TARGET_NAME)";
11031103
SDKROOT = auto;
@@ -1127,7 +1127,7 @@
11271127
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
11281128
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
11291129
MACOSX_DEPLOYMENT_TARGET = 10.14;
1130-
MARKETING_VERSION = 0.8.11;
1130+
MARKETING_VERSION = 0.8.12;
11311131
PRODUCT_BUNDLE_IDENTIFIER = com.charcoaldesign.PerformanceTests;
11321132
PRODUCT_NAME = "$(TARGET_NAME)";
11331133
SDKROOT = auto;

Euclid.xcodeproj/xcshareddata/xcbaselines/01F995E62E6455BD0017AAC8.xcbaseline/8C068051-1BA5-4790-A538-AF1EC8F13366.plist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
5252
<dict>
5353
<key>baselineAverage</key>
54-
<real>1.296356</real>
54+
<real>1.300000</real>
5555
<key>baselineIntegrationDisplayName</key>
5656
<string>Local Baseline</string>
5757
</dict>
@@ -61,7 +61,7 @@
6161
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
6262
<dict>
6363
<key>baselineAverage</key>
64-
<real>0.342785</real>
64+
<real>0.343000</real>
6565
<key>baselineIntegrationDisplayName</key>
6666
<string>Local Baseline</string>
6767
</dict>

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,19 @@ Euclid is packaged as a dynamic framework that you can import into your Xcode pr
3535
To install Euclid using CocoaPods, add the following to your Podfile:
3636

3737
```ruby
38-
pod 'Euclid', '~> 0.8.11'
38+
pod 'Euclid', '~> 0.8.12'
3939
```
4040

4141
To install using Carthage, add this to your Cartfile:
4242

4343
```ogdl
44-
github "nicklockwood/Euclid" ~> 0.8.11
44+
github "nicklockwood/Euclid" ~> 0.8.12
4545
```
4646

4747
To install using Swift Package Manager, add this to the `dependencies:` section in your Package.swift file:
4848

4949
```swift
50-
.package(url: "https://github.com/nicklockwood/Euclid.git", .upToNextMinor(from: "0.8.11")),
50+
.package(url: "https://github.com/nicklockwood/Euclid.git", .upToNextMinor(from: "0.8.12")),
5151
```
5252

5353

Sources/Mesh+Shapes.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1065,7 +1065,8 @@ private extension Mesh {
10651065
.loft($0, faces: faces, material: material, isCancelled: isCancelled)
10661066
}, isCancelled: isCancelled)
10671067
}
1068-
let shapes = shapes.filter { !$0.points.isEmpty }
1068+
// TODO: could we split the extrusion at empty shapes instead?
1069+
let shapes = shapes.filter { !$0.isEmpty }
10691070
guard let first = shapes.first, let last = shapes.last else {
10701071
return .empty
10711072
}

Sources/Utilities.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,7 @@ func faceNormalForPoints(_ points: [Vector]) -> Vector {
432432
}
433433
}
434434

435-
// Points must be linear, so find what line they line on
435+
// Points must be linear, so find what line they lie on
436436
// and then return the orthogonal vector to that one
437437
let ab = points.count > 1 ? points[1] - points[0] : .zero
438438
if let normal = ab.cross(.unitZ).cross(ab).direction {

Tests/LineSegmentCSGTests.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ final class LineSegmentCSGTests: XCTestCase {
6464

6565
// MARK: Mesh Subtraction
6666

67+
@available(*, deprecated)
6768
func testSubtractCube() {
6869
let line = LineSegment(unchecked: [0, -2, 0], [0, 2, 0])
6970
let mesh = Mesh.cube()

Tests/PlaneTests.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ final class PlaneTests: XCTestCase {
251251
XCTAssertTrue(points.allSatisfy(plane.intersects))
252252
}
253253

254+
@available(*, deprecated)
254255
func testDeprecatedPointPlaneDistance() {
255256
let point = Vector(-10, 0, 0)
256257
let plane = Plane(unchecked: .unitX, w: 0)

0 commit comments

Comments
 (0)