Repository navigation
v4.0.0-beta.4
Pre-releaseThe beta that makes the WebAssembly support reachable. Every piece of the wasm consumer path
landed on main after v4.0.0-beta.3 was cut, so a consumer resolving OCCTSwift by version could
not use it at all. That is what this tag changes.
WebAssembly: wasm32-unknown-wasip1
The package now builds and runs on WebAssembly, verified end to end against a separate consumer
package rather than from inside this repository.
| What | Status |
|---|---|
| BRep construction, booleans | working |
| STEP export and import | working, including a bytes-out path with no filesystem |
| Tessellation for a renderer | working: vertices, indices, normals, ready for a BufferGeometry |
| Error handling | an OCCT raise arrives as nil plus a diagnostic record, never a trap |
| Cross-origin isolation | not needed: no COOP/COEP, no SharedArrayBuffer |
| Browser | runs in Chrome, headless and headed |
Start here: docs/guides/wasm-consumer-setup.md. It is
three commands, and it leads with what is not ready.
Read this before you pin it for wasm
- The kernel is a separate release asset. SwiftPM has no
binaryTargetfor a bare static
library, solibOCCT-wasm.tar.gzis fetched byScripts/fetch-occt-wasm.sh(seconds, checksum
verified) rather than resolved by the manifest. The build also needs a consumer-side toolset,
whichScripts/make-wasi-toolset.pywrites. - Module size is unaddressed, at roughly 27 MB brotli for a small application. About half of the
compressed total is Foundation before any OCCT is involved. None of the known levers has been
tried; that work is #2761. Shape.isSelfIntersecting(hardTimeout:)is absent on wasm. Its contract is a hard wall-clock
deadline enforced from a second thread, which a single-threaded target cannot honour. Use
isSelfIntersecting(timeout:), whose bound is cooperative and which exists everywhere.- No test suite runs on wasm yet. Six smoke cases run in CI on every PR; no per-domain target has
been compiled for the target (#2793).
Also in this beta
A MINOR on Apple platforms from retiring three mitigations the kernel repin made obsolete
(#2186): Document.datum(at:) and the datum mutators now succeed on a datum carrying an annotation
point with no annotation plane where they returned nil/false, dimTolToolToleranceCount returns
the real count where it returned 0, and rescaleGeometry no longer refuses such a document. Each
is a wrong or withheld answer becoming a correct one, so nothing that worked stops working, but a
caller asserting on the old refusal will see the new value.
The kernel moved to v4.0.0-kernel.2, OCCT V8_0_1 plus thirty carried patches, where
beta.3 pinned kernel.1 with twenty-nine. The addition is 0042, a null-surface guard in
ShapeAnalysis::GetFaceUVBounds that was a SIGSEGV on seven measured cases. Both platforms are on
the same kernel, enforced by a gate rather than remembered.
Still a pre-release
v4.0.0 is a major by SemVer Rule 2, on fifteen breaking changes. They are listed with migrations in
docs/SEMVER.md, and the full history is in
docs/CHANGELOG.md.
Verification
CHANGELOG audited with --verify-transcribed: nothing genuinely missing. Both kernel pins checked by
check-wasm-kernel-parity.py, clean with no acknowledgement. All fifteen static gates and their
self-tests green. Operation count derives 4,365 and agrees with every headline. Full suite: 6,446
tests in 1,584 suites, zero failures.