Skip to content

v4.0.0-beta.4

Pre-release
Pre-release

Choose a tag to compare

@gsdali gsdali released this 28 Sep 04:39
· 1913 commits to main since this release
dbbb452

The 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 binaryTarget for a bare static
    library, so libOCCT-wasm.tar.gz is fetched by Scripts/fetch-occt-wasm.sh (seconds, checksum
    verified) rather than resolved by the manifest. The build also needs a consumer-side toolset,
    which Scripts/make-wasi-toolset.py writes.
  • 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.