Open CASCADE Technology 8.0.0 Beta Release #1249
dpasukhi
announced in
Announcements
Replies: 2 comments
-
|
Release can be prepared earlier than 7th of May. We understand, that migration is not trivial and will takes much more then 7 days for community, but who already at rc4-rc5 it would be very helpful. |
Beta Was this translation helpful? Give feedback.
0 replies
-
|
Updated version with Beta 2: https://github.com/Open-Cascade-SAS/OCCT/releases/tag/V8_0_0_beta2
|
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
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:
Size()now returnssize_tacross maps, sequences, arrays, and lists;Length()retains the legacyint-returning contract - this is the single most impactful migration item in 8.0.0Standard::Reallocate-based growth;NCollection_DynamicArrayrebuilt on top of it;NCollection_Vectordeprecated;NCollection_BasePointerVectorremoved entirelyBuilderViewretired;EditorView(with a dedicatedEditorView_Setters.cxx) becomes the single mutation surface, owning both structural Add/Remove and field-levelMut*()RAII operations with automatic generation propagationBRepGraph_MeshCacheandBRepGraph_MeshViewseparate algorithm-derived caches from persistent (definition) triangulations; freshness keyed onFaceDef.OwnGengp_Ax3privileged plane, and matrix-derived pan/rotate compensation - noGraphic3d_CameraAPI change requiredGraphic3d_Flipperbrings flip-aware BVH bounds and frustum overlap testing in line withOpenGl_Flipperrendering, fixing missed clicks onAIS_TextLabel/PrsDim_Dimensionafter camera rotationIntPatch_PolyhedronBVH(BVH_PrimitiveSet<double, 3>+BVH_LinearBuilder) andIntPatch_BVHTraversalreplace pairwise triangle scanning inIntPatch_InterferencePolyhedron::Interference()- O(log n) queries replace linear search-Werrorenabled in Linux/macOS CI #1209: GitHub Actions configure step now sets-Werror -Wzero-as-null-pointer-constantplus a curated allow-list of-Wno-error=...suppressions, locking in a clean warning baselineemplace_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 removalWhat 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 tosize_t: AcrossNCollection_Map,NCollection_DataMap,NCollection_IndexedMap,NCollection_IndexedDataMap,NCollection_Sequence,NCollection_Array1,NCollection_Array2,NCollection_List(and the underlyingNCollection_BaseMap/NCollection_BaseSequence/NCollection_BaseList),Size()now returnssize_t. The legacyint-returning accessor is preserved asLength().intoverloads ofReSize()/BeginResize()/EndResize()delegate through a sharedNbBucketsFromInt()helper with a negative-input guard. The same PR sweepsSize()->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 anint-typed API or progress scope.New
NCollection_LinearVector: Contiguous flat-buffer dynamic array. UsesStandard::Reallocate-based growth for trivially copyable types and move-construction for non-trivial types. The header carries a documented iterator-invalidation contract.NCollection_DynamicArrayrebuilt: Now aLinearVector<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_BasePointerVectorremoved: Superseded byNCollection_LinearVector. No backward-compatibility shim.NCollection_BaseMap::Statisticsremoved: Unused.NCollection_IncAllocatorlock-free fast path: Switched tostd::shared_mutexplus CAS bump allocation on an atomicAvailableSize. Exclusive lock is taken only for new-block allocation and free-list reordering - existing block allocations now proceed without contention.NCollection_BaseMapiterator rework: New forwardfindFirst()helper eliminates negative-bucket arithmetic; iterator state unified undersize_t.<cstddef>include added toNCollection_Primes.hxx: Clean-build fix forsize_tresolution on platforms that did not implicitly include it.GTest coverage: New
NCollection_DynamicArray_Test.cxxandNCollection_LinearVector_Test.cxxcovering construction, growth, iterator invalidation, move semantics, andResizepatterns.Other NCollection Improvements
NCollection_LinearVectorextended #1244: Added size+value constructor andResize(size, value)overload. Migrated manystd::vectorusages across TKMath/TKMesh/TKBO/TKBRep/visualization toNCollection_LinearVector, including BVH array plumbing - removing the conditional STL-vs-OCCT branches that previously cluttered those paths.NCollection_Vectordeprecated #1230: All in-tree usages migrated toNCollection_DynamicArray. The class continues to compile under a deprecation warning.NCollection_Array1/Array2zero-based constructors andsize_tresize #1236: New zero-based constructors (allocation + buffer-reuse wrapping).size_t-basedResize()overloads.NCollection_Array1resize logic refactored into a shared implementation. Dedicated GTest coverage included.Foundation Improvements
Robust unit-conversion error handling #1201:
Units_MeasurementandUnits::Convert()now print the name of the unknown unit when conversion fails.Units::Convert()no longer crashes when the first unit is unknown.UnitsAPIdocumentation strings corrected (non-existent unit type "millimeter" replaced with "mm").Standard_DEPRECATED_STDmacro #1241: New macro inStandard_Macro.hxxexpanding to standard[[deprecated("...")]](or empty underOCCT_NO_DEPRECATED). Used byGCE2d_*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:
EditorViewreplacesBuilderView#1212: TheBuilderViewAPI is removed (BRepGraph_BuilderView.cxx/.hxxdeleted).EditorView(BRepGraph_EditorView.cxx/.hxx, plusBRepGraph_EditorView_Mut.cxx) becomes the single programmatic mutation surface, owning both structural creation (Add*/Remove*) and field-level RAII-scoped mutation (Mut*()) with automaticOwnGenandSubtreeGenpropagation.Dedicated
BRepGraph_EditorView_Setters.cxx#1242: A new file adds typed setters that replace direct field writes in tests. Used together withGenOps::RemoveRef; mutation-gen tests adoptMarkDirty().BRepGraphInc_ReverseIndexgains incremental bind/unbind helpers, eliminating full rebuilds in many editor operations.BRepGraph_CopyandBRepGraph_Transformextended withCopyNode/TransformNode, plus optional mesh-copy/transform support.BRepGraph_MeshCacheandBRepGraph_MeshView#1212: Two-tier mesh storage separating algorithm-derived caches from persistent definition triangulations. Freshness is keyed onFaceDef.OwnGen; cache writes do not mutate the model. The invalidation contract is documented inline - which mutations bumpFace.OwnGenand howmarkRepModifiedcloses the loop for Surface and Triangulation reps.New iterators #1212:
BRepGraph_RefsIterator(generic flat ref scan withRefTraitsdispatch) andBRepGraph_ReverseIterator(typed parent-traversal wrappers over reverse-index vectors).RefId entity model rework #1212: Inline refs replaced with typed
RefIdvectors. NewOccurrenceReftype andKind::Occurrence=7.BRepGraphInc_WireExplorernow requires aVertexRefLookupparameter.Layer/usage renames #1212:
BRepGraph_ParamLayer->BRepGraph_LayerParam,BRepGraph_RegularityLayer->BRepGraph_LayerRegularity,BRepGraphInc_Usage->BRepGraphInc_Instance.Roots API #1212:
RootNodeIds()replaced byRootProductIds()returning product roots only.uint32_tID migration #1229: Node, ref, and rep ID types - and many count-returning APIs - migrated frominttouint32_t/size_t(history indices). Loops reworked from raw integer indexing to typed-id iteration (Start(),IsValid(), range-for) across both production code and tests. Compaction test coverage expanded with a bounding-box preservation assertion.Builder lifecycle clean-up #1237:
BRepGraph_Builder::Perform()is replaced withBRepGraph_Builder::Add(). NewBRepGraph::Clear()is the canonical rebuild boundary. Product/occurrence editing renamed:AddAssembly->CreateEmptyProduct,AddOccurrence->LinkProducts; occurrence mutation moves underEditor().Occurrences(). Inline docs and a large GTest set updated.Comprehensive new GTest set #1212:
NCollection_DynamicArray_Test,NCollection_LinearVector_Test,BRepGraph_Fuzz_Test,BRepGraph_Iterator_Test,BRepGraph_LayerIterator_Test,BRepGraph_MeshCache_Test,BRepGraph_MutGuard_Test,BRepGraph_ReplaceVertex_Test,BRepGraph_ReverseIterator_Test,BRepGraph_ScenarioMatrix_Test,BRepGraph_TypedIdDispatch_Test,BRepGraph_WireExplorer_Test. PR Moding - Update BRep Graph permission usage #1242 adds aBRepGraphInc_Test.cxx.MSVC fallback hardening #1246:
BRepGraphInc_Storagevisitors made explicit on the "unsupported id type" branch to silence MSVC control-path warnings;BRepGraph_NodeId::Invalid()used in place of integer literals where appropriate. SeveralSize()calls revised back toExtent()/Length()where they fedMessage_ProgressScope(which expectsint).Other Modeling Data
TopExp_Explorer::Clear()allocation churn fix #1195: The previousReallocate(0)/Reallocate(N)cycle inClear()caused unnecessary heap traffic in hot iteration paths. The fix resets liveTopoDS_Iteratorslots in place frommyStackTopdown to0and keeps the array allocation, so subsequent reuse skips reallocation. Covered by a new GTest exercising nested iteration and reinitialization (post-RC5 stack-refactor regression gate).Modeling Algorithms
Bug Fixes (High-Impact)
Stack overflow / edge multiplication in shape healing with shared sub-shapes #1227: Replacement chains in
ShapeBuild_ReShapecould form cycles when the same TShape was rewritten more than once via differently-oriented entry points, causing recursive descent loops and exponential edge expansion. Fix introduces:ValueLeaf()- replacement-chain leaf resolutionReplace()Shape replacement regression follow-up #1247: Targeted fixes for regressions surfaced by the cycle-handling change above.
Null-context crash in
ShapeUpgrade_FaceDivide::Perform()#1203: Lazy initialization of theShapeBuild_ReShapecontext when none is supplied; covered by serial and parallel-execution GTests.Crash in
BRepFill_PipeShell::MakeSolid()#1224:IsSameOriented()now iterates over face edges and selects one present in the shell's edge->faces map, with aContainsguard beforeFindFromKey()to prevent invalid map access. Local naming (theFace,theShell,anEdgeFaceMap) updated to OCCT conventions.Cylinder-cylinder tangent-along-line case #1228: When two cylinders are tangent along a line, the analytical intersection produces an invalid restriction point (an algorithmic limitation of the analytical approach). Patch ensures the implicit-implicit intersection algorithm is used in this case.
Degenerate thin-solid detection #1231:
FillSameDomainFacesnow uses the parent solid (not the shell) for Same-Domain face mapping, eliminating misclassification of degenerate thin solids.3D cycling detection in
IntWalk_PWalking#1226: New 3D-distance-based closure check marks an intersection line as closed when the walker returns near the starting point, forcing early termination and re-adding the first point to close the polyline.GeomFill_ConstrainedFillingandGeomFill_CoonsAlgPatchcorrectness fixes #922: Fixed bug where law functions were silently discarded due toFunc()being called instead ofSetFunc()inInit(). Corrected parameter usage inCoonsAlgPatch::Value()for proper variable assignment in curve evaluation.Performance
IntPatch_PolyhedronBVH: WrapsIntPatch_Polyhedronas aBVH_PrimitiveSet<double, 3>built withBVH_LinearBuilder. Stores a reference to the polyhedron (no data copy) and maintains an index mapping to track triangle reordering during BVH construction.IntPatch_BVHTraversal: Dual-tree traversal yielding candidate triangle pairs.IntPatch_InterferencePolyhedron::Interference()refactored on top of these for O(log n) queries replacing linear search. A newIntPatch_PolyhedronBVH_Test.cxxGTest covers the new path.NCollection_DynamicArrayin a follow-up commit.Mesh
BRepMesh_BaseMeshAlgonode registration #940: Used-node binding moved frominitDataStructure()toregisterNode()to ensure consistent tracking of all nodes (the earlier code missed nodes inserted later in the algorithm). New GTest suite validates internal vertex handling in mesh triangulation.Visualization
Shader-Based Infinite Grid (Major) #1223
Both
V3d_RectangularGridandV3d_CircularGridnow go through a unified shader path. The classical CPUO(NxM)vertex rebuild on every parameter/camera/plane change is gone. New capabilities:fwidth-based AAsmoothstep(1.0, 2.0, fwidth).max()of per-axis alphas; points mode uses the product so only intersections light upgl_FragDepthto1.0 - 1e-5SizeX/SizeY, circularRadius, optional arc range): hard discard andsmoothstependpoint are both extended byfwidth(coord), giving a single-screen-pixel AA transition rather than a binary staircase at the clipping edgeuStableRefLocal/uHasStableRef; the shader subtractsfloor(ref * scale) / scalebeforefract(), keepingfract()arguments bounded at far world offsets without changing the visible line patterngp_Ax3privileged plane viauPlaneOrigin/uPlaneX/uPlaneY/uPlaneNuniforms. Plane intersection usesintersectPlane()with a normalized direction, soGRID_PARALLEL_EPS = 1e-6is a dimensionless|sin(angle)|threshold (~5.7e-5 deg) that stays scale-invariant under any world-depth range.currentView * refView^-1captured atGridDisplay(); noGraphic3d_CameraAPI change requiredAspect layer
Aspect_GridParams: POD carrying shader-only appearance knobs (color, origin, Scale, ScaleY, LineThickness, RotationAngle, AngularDivisions, IsBackground, IsDrawAxis, IsInfinity, DrawMode, SizeX/SizeY, Radius, AngleStart/AngleEnd).EffectiveScaleY()falls back toScale()whenScaleYis zero.IsCircular()shorthand forAngularDivisions() > 0.IsBounded()/IsArc()report active clipping.Aspect_RectangularGridextended withSizeX/SizeY/ZOffset.Aspect_CircularGridextended withRadius/ZOffset/AngleStart/AngleEndandIsArc(). Snap math is unchanged.Graphic3d_CView::GridDisplay(Aspect_GridParams, gp_Ax3)andGridErase()virtuals added with no-op defaults.OpenGL plumbing
OpenGl_ShaderManager::BindGridProgram(): lazy create + cache, routed throughbindProgramWithStateso the standard OCCT matrix uniforms (occProjectionMatrix,occWorldViewMatrix,occModelWorldMatrixand their inverses,occViewport) are pushed onto the grid program every bind.myGridProgramis nullified inclear()so context resets release the compiled program.OpenGl_View::GridDisplay/GridEraseoverrides and privaterenderGrid(). The renderer binds a dedicated VAO (core-profile safe) and saves/restores program, depth test/func/mask, blend enable, blend-func-separate, and depth-clamp.ProjectionState/WorldViewStateare push/pop-guarded. OriginalZNear/ZFar/ProjTypeare captured before any mutation so a mid-functionZFitAllcannot clobber user-set vzrange on restore.renderGrid()runs betweenrenderScene()andrenderTrihedron()in the non-immediate draw pass;myGridVaoreleased inReleaseGlResources.V3d layer
V3d_View::GridDisplay(params)/GridDisplay(params, plane)/GridEraseare thin pass-throughs; the single-argument overload usesV3d_Viewer::PrivilegedPlane().V3d_RectangularGrid/V3d_CircularGridrewritten: nestedRectangularGridStructure/CircularGridStructure,myGroup,DefineLines,DefinePoints, and allmyCur*caching flags removed.Display()/Erase()/UpdateDisplay()now callsyncViews()which builds anAspect_GridParamsfrom the existing grid state and broadcasts it overV3d_Viewer::DefinedViews().Draw / tests
vgridDraw command gains-type {rect|circ|inf|infinite},-color R G B,-scale N,-lineThickness T,-background {0|1},-drawAxis {0|1},-inf {0|1}. Existing-origin,-step,-rotAngle,-zoffset,-size,-radius,-modeflags retained and now drive the shader path.tests/v3d/grid/group:ortho,persp,inf_pan,inf_rotate,inf_plane,rect_shader,circ_shader,rect_points,inf_options,bounded_rect,bounded_circ. Registered intests/v3d/grids.list.Aspect_GridParams_Test.cxx(defaults, round-trip, copy,EffectiveScaleYfallback, RotationAngle round-trip, AngularDivisions/IsCircular toggle, DrawMode round-trip) andAspect_Grid_Bounds_Test.cxx(SizeX/SizeY/Radius/ArcRange).Behaviour notes
V3d_RectangularGridis unbounded by default (SizeX = SizeY = 0). The previous behaviour of capping to0.5 * DefaultViewSize()is available via explicitSetSizeX/SetSizeY.Aspect_GDM_Pointsis now rendered as shader dots at intersections throughuDrawMode, not as the old CPU point markers. Applications that depended on point markers as individually selectable entities should present them through a dedicated AIS object.Graphic3d_Structureview affinity. Views added to the viewer afterV3d_Viewer::ActivateGrid()must trigger a re-broadcast (Grid()->Display()or re-activate) to pick up the grid.gl_VertexIDandgl_FragDepth). Older driver/profile combinations will not see grid rendering.Selection
Selection through group-level flipping #1219:
AIS_TextLabelandPrsDim_DimensionuseGraphic3d_Group::SetFlippingOptionsso labels stay upright relative to the camera. The selection pipeline previously computed BVH boxes and frustums in unflipped local coordinates - once the camera rotated past the flipping threshold, clicks on the on-screen label missed.Graphic3d_Flipper: CPU-side analogue ofOpenGl_Flippercarrying the reference plane and reproducing the render-time flip matrix. Each flip branch is a 180-degree rotation involution, so the matrix is self-inverse - usingT_flipdirectly is valid in inverse contexts.Graphic3d_CStructuregainsHasGroupFlipping()/SetGroupFlipping(); reset inGraphic3d_Structure::clear().Graphic3d_Group::Flipper()and amyFlippermember populated fromOpenGl_Group::SetFlippingOptions(true,...). The render-sideOpenGl_Flipperelement is still emitted for the push/pop bracket;myFlipperpersists across the matchingSetFlippingOptions(false,...)call so the selection side can see that the group contains flipped geometry.Select3D_SensitiveEntity::Flipper()/SetFlippingOptions()so sensitive entities can carry the same flipping metadata used by selection traversal; included inDumpJson.SelectMgr_SensitiveEntitySettracksmyNbEntityWithFlippinginAppend()/Remove();HasEntityWithFlipping()exposes it to the viewer selector.SelectMgr_SelectableObjectSet::appropriateSubset()routes presentations withHasGroupFlipping()to the 3d-persistent BVH subset (same as transform persistence).BVHBuilderAdaptorPersistentmerges flipping and transform-persistence loops into a single pass: for each group with aFlipperorTransformPersistence, build its local bbox, apply the flip (if any), then applyTransformPersistence(if any), then add the resulting box to the object bbox; object-levelTransformPersistenceis applied once to the merged box. Note: for the rare case of object-level + group-levelTransformPersistence, the application order differs from the prior code (object-TP now runs after group-TP contributions are added). Common cases are behaviour-preserving.SelectMgr_ViewerSelector::traverseObject()bypasses the root/per-node overlap early-outs when the entity set contains flipped sensitives, and folds the flip matrix intoaInvFlippingAndPers = T_flip * aInvSensTrsfbeforecomputeFrustum()andcheckOverlap().Transformation()is folded intoaMVForFlipviaGraphic3d_TransformUtils::Convert<double>so theisReversedX/Y/Zdecision agrees withOpenGl_Flipper::Render()which usesWorldView * ModelWorld.Graphic3d_Group::Transformation()is still not folded in on the selection side because the sensitive entity does not carry a reference to its host group - only affects consumers that give the flipping group its own non-identitygp_Trsf(uncommon in stock OCCT). ATODOinGraphic3d_Flipper::ComputeandSelectMgr_ViewerSelectormarks the deferred follow-up.Polyline selection inclusion test fixes #1222: Two long-standing bugs in
SelectMgr_TriangularFrustumSetfixed:OverlapsBox(min, max, bool* theInside)- the corner-edgeisIntersectBoundaryheuristic produced false "fully inside" answers whenever an AABB was large enough that its 12 edges did not cross the polyline but its interior did not lie inside either. Rewrite: first probe every frustum for any overlap; if none, return false. Otherwise, project the 8 AABB corners onto the frustum near plane and apply a ray-cast inside test against the original polyline loop. If any corner projects outside, cleartheInside; else leave it untouched. The near-plane coplanarity assumption is guaranteed byBuild(), which derives every near vertex frommyBuilder->ProjectPntOnViewPlane(x, y, 0.0).OverlapsPoint(const gp_Pnt&)- previously a stub returningfalse, silently making strict-inclusion polyline selection ofSelect3D_SensitiveTriangle/SensitivePoly/SensitiveTriangulation/SensitivePrimitiveArray/MeshVS_CommonSensitiveEntity/MeshVS_SensitiveQuadimpossible (those types calltheMgr.OverlapsPoint(...)on each vertex in strict-inclusion mode; a blanketfalsemeant nothing was ever picked). Now delegates to the same near-plane projection + ray-cast test, so strict inclusion works for all these sensitive types in polyline mode.tests/vselect/bugs/bug_polyline_inclusion(no GTest because constructing a workingTriangularFrustumSetrequires a configuredGraphic3d_Camera+ viewport).Select3D_SensitivePrimitiveArray::GetVertexaccessor #1221: Returns the three vertex positions of the triangle at the given index asstd::array<NCollection_Vec3<float>, 3>. Downstream consumers can query triangulation geometry of a picked primitive array without re-walking the underlyingGraphic3d_Buffer/Graphic3d_IndexBuffer. Uses the existing file-localgetTriIndiceshelper and the privategetPosVec3member, keeping the implementation a pure accessor.AIS_ColorScale Rendering
Triangle winding fix #1220: Swap the last two vertex indices in the second triangle of each color-scale rectangle so the two triangles share the same diagonal with consistent CCW orientation. Earlier indexing (
v+1, v+2, v+3) built two overlapping triangles with opposite winding, producing visible seams and dropped vertices under back-face culling.Face-culling completion #1225: Switched the rectangle helper from manual triangle edges to
Graphic3d_ArrayOfPrimitives::AddQuadTriangleEdges()while preserving the top/bottom color layout. Picks up the upstream patch revision from Kirill Gavrilov (commit9b8c624...). Pixel-check Draw regressiontests/v3d/colorscale/colorscale_facecullingadded.IVtk
IVtkTools_ShapePicker::SetTolerance(float)/GetTolerance()API and the unused stored tolerance value. NewSetPixelTolerance(int)/PixelTolerance() constonIVtkTools_ShapePickerandIVtkOCC_ShapePickerAlgoforward toSelectMgr_ViewerSelector.IVtkOCC_ViewerSelectorno longer caches tolerance fields locally; allPick()overloads applymyTolerances.Tolerance()on every pick.Data Exchange
Crash in
XSControl_Reader::OneShape()#1216:TransferRoots()/TransferList()now allow appending nullTopoDS_Shaperesults (matchingTransferEntity()behaviour).OneShape()skips null shapes when building the result compound. Transfer loops modernised: parameter renames (start->theStart,list->theList,TR->aTransferReader),size_titeration variables, removal of the obsoleteShapeExtend_Explorer STUempty-shape filter (now uniformly handled by appending null shapes and skipping inOneShape()).Segfault in
CheckSRRReversesNAUO#1215: Added null-checks aroundSDR->Definition().PropertyDefinition()before extractingProductDefinition()for bothrep1/pd1andrep2/pd2paths.PMI measurement conversion factor #1218: STEPCAF dimension-value conversion extended to recognize
StepRepr_ReprItemAndLengthMeasureWithUnitAndQRIandStepRepr_ReprItemAndPlaneAngleMeasureWithUnitAndQRI. Regression testbug33095extended to validate scaling betweenmandmm.STEPControl_Writer::SetShapeFixParameters()overload #1235: Additional convenience overload introduced as part of the QADraw migration.Build and Configuration
-Werrorenabled in Linux/macOS CI #1209:CMAKE_CXX_FLAGSin the shared GitHub Actionconfigure-occtnow includes-Werror -Wzero-as-null-pointer-constantplus a curated allow-list (-Wno-unknown-warning-option,-Wno-error=array-bounds,-Wno-error=maybe-uninitialized,-Wno-error=stringop-overflow,-Wno-deprecated-declarations,-Wno-error=cast-function-type-mismatch). Specific defensive code changes accompanying the flag flip:MathRoot_Trig.hxx:aNZer = std::min<size_t>(aPoly.NbRoots, aZer.size())defensive clamp before reading rootsPoly_MergeNodesTool::PushLastElement:std::min(theNbNodes, 4)clamp beforestd::sortover aVec4StepData_EnumTool::AddDefinition:char text[80] = {0}zero-initialisationIGESData_IGESWriter::DirPart: added&& i < 8bound on the short-label copy loopVrmlData_NodeVRMLDATA_LCOMPARE:0L->nullptrTObj_Persistencemacro:(const TObj_Persistence*)0->static_cast<const TObj_Persistence*>(nullptr)FlexLexer.h:std::ostream* new_out = 0->nullptrConditional
vtkRenderingGL2PSOpenGL2linkage #1214:vtkRenderingGL2PSOpenGL2is now appended toUSED_TOOLKITS_BY_CURRENT_PROJECTonly when the target exists, for both namespaced (VTK 9) and legacy (VTK 7/8) names. Required because the module is omitted on Android/iOS and when building VTK with GLES.Testing
Windows ARM64 master validation #1213: Promoted the Windows ARM64 build/test workflow from the IR branch to master (deleted from
build-and-test-multiplatform.yml, added tomaster-validation.yml).QADraw -> GTest migration (round 1) #1235: Removed multiple legacy DRAW test scripts and several QABugs DRAW command implementations. New GTest suites cover the migrated regressions across ModelingData, ModelingAlgorithms, FoundationClasses, DataExchange, and ApplicationFramework.
QADraw -> GTest migration (round 2) #1243: Additional GTests covering historical regressions (intersection, projection, pipe shell, boolean ops, fillet, distances, gp transforms, string hashing). Legacy Tcl tests and corresponding QADraw commands removed from
QABugs_*.cxx.Reference data refresh for migration to new station #1248: Adjusted faulties/warnings in IGES and STEP tests to reflect updated results. Tolerance values corrected in multiple shape-validation tests. Expected label counts and properties realigned. HLR and offset error messages refined for consistency. GLTF and STEP metadata checks updated to revised reference sizes/values.
Improvementscases updated with TODO removals.Coding Quality (Two Large Sweeps)
Clang-Tidy round 1 #1207 (contributed by JIJINBEI): Focused on:
push_back(T(...))->emplace_back(...)size() == 0/size() != 0->empty()/!empty()= default(void)parameter listsClang-Tidy round 2 (codebase-wide sweep) #1245 (clang-tidy 22.1.3). Most of the diff comes from
readability-braces-around-statementsadding explicit{/}to single-statementif/else/loop bodies across.cxxand.pxxfiles. Other applied checks:modernize-deprecated-headersmodernize-redundant-void-argmodernize-use-bool-literalsmodernize-use-equals-default,modernize-use-equals-deletemodernize-use-nullptr,modernize-use-overrideperformance-avoid-endl,performance-move-constructor-initreadability-delete-null-pointer,readability-redundant-control-flow,readability-redundant-declaration,readability-redundant-function-ptr-dereference,readability-redundant-member-init,readability-redundant-string-init,readability-static-accessed-through-instanceMSVC warning sweep #1246: Follow-up to PR Foundation, Modeling - NCollection modernization and BRepGraph overhaul #1212. Various
Size()calls switched toExtent()/Length()(int-returning) where they fedMessage_ProgressScope.BRepGraphInc_Storagevisitors made explicit on the unsupported-id-type fallback to silence MSVC C4715.BRepGraph_NodeId::Invalid()used in place of integer literals; duplicateStandard_EXPORTremoved; loop variable rename in tests.Documentation
BSplCLib_MultDistribution("mutiplicities" -> "multiplicities"),QABugs_20.cxx("syncronization" -> "synchronization"),QABugs_19.cxxoutput strings, STEP rendering properties comments ("applyed" -> "applied").Migration Guide
Size()Now Returnssize_t- Read This FirstThis is the single most impactful migration item in 8.0.0. Across
NCollection_Map,NCollection_DataMap,NCollection_IndexedMap,NCollection_IndexedDataMap,NCollection_Sequence,NCollection_Array1,NCollection_Array2, andNCollection_List:Size()now returnssize_t(wasStandard_Integer/int)Length()continues to returnint- it is the legacy accessor you should use whenever the count must feedint-typed APIs (Message_ProgressScope, indexing arithmetic againstintloop counters, format strings, function signatures expectingStandard_Integer)Symptoms you may see
Mechanical migration rule
int-typed API (progress scope, function expectingStandard_Integer, format%d)c.Size()c.Length()intloop counterc.Size()c.Length()size_tAPIc.Size()c.Size()(no change; gainsize_tsemantics)size_tAPIsc.Size()c.Size()(no change)When in doubt, prefer
Length()for backward compatibility - it preserves the historical type contract. UseSize()only when you actively wantsize_tsemantics.intoverloads still workReSize(),BeginResize(),EndResize(), and friends retain theirint-taking overloads. They now delegate through a sharedNbBucketsFromInt()helper that guards against negative inputs.NCollection_VectorDeprecated - Migrate toNCollection_DynamicArray#1230
NCollection_Vectorcontinues to compile under a deprecation warning.NCollection_DynamicArrayis now backed byNCollection_LinearVector<T*>of fixed-size blocks with O(1) indexed access via precomputed shift/mask.For new code that does not require stable element addresses across growth, prefer
NCollection_LinearVector<T>directly - it is contiguous, usesStandard::Reallocate, and matchesstd::vector's memory model.NCollection_BasePointerVectorRemoved#1212
Replace with
NCollection_LinearVector<T*>. No backward-compatibility shim is provided.BRepGraph:
BuilderView->EditorView#1212, #1237, #1242
BuilderViewis removed. All programmatic mutation goes throughEditorView.BRepGraph builder lifecycle
Product/occurrence renames
AddAssemblyCreateEmptyProductAddOccurrenceLinkProductsEditor().Occurrences()Layer / usage renames
BRepGraph_ParamLayerBRepGraph_LayerParamBRepGraph_RegularityLayerBRepGraph_LayerRegularityBRepGraphInc_UsageBRepGraphInc_InstanceRoots API
RootNodeIds()is removed. UseRootProductIds(), which returns product roots only.BRepGraphInc_WireExplorerNow requires a
VertexRefLookupparameter as part of the RefId entity model rework.V3d Grids: Unbounded by Default
#1223
V3d_RectangularGridis now unbounded by default (SizeX = SizeY = 0). To restore the historical "capped to 0.5 *DefaultViewSize()" behaviour, callSetSizeX(...)/SetSizeY(...)explicitly.Aspect_GDM_Pointsis now rendered as shader dots at intersections rather than CPU point markers. Applications that depended on point markers being individually selectable must present them through a dedicated AIS object.Grids no longer rely on
Graphic3d_Structureview affinity. Views added to the viewer afterV3d_Viewer::ActivateGrid()must trigger a re-broadcast (Grid()->Display()or re-activate) to pick up the grid.The shader requires GL 3.2 / GLES 3.0 (uses
gl_VertexIDandgl_FragDepth). Older driver/profile combinations will not see grid rendering.IVtk:
SetTolerance(float)Removed#1204
The new API forwards directly to
SelectMgr_ViewerSelectorand is applied on everyPick()(the previous local cache is gone).Standard_DEPRECATED_STDMacro#1241
If you maintain downstream code that defines its own deprecation macros conflicting with OCCT's, note the new
Standard_DEPRECATED_STD(...)form, which expands to standard[[deprecated("...")]]and respectsOCCT_NO_DEPRECATED. ExistingStandard_DEPRECATED(...)continues to work;Standard_DEPRECATED_STDis preferred for new alias headers.Downstream Builds Adopting
-WerrorIf you mirror the OCCT CI flags downstream (
-Werror -Wzero-as-null-pointer-constant), you may surface latent issues that the OCCT codebase has now cleaned up. The defensive patterns applied in PR #1209 are a useful template:std::sort/ array reads even when the bound looks redundantchar text[80] = {0})&& i < Nbound on copy loops whereNmatches the destination capacity(T*)0/0Lliterals withnullptr/static_cast<T*>(nullptr)in macros and default argumentsRemoved Functionality (since 8.0.0-rc5)
BRepGraph_BuilderViewBRepGraph_EditorViewNCollection_BasePointerVectorNCollection_LinearVector<T*>NCollection_BaseMap::StatisticsBRepGraph::RootNodeIds()RootProductIds()BRepGraph_Builder::Perform()BRepGraph_Builder::Add()(+BRepGraph::Clear())IVtkTools_ShapePicker::SetTolerance(float)/GetTolerance()SetPixelTolerance(int)/PixelTolerance()IVtkOCC_ViewerSelectorcached tolerance fieldsmyTolerances.Tolerance()applied perPick()V3dgrid presentation pipeline (RectangularGridStructure/CircularGridStructure,myCur*caches,DefineLines/DefinePoints)V3d_RectangularGriddefault-bounded behaviourSetSizeX/SetSizeYto boundDeprecated Functionality (since 8.0.0-rc5)
NCollection_VectorNCollection_DynamicArray(orNCollection_LinearVectorfor new code)Performance Improvements Summary
BVH_LinearBuilder-based constructionNCollection_IncAllocator#1212:std::shared_mutex+ CAS bump allocation; exclusive lock taken only on new-block allocationNCollection_DynamicArraypower-of-two block sizing #1212: O(1) indexing via precomputed shift/maskTopExp_Explorer::Clear()allocation reuse #1195: In-place iterator reset removesReallocate(0)/Reallocate(N)churnBeta Phase Plan
The remainder of the cycle to May 7, 2026 is dedicated to:
samples/to reflect the 8.0.0 project layout, the new BRepGraph/EditorView APIs, the shader-gridvgridinvocations, and theLength()/Size()distinction in NCollection containers.If the Beta soak is stable and no regressions are detected, the final 8.0.0 release tag will be cut on May 7, 2026 with no further code changes.
Acknowledgments
We thank all contributors who helped make this release possible through their code contributions, bug reports, and testing.
New Contributors
Full Changelog: V8_0_0_rc5...V8_0_0_beta1
This discussion was created from the release V8_0_0_beta1.
Beta Was this translation helpful? Give feedback.
All reactions