Open CASCADE Technology 8.0.0 Release #1275
Replies: 2 comments
-
|
A small note from my side: this release took us 13.5 months instead of the 11 we originally planned. 7.9.0 went out at the end of February, and 8.0.0 is landing now. The extra month was not free, but I hope it shows in the product. More time on the RC cycle meant more bugs caught before tagging, and more room to land things like the BRepGraph foundation, the evaluation rework across Please keep the ideas and issue reports coming. A large share of what made it into 8.0.0 started as a community report or a discussion thread. We are continuing to improving large pieces of the codebase, and that feedback is what tells us which corners are actually load-bearing for real users. Looking ahead, 8.1.0 is shaping up around three main themes:
Thanks again to everyone who contributed code, filed bugs, tested RCs, or just told us when something felt wrong. See you in 8.1.0. |
Beta Was this translation helpful? Give feedback.
-
|
Congratulation! I am looking forward to trying the new Gordon surfaces. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
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/resourcedirectory. Documentation generation moved from the legacy Tcl harness to CMake. Inspector and ExpToCas were extracted into their own repositories. Thesamples/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, theOCCT_PROJECT_NAMEparameter for directory customization, and the upstreamopencascadeport with TclTk and GTest. VTK 9 is supported, with conditional linkage ofvtkRenderingGL2PSOpenGL2so Android, iOS and GLES builds do not require it. VTK is no longer enabled by default: configurations that depend onTKIVtkand the VTK-based viewer must setUSE_VTK=ONexplicitly.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_Failurenow inherits fromstd::exception. OCCT errors can be caught throughcatch (const std::exception&)orcatch (const Standard_Failure&). The class exposeswhat()andExceptionType(). The static helpersRaise(),Throw()andInstance()are gone; exceptions are raised with the C++throwkeyword.Standard_ErrorHandler::Catches()andLastCaughtError()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_SIGNALSwas updated accordingly.Standard_MutexandTopTools_MutexForShapeProviderwere retired. Code usesstd::mutex,std::lock_guard,std::unique_lockand, where ownership is optional,std::unique_ptr<std::mutex>.Standard_Conditionwas rebuilt on top of standard primitives. Foundation-level globals usestd::atomic. Windows host initialization usesstd::call_once. Several global mutable statics in TKBool were converted tothread_local. Concurrent operations in the BRep checker and several Foundation paths are race-free.Transfer_TransferDeadLoopis 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 matchingstd::functions.Solver and matrix code received broad updates:
MathPoly_Laguerreprovides general polynomial root finding with Laguerre iteration plus deflation, including specialized helpers for quintic, sextic and octic polynomials.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.MathRoot,MathSysandMathLinpackages were aligned with the legacymath_*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()andNorm2()use four-way unrolling with pairwise partial sums.math_Matrixandmath_Vectorare movable.math_Vector::Resize()was added.math_DoubleTabis built onNCollection.math_DirectPolynomialRootswas refactored.math_FunctionRootno longer raisesStdFail_NotDonewhen iteration count is queried after a failed root search.sqrtconstants and a constexpr Pascal allocator forPLib::Binare available. Jacobi coefficients are precomputed.PLib_BaseandPLib_DoubleJacobiPolynomialwere removed.PLib_JacobiPolynomialandPLib_HermitJacobiare value types and their evaluation methods areconst.PLibwas optimized along the hot path.EigenValuesSearcherwas tightened.TKMathwas reorganized: the modernMathRoot,MathSys,MathLin,MathPoly,MathUtilspackages own the new solver, root-finder and utility code, while the legacymath_*headers continue to compile.Collections
Several new containers entered the foundation:
NCollection_FlatMapandNCollection_FlatDataMapare 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_OrderedMapandNCollection_OrderedDataMappreserve insertion order through an intrusive doubly linked list. Lookup, append and removal are O(1).NCollection_KDTreeis 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 withgp_Pnt,gp_Pnt2d,gp_XYZandgp_XY, with optional per-point radii and weighted nearest queries through compile-time template parameters.NCollection_LinearVectoris a contiguous flat-buffer dynamic array. Trivially copyable types grow throughStandard::Reallocate; non-trivial types grow through move construction. Iterator invalidation is documented in the header.NCollection_DynamicArraywas rebuilt on top ofNCollection_LinearVector<T*>with fixed-size blocks, power-of-two block sizing, and a precomputed shift and mask for O(1) indexed access.InsertBefore()andInsertAfter()helpers are available with element-shift semantics.NCollection_ForwardRangeis a lightweight non-owning forward-range adapter. It supports range-basedforover index spans.The whole map family received an API pass:
Contained()is available on every map type and returnsstd::optional<std::reference_wrapper<T>>.TryEmplace()andTryBind()are available on every map type.Items()andIndexedItems()views allowfor (auto [k, v] : map.Items()) { ... }overDataMap,FlatDataMap,IndexedDataMapandIndexedMap.EmplaceAppend,EmplacePrepend,EmplaceBefore,EmplaceAfter) are present onList,Sequence,DynamicArray,Array1andArray2.NCollection_Listhas astd::initializer_listconstructor, anExchange()method, an optimized move constructor and improved const-correctness.NCollection_UBTreeandNCollection_EBTreetraverse iteratively through an explicit stack (the recursive variant could overflow on deep trees) and have move semantics.NCollection_LocalArrayworks with non-trivial types through placement-new and explicit destruction, has move semantics andReallocate(), so it can be used as a growable stack.NCollection_CellFilterhas proper move semantics.NCollection_IncAllocatorfast path is lock-free: astd::shared_mutexplus CAS bump allocation on an atomic available-size means existing-block allocations never contend.NCollection_BaseMapiterators were unified undersize_tthrough afindFirst()helper.Size()returnssize_tonMap,DataMap,IndexedMap,IndexedDataMap,Sequence,Array1,Array2andList.Length()keeps theintcontract for callers that feed sizes intoint-typed APIs.NCollection_Array1andArray2have zero-based constructors andsize_t-basedResize()overloads.Assign()andoperator=now overwrite the destination bounds (matchingstd::vector); the previous element-wise copy with size-mismatch throw is preserved asCopyValues().Standard_Transientreference counting uses explicit memory ordering (relaxed increment, release decrement with an acquire fence at zero).NCollection_SparseArrayBaseno longer carries a vtable: virtual dispatch was replaced with function pointers, fixing the long-standing pure-virtual call that could trigger during destruction.NCollection_BasePointerVectorwas removed.NCollection_Vector,OSD_MAllocHook,QANCollection,PLib_DoubleJacobiPolynomialand theStandard_Mutex-based code paths were removed or deprecated.TColGeom,TColGeom2d,Geom2dLPropandLProp3dtypedef-only packages were retired (aliases are preserved where they used to ship).Strings
TCollection_AsciiStringandTCollection_ExtendedStringgainedEmptyString()accessors,AssignCat/Catoverloads forintanddouble,wchar_t*append/concatenate helpers, andstd::u16string_viewinterop on the extended string. The pre-defined-string fast path is in place. Multi-byte UTF-8 sequences are now correctly handled inUsefullLength().Draw_Interpretor::Append()andoperator<<now havesize_toverloads.Geometric primitives
gp_Vec,gp_Vec2d,gp_XYandgp_XYZuse direct data-member access in performance-critical sections. Matrix inversion, transposition and power are faster.Many geometric primitives became
constexpr/noexcept(circles, cones, cylinders, axes, planes).gp_Plnwas refactored.gp_Dir::Dandgp_Dir2d::Denumerations express the standard X, Y, Z, NX, NY, NZ directions forgp_Dir, and X, Y, NX, NY forgp_Dir2d.Bnd, BVH, Quantity, TopLoc
Bnd_Box::Add,Bnd_Box::IsOut,Bnd_Box::Distance,Bnd_Range::Common,Bnd_Sphere::SquareDistancesand severalBnd_OBBdegenerate cases were fixed. Early-return fast paths were added onIsOut.Contains()andIntersects()wrappers are available.Center(),Min(),Max(),Get()returnstd::optional.Bnd_Range::IsIntersectedreturns the newBnd_Range::IntersectStatusenum instead of a magic integer.Bnd_Box::CornerMaxreturns the correct corner.[[nodiscard]]andnoexceptwere applied where appropriate.Bnd_B2andBnd_B3were rebuilt on a single template implementation.Bnd_BoundSortBox::Compareno longer fails on certain inputs.The BVH layer accepts generic vector types in its boxes and rays.
TopLoc_Location::HashCodeis faster, andTopLoc_Location::Predividedshort-circuits the identity and equal-location cases. TheQuantitypackage andTopExpwere optimized.CSLibandExtremawere refactored, with new GTests added.Other
Precision.hxxexposes additional precision-related methods. Angle normalization was reworked inElCLibandElSLib.AdvApp2Varwas modernized.AppCont_ContMatricesis now a private namespace, and an out-of-bounds read forclasse=26was fixed by adding three missing data entries. Unit conversion (Units_Measurement,Units::Convert) prints the offending unit on failure and no longer crashes when the first unit is unknown.Standard_DEPRECATED_STDexpands to standard[[deprecated("...")]](or to nothing underOCCT_NO_DEPRECATED).Host name resolution is self-contained. Linux signal handling is GLIBC-compatible.
MallInfois detected before use. WinAPI resource leaks were fixed.HashUtilsisnoexcepton the hot path.Modeling Data
Geometry evaluation
The evaluation hierarchy across the 32 leaf curve and surface classes in
Geom*andGeom2d*was redesigned.EvalD0,EvalD1,EvalD2,EvalD3andEvalDNare the primary virtual methods. They return POD result structs (Geom_CurveD1/D2/D3,Geom_SurfD1/D2/D3,Geom2d_CurveD1/D2/D3). The originalD0/D1/D2/D3/DNandValue()methods are retained as non-virtual inline wrappers that delegate toEval*. Subclasses that override evaluation must override theEval*entry points.All 29 concrete leaf classes in the
Geom_*andGeom2d_*hierarchies are markedfinal. Code that needs to extend a concrete shape must inherit from the abstract bases (Geom_BoundedCurve,Geom_ElementarySurface, etc.).Adaptor dispatch on the elementary path is devirtualized.
gp_*primitives are stored directly insidestd::variantin adaptors and dispatched by switch and enum intoElCLibandElSLib. Compilers can devirtualize the entire elementary evaluation chain.EvalRepdecouples geometry identity from evaluation strategy. A geometry can carry a side descriptor that is dispatched in place of its native evaluator (Geom_OffsetSurface, for example, can carry an equivalent non-offset surface and bypass the offset evaluation cost). The API supports full, derivative-bounded and parameter-mapped descriptors.GeomEvalandGeom2dEvalhost evaluation-focused implementations of T-Bezier and AHT-Bezier curves and surfaces, sine waves, Archimedean and logarithmic spirals, circle involutes, circular helices, ellipsoids, hyperboloids, paraboloids, hyperbolic paraboloids and circular helicoid surfaces.GeomGridEvalandGeom2dGridEvalprovide batch evaluation for 3D and 2D curves with specialized analytical evaluators for conics and cache-based evaluators for BSpline and Bezier.Adaptor
Beziercache validity checks were removed for single-span Beziers. The grid-eval threshold was tightened so cache-based evaluation is selected more aggressively.Differential properties
Three new packages replace the legacy macro-based
LPropfamily:Geom2dPropfor 2D curve differential properties.GeomPropfor 3D curve and surface differential properties.BRepPropfor BRep edges and faces, includingBRepProp::Continuity.Each package dispatches through
std::variantto per-geometry evaluators (Line, Circle, Ellipse, Hyperbola, Parabola, BezierCurve, BSplineCurve, OffsetCurve, plus the equivalent surface set). Tangent, curvature, normal, centre of curvature, curvature extrema and inflection points come back as result structs withIsDefinedflags rather than exceptions. Surface curvatures are computed from the Weingarten map with the correct sign convention. Per-parameter derivative caching is built in. Construction is direct from geometry handles, bypassing adaptor creation, and class identity is tested throughDynamicType()instead ofIsKind(). Domain structs carry trimmed-geometry bounds. Two-stepInitialize()is gone: the classes are valid after construction.BRepProp_Curvecontinuity mapping coversGeomAbs_G2and higher, matchingGeomProp_Curve.Bounding boxes
GeomBndLibreplaces the monolithic switch-basedBndLibapproach with per-type evaluators dispatched throughstd::variant:GeomBndLib_Curve,GeomBndLib_Curve2dandGeomBndLib_Surfacedispatchers exposeBox()/BoxOptimal()(return-by-value) andAdd()/AddOptimal()(mutate-by-reference) APIs.Line,Circle,Ellipse,Hyperbola,Parabola,Plane,Sphere,Cylinder,ConeandTorus, including tilted tori and revolution and extrusion surfaces with circle-arc bounding at extremal positions.FillBoxwith convex-hull reduction, with pole indices selected throughBSplCLib::Huntso noCopy()orSegment()allocation is needed.BoxOptimalruns PSO followed by per-coordinate Powell minimization for tight bounds.BndLib_Add3dCurve,BndLib_AddSurfaceandBndLib_Add2dCurveare thin wrappers that forward toGeomBndLib. The publicBndLibAPI is unchanged.TopoDS and TShape
TopoDS_TShapecarries its state in a bit-packeduint16_tfield: the shape type lives in the low four bits and the eight boolean flags (Free,Modified,Checked,Orientable,Closed,Infinite,Convex,Locked) live in the next eight, leaving four bits reserved.ShapeType()reads from this field inline rather than dispatching through a virtual call.TopAbs::Compose,ReverseandComplementare inlinenoexceptstatic functions.TopoDS_Iteratorexposesbegin()/end()throughNCollection_ForwardRangeso sub-shapes can be visited with range-basedfor.TopExp_ExplorerusesNCollection_LocalArraywith an explicit top index for its stack.Clear()resets liveTopoDS_Iteratorslots in place frommyStackTopdown to zero, keeping the array allocation, so reuse skips reallocation.BSpline and Bezier
Curve and surface members in
Geom_BSplineCurve,Geom_BSplineSurface,Geom_BezierCurve,Geom_BezierSurface,Geom2d_BSplineCurve,Geom2d_BSplineSurface,Geom2d_BezierCurveandGeom2d_BezierSurfaceare direct value-typedNCollection_Array1/Array2members rather than handle-wrapped heap arrays. Reference counting and heap indirection on the evaluation path are gone.Weights are always populated. Non-rational geometries point at a static unit-weights buffer through a non-owning view, so there is no allocation.
WeightsArray()returns a valid reference unconditionally, eliminating the previous nullableWeights()pattern across roughly a hundred call sites. Copy-out accessors are deprecated in favour of const-reference returning versions; for example,Poles()returns aconst NCollection_Array1<gp_Pnt>&.BSplCLibinterpolation and blend evaluation are faster: the GeomFill convertor matrices are statically initialized, small matrices and arrays live on the stack, hot loops use raw pointers without bounds-check accessor chains, and solver instances andNbPoles()results are cached.Several long-standing bugs were corrected: the
Pole0 < 3typo inHermit.cxx(should have beenPole0 < Pole3),Geom_BSplineCurve::IsEqualskipping knot comparison,Geom_BSplineSurface::SetUNotPeriodicandSetVNotPeriodicinvoking the wrong constructor,Geom_BezierSurface::Increaseself-referencingInit, undefined behaviour inBSplCLib::NbPoles, and span out-of-range access inBSplCLib_Reverse.IsClosed, IsPeriodic, geometry hashing
IsClosed()on curves and surfaces compares againstPrecision::Computational()(close toDBL_EPSILON) instead ofgp::Resolution()(around 1e-290), so the check is actually meaningful. Trimmed curve and surfaceIsClosed()/IsPeriodic()detect integer-period spans throughstd::remainder().GeomHashandGeom2dHashprovide hash functions for geometric curves and surfaces, with configurableCompToleranceandHashTolerancefields and constructors instead of the previous hardcoded1e-12.Adaptors
GeomAdaptor_TransformedCurveis the new base class forBRepAdaptor_Curve. It wraps aGeomAdaptor_CurveorAdaptor3d_CurveOnSurfacetogether with agp_Trsf.GeomAdaptor_TransformedSurfacecaches transformed data, rebuilt on construction,LoadorSetTrsf. Original and transformed surface accessors are exposed; the legacyGeomSurface()accessor is deprecated.GeomAdaptor_SurfaceexposesToleranceU()andToleranceV().EvalD*is the primary virtual evaluation method acrossAdaptor3d_CurveandAdaptor3d_Surfacesubclasses, and 15+ adaptor classes were updated.gceandGCbuilders were hardened: perpendicular-direction fallback branches ingce_MakeConeandgce_MakeCylinderwere corrected, status from delegated builders is propagated inGCE2d_MakeCircleandGC_MakePlane, hardcoded tolerances were replaced withPrecision::Confusion(), near-zero guards were added togce_MakeElipsandgce_MakeHypr, and the over-constraining hyperbola direction check was removed (with collinear-point validation added to the three-point constructor). Documentation acrossGCandgcewas harmonized and trivial wrappers were inlined.Handle-returning APIs
Methods that used to return handles through an output parameter now return them by value across ApplicationFramework, DataExchange, ModelingAlgorithms, ModelingData and Visualization. The old out-parameter signatures are kept as deprecated overloads that route through the new versions, and
[[nodiscard]]was applied where appropriate. Copy-out single-element accessors in theConvertpackage (one pole at a time, one weight at a time) are deprecated in favour of batch const-reference accessors that hand back the underlyingNCollection_Arraydirectly; the package itself replaces handle-based heap storage with direct array members.BRepGraph
BRepGraph is a graph-based representation of topology and BRep geometry, complementary to
TopoDS_Shape. It is split into a public layer (BRepGraph) and an internal incidence-table layer (BRepGraphInc), with roundtrip conversion to and fromTopoDS_Shape.The public API exposes typed identifiers (
BRepGraph_NodeId,BRepGraph_RefId,BRepGraph_RepId), multiple Views (TopoView,RefsView,CacheView,EditorView), bidirectional traversal (ChildExplorer,ParentExplorer,WireExplorer,RefsIterator,ReverseIterator,RelatedIterator,CacheKindIterator,LayerIterator,DefsIterator), an extensible Layer and Cache system with deferred or immediate event propagation throughLayerRegistry, mutation guards (MutGuard), history tracking (History), deduplication (Deduplicate), compaction (Compact), deep copy and validation.BRepGraph_Toolis the centralized geometry access API for curves, surfaces, locations, tolerances and flags, analogous toBRep_Tool.EditorViewis the single programmatic mutation surface. It owns both structural creation (Add*,Remove*) and field-level RAII-scoped mutation (Mut*()) with automaticOwnGenandSubtreeGenpropagation. Programmatic graph construction is done throughBRepGraph_Builder::Add(), withBRepGraph::Clear()as the canonical rebuild boundary. Product and occurrence editing is inEditor().Occurrences()(CreateEmptyProduct,LinkProducts).References use a typed
RefIdmodel (inline refs were removed), with anOccurrenceReftype. Node, ref and rep identifiers are 32-bit unsigned integers; history indices aresize_t. Roots are accessed throughRootProductIds(), which returns product roots only. Layers cover parameters (BRepGraph_LayerParam) and regularity (BRepGraph_LayerRegularity). Mesh storage is two-tier:BRepGraph_MeshCachefor algorithm-derived caches,BRepGraph_MeshViewfor persistent definition triangulations, with cache freshness keyed onFaceDef.OwnGen. Cache writes do not mutate the model.The package ships with a comprehensive GTest suite covering build, explore, copy, deduplicate, history, events, geometry, polygons, transforms, validation, version stamps, views, fuzzing, mutation guards, layer iterators, mesh cache, replace-vertex, scenario matrix, typed-id dispatch and the wire explorer.
Modeling Algorithms
New constructions
GeomFill_GordonandGeomFill_GordonBuilderimplement transfinite interpolation from N x M curve networks through the Boolean sum formulaS = S_profiles + S_guides - S_tensor, generalizingGeomFill_Coonsto arbitrary curve grids.GeomFill_GordonBuilderis a low-level kernel that accepts pre-compatible BSpline curves with known intersection parameters; it builds three intermediate surfaces (skin profiles, skin guides, tensor product) and then computes the Boolean sum, with C2-continuous periodic interpolation for closed networks.GeomFill_Gordonis the high-level wrapper: it accepts arbitraryGeom_Curveinputs, detects intersections automatically, sorts and orients the network, reparametrizes through a constrained least-squares B-spline approximation with kink preservation, applies scale-relative tolerances, detects closedness and runs in parallel throughOSD_Parallel.Approx_BSplineApproxInterpis the underlying constrained-least-squares solver, which uses a KKT saddle-point system for exact interpolation constraints.TKHelixis a new toolkit. It provides a geometric helix curve adaptor and topological builders, with a B-spline approximation algorithm for high-quality helix representation, plus a TCL command interface.ExtremaPCis a point-to-curve extrema package. It dispatches throughstd::variantto specialized evaluators (ExtremaPC_Line,ExtremaPC_Circle,ExtremaPC_Ellipse,ExtremaPC_Hyperbola,ExtremaPC_BezierCurve,ExtremaPC_BSplineCurve,ExtremaPC_OffsetCurve).ExtremaPC_Curveis the aggregator.ExtremaPC_GridEvaluatorprovides grid-based bracketing andExtremaPC_DistanceFunctionhandles root-finding refinement.TopClass_FaceClassifierandTopClass_Classifier2dwere ported from.gxxgeneric templates to.pxxprivate utilities, withBRepClassandGeom2dHatchupdated as wrappers. The_0.cxxgenerator glue files are gone. Downstream code that included the.gxxfiles directly to instantiate a classifier will need to use theBRepClassorGeom2dHatchentry points.HLRBRepalgorithms replaced rawStandard_Addressparameters with typed pointers, so the public signatures ofHLRAlgo_PolyData,HLRBRep_Algoand the surrounding helpers carry concrete types.HLRAlgo_PolyData::BoxreturnsBnd_Boxrather than the legacy private box type.Performance
IntPatch_PolyhedronBVHwrapsIntPatch_Polyhedronas aBVH_PrimitiveSet<double, 3>built withBVH_LinearBuilder.IntPatch_BVHTraversaldoes dual-tree traversal yielding candidate triangle pairs.IntPatch_InterferencePolyhedron::Interference()is built on top of these and uses O(log n) queries instead of pairwise triangle scans.BSpline span location has a non-periodic fast path in
countSpanSize()based on a next-knot boundary comparison, with span reuse in curve and surface grid loops driven by the cached span end-knot value.BOPAlgo_PaveFilleruses const references where it previously copied fourIndexedMaps inSubShapesOnIn(), with explicit allocator choices. Memory accumulation across stages is reduced.BOPDSwas refactored.IntToolsbox calculation was optimized.Bnd_BoundSortBoxwas tightened.BRepGPropfor solids no longer double-counts shared subshapes with the same placement underSkipShared, and shared solids no longer cause free faces and shells to be dropped. Edge pcurve lookup composes fewerTopLoc_Locationobjects, andBRepGProp_Facecaches the face surface and location.BOPAlgo_Builderperforms fewer redundant lookups and copies, andBOPTools_SetusesNCollection_Vectorstorage. Ray tracing state usesNCollection_DataMapandNCollection_Mapinstead ofstd::mapandstd::set.AIS_ColoredShape::dispatchColorsdefersEmptyCopied()andBRep_Builder::Add()to avoid redundant shape construction; the compound is built only when required.Bug fixes
ChFi3d_Builder::IntersectMoreCornerno longer crashes when topology map lookups fail on shapes from prior boolean or chamfer operations because of staleTShapepointers; failure now producesIsDone() == false.IntAna_QuadQuadGeoadds a near-parallel criterion based on axis deviation across cylinder face height, removing false non-parallel classifications for small-height faces.IntWalk_PWalkinghas a 3D-distance-based closure check that closes intersection lines that return near the starting point.IntCurveSurfaceandHLRBRepintersection share polyhedron code completely.IntAna_IntQuadQuad::NextCurvearray indexing was corrected. Singularity flag mixups, swapped bounds and off-by-one indices in TKGeomAlgo were fixed.TopTrans_SurfaceTransitionis instance-safe (it used static state).Bnd_Box::Addweight output array is fully zero-initialized.BRepFill_PipeShell::MakeSolidno longer crashes:IsSameOriented()iterates over face edges and selects one present in the shell's edge-to-faces map, with aContainsguard beforeFindFromKey().BRepFill_PipeShellnow has an option to skip building history.GeomFill_ConstrainedFillingandGeomFill_CoonsAlgPatchcorrectly useSetFunc()to install law functions and pass the right parameter intoCoonsAlgPatch::Value().GeomFill_CorrectedFrenetno longer hangs on certain inputs.BRepFilletAPI_MakeFillerno longer segfaults with two curves and a rim.BRepFilletAPI_MakeFillet::Addno longer hangs.BRepFilletAPI_MakeChamferno longer crashes. Chamfer and fillet no longer crash when approaching an ellipse.BRepOffsetAPI_MakePipeShellno longer crashes.BRepBuilderAPI_GTransformno longer crashes on face stretch.Boolean fuseno longer segfaults on lofts. The simplifying fuse infinite loop was eliminated. Memory consumption inBOPAlgo_PaveFiller_6was reduced.ShapeAnalysis_Curveno longer reports a projected-point versus parameter mismatch.BRepBndLib::AddOptimalhandles faces without PCurves and the void bounding box case. Periodic BSpline curve bounding works with the corrected tolerance.BRepLib::BuildCurve3ddoes not perform an unused loop iteration.BRep_Tool::CurveOnSurfaceis invoked with a one-based index.ComputePolesIndexes()no longer returns out-of-bounds indices.ShapeUpgrade_UnifySameDomainno longer crashes; the inverted-revolved-shape regression on STEP import was fixed.fixshapeno longer crashes on null surfaces.BRepFilletAPI_MakeFilletperiodic-curve handling inChFi3d_Builderwas improved.BSplCLib_Reverseno longer reads out of range.BRepFill_PipeShell::MakeSolidretains its history option flag.IntPatch_Polyhedrontriangle-pair container isNCollection_DynamicArray.FillSameDomainFacesuses the parent solid rather than the shell when mapping same-domain faces.BRepBlend_AppFuncRoottolerance settings were corrected after the BSplCLib interpolation change.Shape Healing
Replacement chains in
ShapeBuild_ReShapecould form cycles when the sameTShapewas rewritten through differently oriented entry points.ValueLeaf()resolves the chain leaf,Replace()rejects cycles, and DFS in-flight guards stop recursive descent loops. Wire-fixing cost is no longer quadratic on shapes with shared subshapes, and progress cancellation checkpoints are observed across ShapeFix.ShapeUpgrade_FaceDivide::Perform()lazily initializes aShapeBuild_ReShapecontext if none is supplied.ShapeConstruct_ProjectCurveOnSurface::insertAdditionalPointOrAdjustno longer assigns into a smaller buffer; it uses move assignment instead.ShapeUpgrade_UnifySameDomainremoves edges from the working map during face unification.ShapeFix_GlueEdgesWithPCurvesvalidation was corrected. Unstable PCurve processing in shape healing was fixed. Wire fixing reuses surface analysis results. PCurve projection is faster.FixFaceOrientationis faster.Mesh
Mesh algorithms register through
BRepMesh_DiscretAlgoFactory, an abstract base with a static registry.BRepMesh_IncrementalMeshFactoryregisters theFastDiscretalgorithm;XBRepMesh_Factoryregisters theXBRepMeshextended algorithm. The legacyDISCRETPLUGIN/DISCRETALGOsymbol-based plugin system,BRepMesh_PluginMacro.hxx,BRepMesh_PluginEntryType.hxx,BRepMesh_FactoryError.hxxand the Draw commandsmpsetfunctionname,mpgetfunctionnameandmperrorwere removed. TKMesh and TKXMesh can be loaded together without symbol collisions.BRepMesh_BaseMeshAlgoregisters used nodes inregisterNode()instead ofinitDataStructure(), so nodes inserted later in the algorithm are tracked consistently. Stack overflow during meshing and a STEP-file import crash visualizing boundary curves were fixed.BRepMesh_Delauncorrectly handles point-in-polygon for CCW polygons.Visualization
Grids
V3d_RectangularGridandV3d_CircularGridare unified onto a single shader path. The grid is infinite by default with sub-pixel line antialiasing throughfwidth-based AA. Per-axis Nyquist fade prevents bright haze at grazing angles when the grid period drops below one pixel. Lines mode usesmax()of per-axis alphas; points mode uses the product so only intersections light up. A background mode pinsgl_FragDepthto1.0 - 1e-5. Bounded clipping (rectangularSizeX/SizeY, circularRadius, optional arc range) uses smoothstep so the clip edge is a single screen pixel transition rather than a binary staircase. Stable-reference rebasing keepsfract()arguments bounded at far world offsets without changing the visible line pattern. The privileged plane is an arbitrarygp_Ax3exposed throughuPlaneOrigin/uPlaneX/uPlaneY/uPlaneN. Pan and rotate compensation in background mode is derived from the view-matrix delta, so noGraphic3d_CameraAPI change was needed. The shader path requires GL 3.2 or GLES 3.0.The classical CPU grid backend is preserved alongside the shader path for legacy GL profiles and embedded targets. Snap math is unchanged. The two backends are mutually exclusive per view; activating one erases the other on the same view.
Aspect_GridParamsis a POD carrying shader-only appearance knobs.Aspect_RectangularGridexposesSizeX,SizeY,ZOffset.Aspect_CircularGridexposesRadius,ZOffset,AngleStart,AngleEnd,IsArc().Graphic3d_CView::GridDisplay(Aspect_GridParams, gp_Ax3)andGridErase()are virtuals with no-op defaults.OpenGl_ShaderManager::BindGridProgram()lazily creates and caches the program. The renderer binds a dedicated VAO and saves and restores program, depth state, blend state and depth-clamp.vgridaccepts-type {rect|circ|gpu},-color R G B,-scale N,-lineThickness T,-background {0|1},-drawAxis {0|1},-viewAdaptive {0|1}, alongside the legacy-origin,-step,-rotAngle,-zoffset,-size,-radius,-modeflags.Selection
AIS_TextLabelandPrsDim_DimensionuseGraphic3d_Group::SetFlippingOptionsso labels stay upright relative to the camera. The selection pipeline is now flip-aware.Graphic3d_Flipperis the CPU-side analogue ofOpenGl_Flipperand reproduces the render-time flip matrix, which is self-inverse because each branch is a 180-degree rotation involution.Graphic3d_CStructureexposesHasGroupFlipping()andSetGroupFlipping().Select3D_SensitiveEntitycarries the same flipping metadata.SelectMgr_SensitiveEntitySettracksmyNbEntityWithFlipping.SelectMgr_SelectableObjectSet::appropriateSubset()routes flipped presentations into the 3D-persistent BVH subset.BVHBuilderAdaptorPersistentmerges flipping and transform persistence in a single pass.SelectMgr_ViewerSelector::traverseObject()folds the flip matrix into the inverse-transform chain before frustum overlap testing.SelectMgr_TriangularFrustumSet::OverlapsBoxnow does a real inside test: it probes every frustum for any overlap, then projects the eight AABB corners onto the near plane and applies a ray-cast inside test against the polyline loop.OverlapsPointis no longer a stub returningfalse. Strict-inclusion polyline selection works forSelect3D_SensitiveTriangle,SensitivePoly,SensitiveTriangulation,SensitivePrimitiveArray,MeshVS_CommonSensitiveEntityandMeshVS_SensitiveQuad.Select3D_SensitivePrimitiveArray::GetVertex(index)returns the three vertex positions of the indexed triangle asstd::array<NCollection_Vec3<float>, 3>. Sub-owner bounding boxes apply theSelectMgr_SelectableObjecttransformation.The mouse-click handler distinguishes double clicks reliably; selection schemes can use
HandleMouseClick.AIS_ViewCubeno longer moves unexpectedly.AIS_Shaperecomputes its bounding box correctly.AIS_ColorScale and shading
The two triangles of each color-scale rectangle now share the same diagonal with consistent CCW orientation. The rectangle helper uses
Graphic3d_ArrayOfPrimitives::AddQuadTriangleEdges()so face culling does not drop vertices.The implicit optimization that forced UNLIT shading when material had no reflection properties was removed; this used to break PBR materials, interior color and texture modulation. Code that relies on UNLIT shading must call
SetShadingModel(Graphic3d_TypeOfShadingModel_Unlit)explicitly.Graphic3d_ShaderProgramacceptsmat3andmat4uniforms (PushVariableMat3,PushVariableMat4). The Drawvshadercommand exposes-vec2,-vec3,-vec4,-mat3,-mat4. Detection of full cylinder and cone parameters was improved.OpenGl_ViewAABB transformation was corrected.IVtk
IVtkTools_ShapePickerandIVtkOCC_ShapePickerAlgoexposeSetPixelTolerance(int)andPixelTolerance(). The deadSetTolerance(float)/GetTolerance()API and the unused stored tolerance value were removed.IVtkOCC_ViewerSelectorno longer caches tolerance fields locally, andmyTolerances.Tolerance()is applied on everyPick().FFmpeg, image, immediate-mode
The FFmpeg compatibility layer was extended and the video recorder updated.
Image_AlienPixMapwrites valid PPM image comments. Immediate-mode rendering methods onAIS_InteractiveContextare deprecated.Graphic3d_Aspects::PolygonOffsetsdocumentation was clarified. The font manager has a flag to suppress unsupported-font warnings.Data Exchange
DE_Wrapper, plugins
DE_Wrapperhas stream-based read and write methods for STEP, STL, VRML and the other supported formats, with validation utilities. The plugin system was reorganized: configuration nodes haveRegister/UnRegistermethods, andDE_MultiPluginHolderallows multiple registrations. The DE Wrapper no longer mixes file and system coordinate systems for mesh formats.STEP
Concurrent operation: STEP read and write are safe under the contract of one reader or writer per thread (default parameter set). Two
libmallocdouble-free crashes under concurrentSTEPControl_Writer::Transferand intermittent crashes in concurrent STEP readers were fixed.STEP type recognition uses
std::string_viewend to end, with a custom hasher inRWStepAP214.StepData_ReadWriteModule::StepType()returnsconst std::string_view&instead ofTCollection_AsciiString.StepData_StepReaderDataand the entity graph evaluator are faster. TheDirectionentity has a smaller memory footprint.Export side: STEP General Attributes are exported as
property_definitionentities. Coordinate system connection points are imported. Duplicate-entity removal cuts file size by approximately 20% on average. Control directives are preserved on export. Scaling transformations are applied on export. The dot inAP242_MANAGED_MODEL_BASED_3D_ENGINEERING_MIM_LFwas removed. Vis Material support coversSurfaceStyleReflectanceAmbientDiffuseandSurfaceStyleReflectanceAmbientDiffuseSpecular. Tessellation export ignores unit factors. Datum extraction no longer crashes.Import side: STEP imports report missing GDT values correctly. STEPCAF dimension-value conversion recognizes
StepRepr_ReprItemAndLengthMeasureWithUnitAndQRIandStepRepr_ReprItemAndPlaneAngleMeasureWithUnitAndQRI(PMI measurement scaling betweenmandmmis handled).XSControl_Reader::OneShape()skips null shapes when building the result compound.CheckSRRReversesNAUOno longer segfaults: null checks were added aroundSDR->Definition().PropertyDefinition()for both therep1/pd1andrep2/pd2paths. STEP import no longer crashes on empty lists.STEPCAFControl_Readerno longer hangs.STEPControl_Writer::SetShapeFixParametershas a convenience overload.IGES read is not safe under concurrent use; serialize calls.
IGES
IGES export preserves model curves in the transfer cache. The schema name and short-label loop in
IGESData_IGESWriter::DirPartwere corrected.GLTF
GLTF import handles non-uniform scaling. Edges are saved when Merge Faces is enabled. Line types export as
LINE_STRIP. The JSON parser supports streams for lines and points. Indices parsing during array processing was corrected.OBJ, VRML, XCAF
RWObj_Readerhandles facets with empty normals.XCAFDoc_Editor::RescaleGeometryrescales the translation of root references.VrmlData_Nodemacros usenullptrinstead of0L. STEP geometrical and visual enumeration conversion utilities are available.Application Framework
OCAF-related packages were cleaned up.
TNaming_NamedShapereturns null early whenTNaming_UsedShapesis missing. Inspector and ExpToCas live in their own repositories.TPrsStd_ConstraintToolswas tightened.TObj_Persistencemacro casts usestatic_cast<const TObj_Persistence*>(nullptr).Documentation
The user-facing documentation was rewritten for 8.0.0: GitHub-native workflow, vcpkg build instructions, the C++17 baseline, and a complete upgrade guide. Obsolete pages for Mantis, Gitolite, Inspector and DFBrowser were removed. Code examples were aligned with OCCT conventions and modern macros and types (
occ::handle,nullptr,M_PI), and many incorrect API and enum references in snippets were corrected. Method documentation inHLRBRep_HLRToShapeandGraphic3d_Aspects::PolygonOffsetswas filled in.TCollectiondocumentation was updated.Acknowledgments
We thank all contributors who helped make this release possible through their code contributions, bug reports, and testing.
New Contributors
OSD_Host.cxx#902Full Changelog: V7_9_0...V8_0_0
This discussion was created from the release V8_0_0.
Beta Was this translation helpful? Give feedback.
All reactions