Skip to content

Releases: Open-Cascade-SAS/OCCT

V8_0_0

07 May 08:54

Choose a tag to compare

Open Cascade is delighted to announce the final release of Open CASCADE Technology version 8.0.0 to the public.

This is the largest single-version step in OCCT in many years. The cycle covered five Release Candidates and three Beta builds and accumulated more than 500 changes since 7.9.0. The notes below describe what is different in 8.0.0 final compared to 7.9.0. Per-stage notes remain available for anyone tracking individual increments.

Migration guidance is published separately on the developer portal: https://dev.opencascade.org/doc/overview/html/occt__upgrade.html. The page may take a short time to refresh after the tag.

Per-stage release notes


Project layout, language baseline and tooling

The minimum C++ standard is now C++17. The codebase uses if constexpr, std::optional, std::variant, std::string_view, std::shared_mutex, structured bindings and fold expressions throughout. Compilers below the C++17 line are no longer supported.

The source tree was reorganized to follow src/Module/Toolkit/Package/File. Resources moved to a top-level /resource directory. Documentation generation moved from the legacy Tcl harness to CMake. Inspector and ExpToCas were extracted into their own repositories. The samples/ directory contains a top-level README pointing to the external samples repository and the browsable site.

CMake support was reworked. The build is validated on CMake 3.10 and above. ARM64 is a first-class target on both macOS and Windows. VCPKG support is comprehensive: a share/-compliant layout, the OCCT_PROJECT_NAME parameter for directory customization, and the upstream opencascade port with TclTk and GTest. VTK 9 is supported, with conditional linkage of vtkRenderingGL2PSOpenGL2 so Android, iOS and GLES builds do not require it. VTK is no longer enabled by default: configurations that depend on TKIVtk and the VTK-based viewer must set USE_VTK=ON explicitly.

GTest is the unit-testing framework for OCCT. New tests were added across every module, and many legacy QADraw test cases were migrated to GTest.

Foundation Classes

Exceptions and threading

Standard_Failure now inherits from std::exception. OCCT errors can be caught through catch (const std::exception&) or catch (const Standard_Failure&). The class exposes what() and ExceptionType(). The static helpers Raise(), Throw() and Instance() are gone; exceptions are raised with the C++ throw keyword. Standard_ErrorHandler::Catches() and LastCaughtError() are also removed.

The error-handler stack is thread_local. There is no global mutex on the error-handler path, so OCCT exception handling scales linearly with thread count. OCC_CATCH_SIGNALS was updated accordingly.

Standard_Mutex and TopTools_MutexForShapeProvider were retired. Code uses std::mutex, std::lock_guard, std::unique_lock and, where ownership is optional, std::unique_ptr<std::mutex>. Standard_Condition was rebuilt on top of standard primitives. Foundation-level globals use std::atomic. Windows host initialization uses std::call_once. Several global mutable statics in TKBool were converted to thread_local. Concurrent operations in the BRep checker and several Foundation paths are race-free.

Transfer_TransferDeadLoop is deprecated. Dead-loop detection now uses local status flags rather than a thrown exception; the class is retained for binary compatibility but should not be used by new code.

Math

The OCCT global math wrappers (ACos, ASin, ATan, ATan2, Sin, Cos, Tan, Cosh, Sinh, Tanh, ACosh, ASinh, ATanh, Sqrt, Log, Log10, Exp, Pow, Abs, Sign, Floor, Ceiling, Round, IntegerPart, Min, Max, NextAfter, ACosApprox) are deprecated. Code should use the matching std:: functions.

Solver and matrix code received broad updates:

  • MathPoly_Laguerre provides general polynomial root finding with Laguerre iteration plus deflation, including specialized helpers for quintic, sextic and octic polynomials.
  • The 2D, 3D and 4D Newton solvers were refactored onto a unified fixed-size API.
  • A coordinate-wise polishing phase based on Brent line search (MathUtils_LineSearch::BrentAlongCoordinate, MathUtils_Random) was added to the PSO and DE solvers. On separable functions it improves component-level precision from around 1e-4 to 1e-8 and better.
  • The modern MathRoot, MathSys and MathLin packages were aligned with the legacy math_* results so callers can switch without behavioural drift.
  • math_Matrix::Multiply() uses an i-k-j loop order matching the row-major storage.
  • math_VectorBase::Norm() and Norm2() use four-way unrolling with pairwise partial sums.
  • math_Matrix and math_Vector are movable. math_Vector::Resize() was added.
  • math_DoubleTab is built on NCollection. math_DirectPolynomialRoots was refactored. math_FunctionRoot no longer raises StdFail_NotDone when iteration count is queried after a failed root search.
  • Compile-time sqrt constants and a constexpr Pascal allocator for PLib::Bin are available. Jacobi coefficients are precomputed.
  • PLib_Base and PLib_DoubleJacobiPolynomial were removed. PLib_JacobiPolynomial and PLib_HermitJacobi are value types and their evaluation methods are const.
  • Polynomial evaluation in PLib was optimized along the hot path.
  • EigenValuesSearcher was tightened.

TKMath was reorganized: the modern MathRoot, MathSys, MathLin, MathPoly, MathUtils packages own the new solver, root-finder and utility code, while the legacy math_* headers continue to compile.

Collections

Several new containers entered the foundation:

  • NCollection_FlatMap and NCollection_FlatDataMap are open-addressing hash tables with Robin Hood probing. Pairs are inline in a contiguous array, sizing is power-of-two with bitwise modulo, and hash codes are cached.
  • NCollection_OrderedMap and NCollection_OrderedDataMap preserve insertion order through an intrusive doubly linked list. Lookup, append and removal are O(1).
  • NCollection_KDTree is a header-only static balanced KD-tree supporting nearest-neighbour, k-NN, range, axis-aligned-box and sphere queries, plus a callback-based range query for custom filtering during spatial searches. It works out of the box with gp_Pnt, gp_Pnt2d, gp_XYZ and gp_XY, with optional per-point radii and weighted nearest queries through compile-time template parameters.
  • NCollection_LinearVector is a contiguous flat-buffer dynamic array. Trivially copyable types grow through Standard::Reallocate; non-trivial types grow through move construction. Iterator invalidation is documented in the header.
  • NCollection_DynamicArray was rebuilt on top of NCollection_LinearVector<T*> with fixed-size blocks, power-of-two block sizing, and a precomputed shift and mask for O(1) indexed access. InsertBefore() and InsertAfter() helpers are available with element-shift semantics.
  • NCollection_ForwardRange is a lightweight non-owning forward-range adapter. It supports range-based for over index spans.

The whole map family received an API pass:

  • Contained() is available on every map type and returns std::optional<std::reference_wrapper<T>>.
  • TryEmplace() and TryBind() are available on every map type.
  • Items() and IndexedItems() views allow for (auto [k, v] : map.Items()) { ... } over DataMap, FlatDataMap, IndexedDataMap and IndexedMap.
  • Emplace methods (EmplaceAppend, EmplacePrepend, EmplaceBefore, EmplaceAfter) are present on List, Sequence, DynamicArray, Array1 and Array2.
  • NCollection_List has a std::initializer_list constructor, an Exchange() method, an optimized move constructor and improved const-correctness.
  • NCollection_UBTree and NCollection_EBTree traverse iteratively through an explicit stack (the recursive variant could overflow on deep trees) and have move semantics.
  • NCollection_LocalArray works with non-trivial types through placement-new and explicit destruction, has move semantics and Reallocate(), so it can be used as a growable stack.
  • NCollection_CellFilter has proper move semantics.
  • The NCollection_IncAllocator fast path is lock-free: a std::shared_mutex plus CAS bump allocation on an atomic available-size means existing-block allocations never contend.
  • NCollection_BaseMap iterators were unified under size_t through a findFirst() helper.
  • Size() returns size_t on Map, DataMap, IndexedMap, IndexedDataMap, Sequence, Array1, Array2 and List. Length() keeps the int contract for callers that feed sizes into int-typed APIs.
  • NCollection_Array1 and Array2 have zero-based constructors and size_t-based Resize() overloads. Assign() and operator= now overwrite the destination bounds (matching std::vector); the previous element-wise copy with size-mismatch throw is preserved as CopyValues().
  • Standard_Transient reference counting uses explicit memory ordering (relaxed increment, release decrement with an acquire fence at zero).
  • Sun WorkShop and Borland compiler workarounds were removed.
  • `NCollection_SparseArray...
Read more

V8_0_0_beta3

07 May 07:44

Choose a tag to compare

V8_0_0_beta3 Pre-release
Pre-release

Open Cascade is pleased to announce the release of Open CASCADE Technology version 8.0.0 Beta 3 to the public.

Overview

Beta 3 is the last preview before final 8.0.0. It tightens a few rough edges from the Beta cycle: a breaking semantic change to NCollection_Array1/2::Assign (it now overwrites the destination bounds), a revert of the GProp_PGProps / GProp_PEquation relocation, and the BRepGraph CoEdge model rework that lands seam handling on its final design. The shader grid command surface is renamed from inf/"infinite" to gpu and gains camera-relative sizing.

⚠️ Read the migration notes below before upgrading. The NCollection_Array1/2::Assign change is silent at the call site - code that previously relied on the destination keeping its bounds (or relied on Assign() throwing on size mismatch) will compile unchanged but behave differently at runtime, and any code that misused Assign() to copy into a fixed-size view is now particularly likely to surface latent bugs.

Final 8.0.0 release is planned for May 7, 2026 - immediately after this Beta.

Highlights

  • ⚠️ Breaking: NCollection_Array1/2::Assign now overwrites destination bounds; new CopyValues() preserves them #1269 - Assign() and operator= now resize the destination to match the source (matching std::vector semantics). The previous behavior - throw/assert on size mismatch and copy element-wise into the existing buffer - is now CopyValues(). Callers in Geom* and math utilities that depended on the old behavior were migrated to CopyValues(). Tests expanded to cover owned/external buffers and size changes. Note that this exposes pre-existing misuse: code that relied on Assign() throwing to "validate" sizes, or that assigned a larger array into a smaller view expecting truncation, will now silently change behavior - the ShapeConstruct_ProjectCurveOnSurface crash fix below is one such case found in our own tree.
  • CoEdge model rework #1261 - seam detection/pairing is now connectivity-derived: SeamPair() walks sibling coedges on the same face with opposite orientations, and seam halves are present in wire CoEdgeRefIds to match TopoDS iteration order. Geometric continuity (including seam continuity) moved to BRepGraph_LayerRegularity; populate/reconstruct/editor APIs adjusted accordingly.
  • GProp point-set classes restored to TKGeomBase #1268 - reverts #1140. GProp_PGProps and GProp_PEquation are back in TKGeomBase, the PointSetLib package is removed from TKMath, callers and docs updated, and the corresponding GTests moved to TKGeomBase.
  • Shader grid renamed infgpu, plus viewAdaptive sizing #1264 - command and API surface renamed throughout; OpenGl path now computes adaptive bounds from the visible region and fixes axis coloring for rotated rectangular grids. Draw tests, help text, and comments refreshed.
  • Crash fix in ShapeConstruct_ProjectCurveOnSurface::insertAdditionalPointOrAdjust #1267 - the function previously assigned a larger array to a smaller one through NCollection_Array1::Assign, which always threw on size mismatch. Switched to move assignment, which is also more efficient.
  • size_t printing in DRAW #1270 - new Draw_Interpretor::Append() and operator<< overloads for size_t.
  • Documentation refresh #1265, #1271, #1273 - example variables aligned with OCCT conventions, modern macros/types (occ::handle, nullptr, M_PI), corrected API/enum names (BOPTools_AlgoTools, BOPAlgo_GlueEnum, BRepPrimAPI_MakePrism, etc.), and a long list of fixed snippet bugs (GetClosedWires/GetOpenWires, inverted IsNull, missing IsDone() guards, JSON syntax in debug, sphere latitude range, BNF brackets in brep_format, and assorted typos).

Migration

Beta 3 includes one source-compatible-but-behavior-changing item; review if you depend on either area.

  • NCollection_Array1/2::Assign / operator= now changes the destination bounds. This is a runtime behavior change with no compile-time signal:
    • Old behavior: throw on size mismatch, copy element-wise into the existing buffer, leave destination bounds untouched.
    • New behavior: replace destination bounds and storage from the source, like std::vector assignment.
    • Migration: switch to CopyValues() anywhere the destination's bounds must stay fixed - in particular for arrays wrapping external storage, arrays sized to a specific algorithm input, or any spot where you were relying on the old throw to catch size mismatches.
    • Audit hint: incorrect uses of Assign() were previously caught at runtime by the size-mismatch throw; under the new semantics they will compile and run silently with surprising bounds. Grep for .Assign( and operator= on NCollection_Array1/Array2 in your codebase and review each call. The OCCT in-tree migration is done in Geom* and math utilities, and one such latent bug surfaced in ShapeConstruct_ProjectCurveOnSurface (see #1267).
  • GProp_PGProps / GProp_PEquation location. These are back in TKGeomBase (their pre-#1140 home), and PointSetLib is gone from TKMath. If you had updated includes or link dependencies for the Beta 1/2 layout, revert those changes.
  • Shader grid command/API rename. Anything driving the grid through Draw with inf* commands or referencing the infinite/shader naming should switch to gpu*. The CPU backend restored in Beta 2 is unaffected. The new viewAdaptive mode is opt-in.

Full Changelog: V8_0_0_beta2...V8_0_0_beta3

V8_0_0_beta2

03 May 19:46

Choose a tag to compare

V8_0_0_beta2 Pre-release
Pre-release

Open Cascade is pleased to announce the release of Open CASCADE Technology version 8.0.0 Beta 2 to the public.

Overview

Beta 2 is a small follow-up to Beta 1 addressing two issues raised during the Beta soak: thread-safety crashes in the STEP/IGES read and STEP write pipelines, and the loss of the classical CPU grid backend. It also ships the 8.0.0 documentation refresh and a new top-level samples/ slot.

No new features, no API breakage beyond what Beta 1 already announced. Final 8.0.0 release remains planned for May 7, 2026.

Highlights

  • Thread-safe STEP write and STEP/IGES read #1259 - fixes libmalloc double-free under concurrent STEPControl_Writer::Transfer and intermittent crashes in concurrent STEP/IGES readers. Contract: one reader/writer per thread; STEP read and write safe under that contract, IGES read is not.
  • CPU grid path restored alongside the shader grid #1252 - the classical Graphic3d_Structure-based grid removed in Beta 1 (#1223) is back as a coexisting backend for legacy GL profiles and embedded targets. Snap math unchanged; backends mutually exclusive per view.
  • Documentation modernized for 8.0.0 #1256 - GitHub-native workflow, vcpkg build, C++17 baseline, full 8.0.0 upgrade guide; obsolete Mantis/Gitolite/Inspector/DFBrowser pages removed.
  • Top-level samples/ directory #1257 - new README points to the external samples repository and browsable site.
  • CI warning cleanup #1253 - NULL -> nullptr sweep in OpenGL files plus macOS / Ubuntu warning fixes under the Beta 1 -Werror baseline.

Migration

Beta 2 introduces no new API breakage. Beta 1 migration material applies unchanged. Two additions to keep in mind:

  • STEP/IGES concurrency: STEP read and write are safe with one instance per thread (default parameter set). IGES read is not supported concurrently - serialize it.
  • Grid backend: existing V3d_View::SetGrid / V3d_Viewer::ActivateGrid calls resolve to the restored CPU path again. V3d_View::GridDisplay(Aspect_GridParams, ...) remains the shader path. Activating one erases the other on the same view.

Full Changelog: V8_0_0_beta1...V8_0_0_beta2

V8_0_0_beta1

30 Apr 10:46

Choose a tag to compare

V8_0_0_beta1 Pre-release
Pre-release

Open Cascade is delighted to announce the release of Open CASCADE Technology version 8.0.0 Beta 1 to the public.

Overview

Version 8.0.0-beta1 marks the feature-freeze milestone on the road to OCCT 8.0.0. It incorporates 41 changes since 8.0.0-rc5, bringing the cumulative total of improvements and fixes since 7.9.0 to over 500 changes. The Beta cycle is dominated by two large automated quality sweeps and one major NCollection / BRepGraph overhaul.

The Beta phase signals that 8.0.0 is feature-complete: no further functional or API changes are planned before the final release. The remaining work is documentation polish, sample-folder modernization to reflect the new project layout and workflows, and - only if surfaced during the Beta soak - targeted fixes for critical bugs or regressions.

Final 8.0.0 release is planned for May 7, 2026, contingent on a stable, regression-free Beta cycle.

This release focuses on:

  • NCollection size_t API migration #1212: Size() now returns size_t across maps, sequences, arrays, and lists; Length() retains the legacy int-returning contract - this is the single most impactful migration item in 8.0.0
  • NCollection_LinearVector #1212, #1244: New contiguous flat-buffer dynamic array with Standard::Reallocate-based growth; NCollection_DynamicArray rebuilt on top of it; NCollection_Vector deprecated; NCollection_BasePointerVector removed entirely
  • BRepGraph editor consolidation #1212, #1237: BuilderView retired; EditorView (with a dedicated EditorView_Setters.cxx) becomes the single mutation surface, owning both structural Add/Remove and field-level Mut*() RAII operations with automatic generation propagation
  • Two-tier mesh storage #1212: New BRepGraph_MeshCache and BRepGraph_MeshView separate algorithm-derived caches from persistent (definition) triangulations; freshness keyed on FaceDef.OwnGen
  • Shader-based infinite grid #1223: V3d rectangular and circular grids unified onto a single shader path with infinite extent, background mode, sub-pixel AA, arbitrary gp_Ax3 privileged plane, and matrix-derived pan/rotate compensation - no Graphic3d_Camera API change required
  • Selection through group flipping #1219: New Graphic3d_Flipper brings flip-aware BVH bounds and frustum overlap testing in line with OpenGl_Flipper rendering, fixing missed clicks on AIS_TextLabel/PrsDim_Dimension after camera rotation
  • BVH-accelerated polyhedra interference #924: New IntPatch_PolyhedronBVH (BVH_PrimitiveSet<double, 3> + BVH_LinearBuilder) and IntPatch_BVHTraversal replace pairwise triangle scanning in IntPatch_InterferencePolyhedron::Interference() - O(log n) queries replace linear search
  • Shape Healing robustness #1227, #1247: Replacement-chain leaf resolution, cycle rejection, and DFS in-flight guards eliminate stack overflows and edge multiplication on shapes with shared sub-shapes
  • -Werror enabled in Linux/macOS CI #1209: GitHub Actions configure step now sets -Werror -Wzero-as-null-pointer-constant plus a curated allow-list of -Wno-error=... suppressions, locking in a clean warning baseline
  • Two large Clang-Tidy automated sweeps #1207, #1245: Round 1 focused on emplace_back/empty()/= default; round 2 (clang-tidy 22.1.3) is a codebase-wide sweep applying braces-around-statements, nullptr, override, =default/=delete, and redundant-init removal

What is a Beta Release

A Beta release is a feature-freeze tag on the master branch. All planned 8.0.0 features and APIs are present and stable; the remaining cycle is dedicated to documentation, samples, and regression-only fixes. Unlike Release Candidates - which still admit small targeted features - the Beta gate is intentionally narrow: only critical defects or regressions surfaced during the Beta soak are eligible for cherry-pick before the final release.


What's New in OCCT 8.0.0-beta1

Foundation Classes

NCollection Modernization (Major) #1212

PR #1212 is a single change that touches the entire NCollection layer. Highlights:

  • Size() migration to size_t: Across NCollection_Map, NCollection_DataMap, NCollection_IndexedMap, NCollection_IndexedDataMap, NCollection_Sequence, NCollection_Array1, NCollection_Array2, NCollection_List (and the underlying NCollection_BaseMap/NCollection_BaseSequence/NCollection_BaseList), Size() now returns size_t. The legacy int-returning accessor is preserved as Length(). int overloads of ReSize()/BeginResize()/EndResize() delegate through a shared NbBucketsFromInt() helper with a negative-input guard. The same PR sweeps Size() -> Length() across all call sites in TKG2d, TKG3d, TKMath, TKMesh, TKBO, TKOffset, TKShHealing, TKTopAlgo, TKBRep, TKService, TKV3d, TKOpenGl, TKMeshVS, TKDE*, TKXCAF, TKXSBase, TKLCAF, TKStd, and Draw harness wherever the count fed an int-typed API or progress scope.

  • New NCollection_LinearVector: Contiguous flat-buffer dynamic array. Uses Standard::Reallocate-based growth for trivially copyable types and move-construction for non-trivial types. The header carries a documented iterator-invalidation contract.

  • NCollection_DynamicArray rebuilt: Now a LinearVector<T*> of fixed-size blocks with power-of-two block sizing and precomputed shift/mask for O(1) indexed access. Old block-pointer indirection layer is gone.

  • NCollection_BasePointerVector removed: Superseded by NCollection_LinearVector. No backward-compatibility shim.

  • NCollection_BaseMap::Statistics removed: Unused.

  • NCollection_IncAllocator lock-free fast path: Switched to std::shared_mutex plus CAS bump allocation on an atomic AvailableSize. Exclusive lock is taken only for new-block allocation and free-list reordering - existing block allocations now proceed without contention.

  • NCollection_BaseMap iterator rework: New forward findFirst() helper eliminates negative-bucket arithmetic; iterator state unified under size_t.

  • <cstddef> include added to NCollection_Primes.hxx: Clean-build fix for size_t resolution on platforms that did not implicitly include it.

  • GTest coverage: New NCollection_DynamicArray_Test.cxx and NCollection_LinearVector_Test.cxx covering construction, growth, iterator invalidation, move semantics, and Resize patterns.

Other NCollection Improvements

  • NCollection_LinearVector extended #1244: Added size+value constructor and Resize(size, value) overload. Migrated many std::vector usages across TKMath/TKMesh/TKBO/TKBRep/visualization to NCollection_LinearVector, including BVH array plumbing - removing the conditional STL-vs-OCCT branches that previously cluttered those paths.

  • NCollection_Vector deprecated #1230: All in-tree usages migrated to NCollection_DynamicArray. The class continues to compile under a deprecation warning.

  • NCollection_Array1/Array2 zero-based constructors and size_t resize #1236: New zero-based constructors (allocation + buffer-reuse wrapping). size_t-based Resize() overloads. NCollection_Array1 resize logic refactored into a shared implementation. Dedicated GTest coverage included.

Foundation Improvements

  • Robust unit-conversion error handling #1201: Units_Measurement and Units::Convert() now print the name of the unknown unit when conversion fails. Units::Convert() no longer crashes when the first unit is unknown. UnitsAPI documentation strings corrected (non-existent unit type "millimeter" replaced with "mm").

  • Standard_DEPRECATED_STD macro #1241: New macro in Standard_Macro.hxx expanding to standard [[deprecated("...")]] (or empty under OCCT_NO_DEPRECATED). Used by GCE2d_* alias headers; restores compiler compatibility while preserving deprecation warnings.

Modeling Data

BRepGraph - Editor Consolidation and Mesh Cache (Major)

The same PR #1212 rewrites the BRepGraph mutation surface:

  • EditorView replaces BuilderView #1212: The BuilderView API is removed (BRepGraph_BuilderView.cxx/.hxx deleted). EditorView (BRepGraph_EditorView.cxx/.hxx, plus BRepGraph_EditorView_Mut.cxx) becomes the single programmatic mutation surface, owning both struct...
Read more

V8_0_0_rc5

06 Apr 11:42

Choose a tag to compare

V8_0_0_rc5 Pre-release
Pre-release

Open Cascade is delighted to announce the release of Open CASCADE Technology version 8.0.0 Release Candidate 5 to the public.

Overview

Version 8.0.0-rc5 is a candidate release incorporating 64 improvements and bug fixes compared to version 8.0.0-rc4, bringing the total improvements since version 7.9.0 to over 460 changes.

This release focuses on:

  • Gordon surface construction: New GeomFill_Gordon / GeomFill_GordonBuilder classes implementing transfinite interpolation from N x M curve networks via the Boolean sum formula, generalizing GeomFill_Coons (4-boundary patch) to arbitrary curve grids with automatic intersection detection, reparametrization, and parallel processing support
  • BRepGraph -- graph-based BRep representation: New foundation for topology representation as incidence tables (BRepGraph public API + BRepGraphInc internal structure), with bidirectional traversal, typed node IDs, extensible Layer/Cache system, deduplication, history tracking, mutation guards, and roundtrip conversion to/from TopoDS_Shape
  • Modern differential properties packages: New Geom2dProp, GeomProp, and BRepProp packages replace the legacy macro-based LProp/.gxx pattern with C++17 std::variant-dispatched evaluators, result structs instead of exceptions, derivative caching, and per-geometry optimizations
  • Geometry-aware bounding boxes: New GeomBndLib package with per-type evaluators for all Geom curve/surface types, std::variant-based dispatch, analytical solutions for conics/quadrics, and PSO+Powell optimization for tight BoxOptimal results; BndLib delegated to GeomBndLib internally
  • New evaluation and extrema packages: GeomEval/Geom2dEval evaluation-focused geometry classes (Bezier surfaces, helicoids, spirals, ellipsoids), ExtremaPC point-to-curve extrema with per-geometry std::variant dispatch and grid evaluation
  • API modernization: Return-by-value handle APIs with deprecated out-parameter overloads, removed TColGeom/TColGeom2d packages, harmonized GC/gce maker APIs, new string operators, configurable GeomHash tolerances
  • Thread-safety and performance: Data race fixes in BRepCheck_* and Foundation globals, TopExp_Explorer stack refactored to NCollection_LocalArray, BSpline span location optimization, transformed surface caching, memory management improvements in Boolean operations

What is a Release Candidate

A Release Candidate is a tag on the master branch that has completed all test rounds and is stable to use. Release candidates progress in parallel with maintenance releases, with the difference that maintenance releases remain binary compatible with minor releases and cannot include most improvements. The cycle for a release candidate is planned to be 5-10 weeks, while maintenance releases occur once per quarter.


What's New in OCCT 8.0.0-rc5

Foundation Classes

Collection Improvements

  • NCollection_FlatMap/FlatDataMap optimizations #1103, #1108: Internal optimizations for Robin Hood hash maps -- aligned lookup paths, improved probe sequence handling, updated usage notes

  • NCollection_ForwardRange #1166: New lightweight forward-range adapter providing begin()/end() iteration over non-owning index spans, enabling range-based for loops over graph node collections

  • NCollection_DynamicArray extensions #1167: New InsertBefore()/InsertAfter() helpers with element shift semantics

  • NCollection_LocalArray for non-trivial types #1181: Extended to support elements with constructors/destructors using placement-new and explicit destruction, enabling use as a stack for non-POD types

  • NCollection_KDTree extensions #1167: New callback-based range query API for custom filtering during spatial searches

  • Container usage optimizations #1102: Hot-path optimizations in TKBO/TKOffset/TKOpenGl -- BOPTools_Set storage switched from NCollection_List to NCollection_Vector, reduced redundant lookups/copies in BOPAlgo_Builder, replaced std::map/std::set with NCollection_DataMap/NCollection_Map in ray-tracing state

String Enhancements

  • New string operators #1188: Added AssignCat(int/double) and Cat(int/double) overloads to TCollection_ExtendedString (plus operator+=/operator+). Added AssignCat(TCollection_ExtendedString, replaceNonAscii) and wide-char (wchar_t*) append/concat helpers to TCollection_AsciiString

Math and Solver Enhancements

  • Modern Math API alignment* #1134: Aligned modern MathRoot/MathSys/MathLin APIs with legacy math_* behavior for consistent results

  • math_FunctionRoot constructor safety #1121: Guarded Sol.NbIterations() calls with if (Done) check, preventing StdFail_NotDone exception during construction when root is not found

PointSetLib Package

  • New PointSetLib package #1140: Standalone point cloud analysis in TKMath without GProp_GProps inheritance:
    • PointSetLib_Props: Weighted point set properties (mass, barycentre, inertia matrix via Huygens theorem)
    • PointSetLib_Equation: PCA-based dimensionality analysis (point/line/plane/space detection) with principal axes and extents
    • Deprecates GProp_PGProps, GProp_PEquation, GProp_CelGProps, GProp_SelGProps, GProp_VelGProps
    • Removed GProp_EquaType enum (zero consumers)

Thread Safety

  • Fix thread-safety data races #1180: Refactored BRepCheck_* result classes to use always-present mutex with parallel-mode guard. Made Foundation-level globals thread-safe via std::atomic, added mutex-based protection for lazy initialization, introduced std::call_once for Windows host initialization. Converted several TKBool global mutable statics to thread_local

Modeling Data

BRepGraph -- Graph-Based BRep Representation

  • New BRepGraph foundation #1166: A graph-based representation of topology and BRep geometry as an alternative to the TopoDS_Shape linked data structure. The foundation provides two levels:

    • BRepGraph (public): Graph representation with typed BRepGraph_NodeId identifiers, multiple View classes (TopoView, RefsView, CacheView, BuilderView), bidirectional parent/child exploration (BRepGraph_ChildExplorer, BRepGraph_ParentExplorer, BRepGraph_WireExplorer), definition and reference iterators (BRepGraph_DefsIterator, BRepGraph_RefsIterator), extensible Layer/Cache system, mutation guards (BRepGraph_MutGuard), history tracking (BRepGraph_History), deduplication (BRepGraph_Deduplicate), compaction (BRepGraph_Compact), deep copy (BRepGraph_Copy), and validation (BRepGraph_Validate)
    • BRepGraphInc (internal): Incidence table storage with BRepGraphInc_Populate (TopoDS_Shape -> BRepGraph) and BRepGraphInc_Reconstruct (BRepGraph -> TopoDS_Shape) roundtrip conversion
    • BRepGraph_Tool: Centralized geometry access API (analogue of BRep_Tool) for extracting curves, surfaces, locations, tolerances, and flags from graph nodes
    • BRepGraph_Builder: Programmatic graph construction without requiring an input TopoDS_Shape
    • 49,000+ lines of new code with comprehensive GTest coverage (20+ test files covering build, explore, copy, deduplicate, history, events, geometry, polygons, transforms, validation, version stamps, views)
  • BRepGraph iterators, ref caching, mutation APIs, and layer events #1190: Extensions to the BRepGraph foundation:

    • New iterators: BRepGraph_RelatedIterator (navigate related entities), BRepGraph_CacheKindIterator (iterate cache by entity kind), BRepGraph_LayerIterator (iterate registered layers)
    • BRepGraph_RefTransientCache: Cache for transient data associated with refs
    • Builder::AppendFull: Full node append with all properties
    • BuilderView::RemoveRef with orphan pruning
    • Mutation APIs: SetCoEdgePCurve, ClearFaceMesh, ClearEdgePolygon3D, ValidateMutationBoundary
    • Layer event propagation: ref-modification events through LayerRegistry (deferred/immediate modes)
    • CreateAutoProduct option in BRepGraphInc_Populate::Options
    • Renamed CoEdgeDef::Sense to Orientation, FreeChildRefIds to AuxChildRefIds

Geometry Evaluation Classes

  • New Eval geometry classes #1104: Evaluation-focused geometry classes extending the Geom/Geom2d hierarchies:
    • 2D: Geom2dEval_TBezierCurve, Geom2dEval_AHTBezierCurve, Geom2dEval_SineWaveCurve, Geom2dEval_ArchimedeanSpiralCurve, Geom2dEval_LogarithmicSpiralCurve, Geom2dEval_CircleInvoluteCurve
    • 3D curves: GeomEval_TBezierCurve, GeomEval_AHTBezierCurve, GeomEval_SineWaveCurve, GeomEval_CircularHelixCurve
    • 3D surfaces: GeomEval_TBezierSurface, `GeomEval_AHTBezierSur...
Read more

V8_0_0_rc4

16 Feb 17:10
e72d772

Choose a tag to compare

V8_0_0_rc4 Pre-release
Pre-release

Open CASCADE Technology Version 8.0.0 Release Candidate 4

Open Cascade is delighted to announce the release of Open CASCADE Technology version 8.0.0 Release Candidate 4 to the public.

Overview

Version 8.0.0-rc4 is a candidate release incorporating 111 improvements and bug fixes compared to version 8.0.0-rc3, bringing the total improvements since version 7.9.0 to over 400 changes.

This release focuses on:

  • Redesigned geometry evaluation architecture: New EvalD* API with POD result structs replaces old virtual D0/D1/D2/D3 methods, elementary geometry evaluation devirtualized via std::variant dispatch, new EvalRep descriptor system decouples geometry identity from evaluation strategy, all 29 leaf Geom/Geom2d classes marked final
  • Elimination of heap indirection in core geometry classes: BSpline/Bezier classes use direct value-member arrays instead of handle-wrapped heap storage, always-populated weights via static unit-weights buffer eliminates pervasive null-check patterns across ~100 call sites
  • Topological data structure overhaul: TopoDS_TShape hierarchy replaces linked-list child storage with contiguous arrays, bit-packs shape state into uint16_t, devirtualizes ShapeType(), and introduces index-based iteration
  • Modern C++ foundation layer: Standard_Failure inherits from std::exception, error handlers use thread_local storage eliminating global mutex contention, reference counting uses optimized memory ordering, mesh plugin system replaced with registry-based factory
  • New high-performance collections: Robin Hood hash maps (NCollection_FlatDataMap/FlatMap), insertion-order-preserving maps (NCollection_OrderedMap/OrderedDataMap), header-only KD-Tree for spatial queries, C++17 structured binding support via Items() views, unified map API with Contained/TryEmplace/TryBind
  • Numerical solver improvements: Laguerre polynomial root-finder, coordinate-wise Brent polishing for PSO/DE improving precision by 4+ orders of magnitude, batch 2D curve evaluation, BSplCLib interpolation hot-path optimizations
  • Comprehensive automated migration toolkit: 12-phase Python script suite in adm/scripts/migration_800/ for migrating external projects to 8.0.0 APIs

What is a Release Candidate

A Release Candidate is a tag on the master branch that has completed all test rounds and is stable to use. Release candidates progress in parallel with maintenance releases, with the difference that maintenance releases remain binary compatible with minor releases and cannot include most improvements. The cycle for a release candidate is planned to be 5-10 weeks, while maintenance releases occur once per quarter.


What's New in OCCT 8.0.0-rc4

Foundation Classes

High-Performance Collections

  • New NCollection_FlatDataMap and NCollection_FlatMap #1015: Cache-friendly open-addressing hash containers with Robin Hood hashing:

    • All key-value pairs stored inline in contiguous array (eliminates per-element heap allocations)
    • Robin Hood hashing reduces probe sequence variance for more predictable performance
    • Power-of-2 sizing for fast modulo operations via bitwise AND
    • Cached hash codes for faster collision handling and rehashing
    • Also in this PR: optimized Standard_Transient reference counting with explicit memory ordering (following std::shared_ptr pattern), deprecated Standard_Mutex in favor of std::mutex
  • New NCollection_KDTree #1073: Header-only static balanced KD-Tree for efficient spatial point queries:

    • Nearest-neighbor search in O(log N), k-nearest, range (sphere), box (AABB), and sphere containment queries
    • Works with gp_Pnt, gp_Pnt2d, gp_XYZ, gp_XY out-of-the-box
    • Optional per-point radii via compile-time template parameter
    • Weighted nearest queries support
  • New NCollection_OrderedMap and NCollection_OrderedDataMap #1072: Insertion-order-preserving hash containers using intrusive doubly-linked list:

    • O(1) hash lookup, O(1) append/remove
    • Deterministic iteration in insertion order
    • O(1) removal (unlike NCollection_IndexedMap which requires O(n) swap-and-shrink)
  • Try and Emplace methods for NCollection maps* #1022: Non-throwing lookup operations and in-place construction:

    if (auto* pValue = aMap.TryBind(key, defaultValue)) { /* use pValue */ }
    aMap.Emplace(key, constructorArgs...);  // No copy/move!
  • Emplace methods for NCollection containers #1035: In-place construction support for NCollection_List (EmplaceAppend, EmplacePrepend, EmplaceBefore, EmplaceAfter), NCollection_Sequence, NCollection_DynamicArray, NCollection_Array1, and NCollection_Array2

  • Items() views with C++17 structured bindings #1038: Key-value pair iteration for NCollection map classes:

    for (auto [aKey, aValue] : aMap.Items()) { ... }

    Added Items() for DataMap, FlatDataMap, IndexedDataMap and IndexedItems() for IndexedMap and IndexedDataMap

  • NCollection_List optimization #1040: std::initializer_list constructor, improved const-correctness, optimized move constructor, Exchange() method

  • Unified map API and collection performance optimizations #1065: API unification and performance improvements across NCollection:

    • Unified map API: Contained() added to all map types returning std::optional<std::reference_wrapper<T>>, TryEmplace/TryBind parity across all map types
    • NCollection_UBTree/EBTree: iterative stack-based traversal replacing recursion (prevents stack overflow on deep trees), move semantics
    • NCollection_LocalArray: move semantics, Reallocate() for use as growable stack
    • NCollection_CellFilter: proper move semantics replacing destructive-copy hack
    • Removed dead Sun WorkShop/Borland compiler workarounds
  • TColStd_PackedMapOfInteger refactoring #1023: Improved implementation of specialized integer set

  • Keep deprecated NCollection aliases #1026: Deprecated package type aliases (TColStd_*, TopTools_*) kept for backward compatibility with deprecation warnings

Exception Handling Revolution

  • Standard_Failure inherits from std::exception #984: Bridges OCCT's exception system with standard C++:

    • OCCT exceptions now caught by standard catch (const std::exception&) blocks
    • Internal storage switched from occ::handle to std::shared_ptr
    • New what() method implements std::exception interface
    • New ExceptionType() virtual method for exception class identification
    • Exception classes simplified to pure data containers
    • Removed Raise(), Instance(), Throw() static methods - use throw instead
  • Thread-local error handler stack #980: Replaced global mutex-protected stack with thread_local storage:

    • Zero lock overhead - no mutex acquisition for error handler operations
    • Perfect scalability - threads never contend on error handler state
    • Especially beneficial in TBB/OpenMP parallelized algorithms
    • Removed: Catches(), LastCaughtError() methods
    • Updated OCC_CATCH_SIGNALS macro with new Raise() re-throw method
  • Use throw instead of legacy Standard_Failure::Raise #983: Migrated codebase to modern C++ exception throwing

Math and Solver Enhancements

  • Cache-friendly matrix multiplication #1015: Changed math_Matrix::Multiply() from i-j-k to i-k-j loop order for row-major storage with significant speedup for large matrices

  • SIMD-friendly vector norm #1015: 4-way loop unrolling for math_VectorBase::Norm()/Norm2() with pairwise partial sum combination

  • Optimized atomic reference counting #1015: Standard_Transient uses explicit memory ordering (memory_order_relaxed for increment, memory_order_release for decrement with acquire fence only at zero)

  • Laguerre polynomial solver and Newton API refactoring #1086: New MathPoly_Laguerre for general polynomial root finding with Laguerre + deflation, including Quintic/Sextic/Octic helpers. Refactored specialized Newton solvers (2D/3D/4D) to unified fixed-size API

  • Coordinate-wise polishing for PSO and DE solvers #1088: Brent-based coordinate-wise polishing phase improving component-level precision from ~1e-4 to 1e-8+ for separable functions. New BrentAlongCoordinate in MathUtils_LineSearch, new MathUtils_Random utility

  • PLib polynomial evaluation optimization #953

  • MathRoot and MathSys enhancements #954: New mathematical utilities

  • **math_DirectPolynomialRoots refactorin...

Read more

V8_0_0_rc3

15 Dec 17:15

Choose a tag to compare

V8_0_0_rc3 Pre-release
Pre-release

Open CASCADE Technology Version 8.0.0 Release Candidate 3

Open Cascade is delighted to announce the release of Open CASCADE Technology version 8.0.0 Release Candidate 3 to the public.

Overview

Version 8.0.0-rc3 is a candidate release incorporating 157 improvements and bug fixes compared to version 8.0.0-rc2, bringing the total improvements since version 7.9.0 to over 290 changes.

This release focuses on:

  • Modernization of math functions with migration to C++ standard library
  • Threading improvements with migration from Standard_Mutex to std::mutex
  • Performance optimizations across Foundation Classes, especially BSpline computations
  • API improvements with constexpr/noexcept annotations throughout the codebase
  • Data Exchange enhancements including stream support and STEP metadata export

What is a Release Candidate

A Release Candidate is a tag on the master branch that has completed all test rounds and is stable to use. Release candidates progress in parallel with maintenance releases, with the difference that maintenance releases remain binary compatible with minor releases and cannot include most improvements. The cycle for a release candidate is planned to be 5-10 weeks, while maintenance releases occur once per quarter.


What's New in OCCT 8.0.0-rc3

Foundation Classes

Math Functions Modernization

  • Deprecated math global functions in favor of std equivalents #833: The following functions are now deprecated and will be removed in future releases:
    • ACos(), ASin(), ATan(), ATan2() → use std::acos, std::asin, std::atan, std::atan2
    • Sinh(), Cosh(), Tanh() → use std::sinh, std::cosh, std::tanh
    • ASinh(), ACosh(), ATanh() → use std::asinh, std::acosh, std::atanh
    • Sqrt(), Log(), Log10(), Exp() → use std::sqrt, std::log, std::log10, std::exp
    • Pow(), Abs(), Sign() → use std::pow, std::abs, std::copysign
    • Sin(), Cos(), Tan() → use std::sin, std::cos, std::tan
    • Floor(), Ceiling(), Round() → use std::floor, std::ceil, std::round
    • IntegerPart() → use std::trunc
    • Min(), Max() → use std::min, std::max
    • NextAfter() → use std::nextafter

Threading Modernization

  • Replaced Standard_Mutex with std::mutex #766: Migrated from legacy mutex implementation to standard C++ mutexes across all modules:
    • Use std::lock_guard or std::unique_lock instead of Standard_Mutex::Sentry
    • Use std::mutex instead of Standard_Mutex
    • Optional mutex holders now use std::unique_ptr<std::mutex>

Geometric Primitives (gp)

  • Added standard direction enumerations #803: New gp_Dir::D and gp_Dir2d::D enums for standard directions (X, Y, Z, NX, NY, NZ)
  • Enhanced constructors with constexpr/noexcept #798, #796, #790: Geometric primitives (circles, cones, cylinders, axes) now have constexpr constructors

Strings

  • Added EmptyString() methods #788: New TCollection_AsciiString::EmptyString() and TCollection_ExtendedString::EmptyString() for efficient empty string access
  • Optimized TCollection_AsciiString #752: Pre-defined string optimization for better performance

Math Containers

  • Move semantics for math_Matrix and math_Vector #841: Added move constructors and move assignment operators for efficient container transfers

BSpline Optimizations

  • Optimized BSpline cache #906, #897: Improved BSpline data containers with constexpr and validation, optimized local calls
  • Enhanced B-Spline curve computation #855: Performance improvements for curve calculations

Other Foundation Improvements

  • Optimized Bnd package #839, #856: Bounding box optimizations and fixes
  • Modernized Bnd_B2 and Bnd_B3 #838: Template-based implementation
  • Enhanced BVH implementation #842, #858: Generic vector types and transformation tests
  • Performance improvements for TopExp package #831
  • Optimized Quantity package #834
  • Improved NCollection vector constructors #835
  • Modernized NCollection_SparseArrayBase #804
  • EigenValuesSearcher improvements #714
  • Refactored CSLib package with GTests #857
  • Refactored Extrema package #869
  • Compile-time sqrt constants #789
  • Precomputed Jacobi coefficients #778
  • Constexpr Pascal allocator for PLib::Bin #777
  • Added precision-related methods in Precision.hxx #811
  • Angle normalization refactor for ElSLib/ElCLib #813

Modeling Data

  • New GeomHash and Geom2dHash packages #845: Hash functions for geometric curves and surfaces enabling efficient comparison and caching

Modeling Algorithms

  • Enhanced periodic curve handling in ChFi3d_Builder #892
  • Improved parameter validation logic in BSplineCache #829

Shape Healing

  • Optimized PCurve projection #890
  • Optimized FixFaceOrientation #584

Data Exchange

Stream Support

  • Implemented stream support for DE_Wrapper #663: Stream-based read/write methods for STEP, STL, VRML, and other formats with validation utilities

STEP Improvements

  • STEP General Attributes export #634: Export string metadata as STEP property_definition entities
  • STEP coordinate system connection points import #779
  • std::string_view for STEP type names #784: Performance improvement using std::string_view for type recognition
  • Refactored StepType selection #786
  • Custom hasher for string_view types in RWStepAP214 #888

Plugin System

  • Reorganized DE plugin system #696: New Register/UnRegister methods for configuration nodes, DE_MultiPluginHolder for multiple registrations

Visualization

  • Improved detection of full cylinder/cone parameters #830
  • Fixed AABB transformation method #735

Build and Configuration

  • Fixed C++ standard options and NOMINMAX scope #907
  • Modernized compiler flags for C++17 #867
  • Updated macOS compiler flags and includes #884
  • Updated VCPKG version #878
  • Validated configuration on CMake 3.10+ #762
  • C++17 version macro #785
  • Updated .gitignore with explicit allowlist #787

Testing

Read more

V7_9_3

06 Dec 10:33

Choose a tag to compare

Open CASCADE Technology 7.9.3 Released

Open Cascade is delighted to announce the release of Open CASCADE Technology version 7.9.3 to the public.

Overview

Version 7.9.3 is a maintenance release incorporating over 15 improvements and bug fixes compared to version 7.9.2.

What's New in OCCT 7.9.3

Modeling

  • Fix memory consumption in BOPAlgo_PaveFiller_6.cxx (#864)
  • Fix BRepBuilderAPI_GTransform face stretch crash (#875)
  • Fix Boolean fuse segfaults on loft (#860)
  • Fix BRepFilletAPI_MakeFillet::Add hangs on adding edge (#859)
  • Fix crash in BRepFilletAPI_MakeChamfer (#743)
  • Fix crash in BRepOffsetAPI_MakePipeShell (#740)
  • Fix segfault on chamfer or fillet approaching ellipse (#738)
  • Fix ShapeUpgrade_UnifySameDomain crash (#876)

Shape Healing

  • Optimize FixFaceOrientation (#584)

Visualization

  • Improve detection of full cylinder/cone parameters (#830)

Data Exchange

  • Fix hang in STEPCAFControl_Reader (#733)

Application Framework

  • Early-return null NamedShape when TNaming_UsedShapes is missing (#760)

Full Changelog: V7_9_2...V7_9_3

V7_9_2

18 Oct 14:20

Choose a tag to compare

Open CASCADE Technology 7.9.2 Released

Open Cascade is delighted to announce the release of Open CASCADE Technology version 7.9.2 to the public.

Overview

Version 7.9.2 is a maintenance release incorporating over 25 improvements and bug fixes compared to version 7.9.1.

What's New in OCCT 7.9.2

Configuration & Build System

  • VCPKG add TclTk support (#580)
  • Remove jemalloc port files (#581)
  • Update C++ standard to C++17
  • Fix ARCH for older 32-bit macs (#626)
  • Fixed issue with CSF variable overwriting (#561)

Testing & Quality

  • Update samples C++ version (#606)
  • Remove marking warnings as errors in CI builds

Foundation Classes

  • Leak of WinAPI resources (#625)
  • Matrix multiplied issue (#522)

Modeling

  • Fix array indexing bug in IntAna_IntQuadQuad::NextCurve method (#703)
  • CornerMax incorrect realisation in Bnd_Box (#664)
  • Fix null surface crash in fixshape (#623)
  • Fix null surface crash in UnifySameDomain (#624)
  • GeomFill_CorrectedFrenet hangs in some cases (#630)
  • Mismatch between projected point and parameter in ShapeAnalysis_Curve (#600)
  • Infinite loop when Simplifying Fuse operation, CPU to 100% (#557)

Shape Healing

  • Revolved shape in STEP file is imported inverted (#699)

Visualization

  • Do not write comment into binary PPM image (Image_AlienPixMap)

Data Exchange

  • Crash on empty list in STEP (#671)
  • Facets with empty normals like 'f 1// 2// 3//' in RWObj_Reader (#520)
  • Fix indices during parsing of arrays in GLTF Reader (#602)
  • Preserving control directives in Step Export (#601)
  • Optimize entity graph evaluating (#562)

Draw

  • Fix message color mixing (#685)
  • Misprint in vcomputehlr command leading to error if no Viewer (#526)

Coding

  • Reducing relying on exceptions (#676)

Full Changelog: V7_9_1...V7_9_2

V8_0_0_rc2

29 Jul 16:02

Choose a tag to compare

V8_0_0_rc2 Pre-release
Pre-release

Open CASCADE Technology Version 8.0.0 Release Candidate 2

Open Cascade is delighted to announce the release of Open CASCADE Technology version 8.0.0 Release Candidate 2 to the public.

(Release Candidate 1: https://github.com/Open-Cascade-SAS/OCCT/releases/tag/V8_0_0_rc1)

Overview

Version V8_0_0_rc2 is a candidate release incorporating over 80 improvements and bug fixes compared to version V8_0_0_rc1, bringing the total improvements since version 7.9.0 to over 130 changes.

What is a Release Candidate

A Release Candidate is a tag on the master branch that has completed all test rounds and is stable to use.
Release candidates progress in parallel with maintenance releases, with the difference that maintenance releases remain binary compatible with minor releases and cannot include most improvements.
The cycle for a release candidate is planned to be 5-10 weeks, while maintenance releases occur once per quarter.

What's New in OCCT 8.0.0-rc2

Core

  • Upgraded minimum C++ version requirement to C++17 #537
  • Geometric Classes Optimization: Significantly optimized gp_Vec, gp_Vec2d, gp_XY, and gp_XYZ classes by simplifying mathematical computations, replacing indirect API calls with direct data member access in performance-critical sections, and improving matrix operations including inversion, transposition, and power calculations #578
  • Reworked atomic and Standard_Condition implementation #598
  • Optimized NCollection_Array1 with type-specific improvements #608
  • Reworked math_DoubleTab to use NCollection container #607
  • Fixed WinAPI resource leaks #625
  • Fixed include brackets type issues #635
  • Geom package copy optimization #645

Build System and Configuration

  • Comprehensive VCPKG Support: Added full VCPKG layout configuration with CMake file placement in share/ directory for compliance, introduced OCCT_PROJECT_NAME parameter for customizing directory structure, and updated environment scripts while maintaining backward compatibility #618, #637, #638
  • Added VCPKG port opencascade with TclTk and GTest support #580, #616
  • Implemented flexible project root configuration #641
  • Fixed build config file validation issues #647
  • Disabled GLTF build without RapidJSON #646
  • Fixed link errors on macOS when not building using vcpkg #609
  • Fixed CSF variable overwriting issues #561
  • Fixed paths to 3rd-party in cmake configuration #523
  • Fixed ARCH detection for older 32-bit Macs #626
  • Removed unused CMake scripts and dependencies #644, #581
  • Fixed samples CMake configuration #643

Modeling

  • New Helix Toolkit: Implemented a complete TKHelix toolkit with geometric helix curve adaptor and topological builders, featuring advanced B-spline approximation algorithms for high-quality helix representation and comprehensive TCL command interface #648
  • Added option to not build history in BRepFill_PipeShell #632
  • Fixed GeomFill_CorrectedFrenet hanging in some cases #630
  • Fixed infinite loop in Simplifying Fuse operation #557
  • Fixed Bnd_BoundSortBox::Compare failures in some cases #518
  • General Fuse Optimization: Improved BOPAlgo_PaveFiller performance by adding null checks for triangulation in BRep_Tool::IsClosed, simplifying index lookup logic in BOPDS_DS, and introducing helper functions for better clarity and robustness #514
  • Fixed BRepFilletAPI_MakeFiller segfault with two curves and rim #532
  • Fixed mismatch between projected point and parameter in ShapeAnalysis_Curve #600

Shape Healing

  • Implemented reusing Surface Analysis for Wire fixing #565

Visualization

  • Enhanced FFmpeg Compatibility Layer and updated Video Recorder #582
  • Fixed binary PPM image comment writing in Image_AlienPixMap #413c08272b
  • Updated Graphic3d_Aspects::PolygonOffsets documentation #519
  • Marked Immediate Mode rendering methods as deprecated in AIS_InteractiveContext #521

Data Exchange

  • Fixed GLTF indices parsing during array processing #602
  • Implemented non-uniform scaling in GLTF Import #503
  • Fixed GLTF saving edges when Merge Faces is enabled #554
  • Changed GLTF export line type to LINE_STRIP #535
  • Fixed missing GDT values in STP Import #617
  • Preserved control directives in Step Export #601
  • Ignored unit factors during tessellation export #577
  • Applied scaling transformation in Step Export #513
  • Fixed missing Model Curves in IGES Export transfer cache #483
  • Fixed XCAFDoc_Editor::RescaleGeometry not rescaling translation of roots reference #529
  • Fixed facets with empty normals handling in RWObj_Reader #520
  • Added conversion utilities for STEP geometrical and visual enumerations #545
  • Added missing headers #530
  • Optimized StepData_StepReaderData #543
  • Optimized entity graph evaluating #562
  • Removed GLTF files from XDEDRAW #649
  • Removed unused dependencies from TKXDEDRAW #650

Testing

  • Updated GitHub Actions to use latest versions #640
  • Added performance summary posting to PR #612
  • Fixed master validation workflow #611
  • Added daily vcpkg package validation #605
  • Updated samples C++ version #606
  • Removed extra GitHub jobs #594
  • Added ASCII code validation #593
  • Migrated PR actions to VCPKG-based #587
  • Added compilation on Clang without PCH #540
  • Enabled IR integration concurrency #531, #536

Draw and Tools

  • Fixed vcomputehlr misprint leading to error if no Viewer #526
  • Updated DrawDefault script to handle missing directory cases #542

Documentation

  • Added missing description to HLRBRep_HLRToShape methods #525
  • Added Copilot instructions for OCCT development #589

How to Upgrade

There are no critical breaking changes at the API level, however note the following:

  • C++17 Requirement: The minimum C++ version has been upgraded to C++17. Ensure your compiler supports this standard.
  • Deprecated Methods: Some Immediate Mode rendering methods in AIS_InteractiveContext have been marked as deprecated.

Migration should proceed smoothly for most applications.

Performance Improvements

This release includes several significant performance optimizations:

  • Geometric Classes: Major performance improvements in gp_Vec, gp_Vec2d, gp_XY, and gp_XYZ classes through direct data access and simplified computations
  • Boolean Operations: General Fuse algorithm opt...
Read more