- Promote allocation-size operands to size_t before multiplication in
BSplCLib, BSplSLib, PLib, ApproxInt, GeomEval, and OpenGl
- Compute AdvApp2Var workspace offsets in intptr_t to avoid intermediate
integer overflow
- Evaluate quadric and manipulator coordinates in double before storing
them in gp_Pnt
- Use widened OpenGl row offsets consistently for buffer allocation and
indexing.
- Mark immutable geometry values and buffer sizes as const.
- Restore compatibility headers for removed typedef-only declarations.
- Mark restored headers and aliases deprecated since OCCT 8.1.0.
- Group legacy typedefs under Deprecated/TypeAliases.
- Keep aliases of fully removed classes excluded.
- Replace UTL path, environment, file-access, string,
and storage helpers with OSD, TCollection.
- Remove the UTL package from TKCDF.
- Share document-reference parsing between binary and XML retrieval drivers.
- Validate malformed reference records without introducing new exceptions.
- Handle extensionless document paths without querying an invalid resource key.
- Simplify path decomposition using OSD_Path::FolderAndFileFromPath().
- Replace handled math_Vector buffers with NCollection_Array1 and
NCollection_LocalArray storage.
- Reuse Gauss and knot buffers across integration iterations.
- Use zero-based size_t indexing and standard algorithms for interval
construction and error selection.
- Convert the Gauss integration type to enum class.
- Simplify inertia initialization and remove obsolete helper methods.
- introduce StepData_Field::FieldKind and remove duplicated numeric kind macros
- preserve compact field storage while correcting 2D dimensions and bounds
- fix integer access and independent copying of one-dimensional lists
- preserve false, true, and unknown logical select values
- iterate entity fields from their actual array lower bounds
- validate StepData_FieldListN sizes
- handle null and unsupported values safely in StepData_StepWriter
- support arbitrary lower bounds when writing real arrays
- Transform geometry and polygonal data in their representation frames.
- Correct triangulation winding and normals for mirrored and general transformations.
- Stabilize normal transformation for very small, large, and singular scales.
- Preserve absent and parameterless polygonal representations correctly.
- Keep the cached general-transformation scale synchronized through the restricted API.
- Replace sequence storage with linear vectors and paired orientation data.
- Reuse GeomAdaptor_Surface for EvalD1-based quasi-punctual checks.
- Use LocalArray-backed buffers with At()/ChangeAt() access.
- Sample geometry-driven intervals without fixed floating-point loops.
- Preserve initialization failure cleanup with RAII.
Use stream APIs instead of temporary files in migrated GTests.
Restore DRAW cases whose serialized data or file-bound behavior is part of the regression.
Keep incomplete cases as explicit TODO skips and tighten deterministic storage expectations.
- Preserve carriage returns embedded within fixed-width 80-column IGES records.
- Support CR, LF, CRLF, and delimiter-free record boundaries.
- Restore legacy handling of physical preambles, encoded FNES records, and shifted D-exponent values.
- Serialize IGES provider tests because the legacy reader uses global state.
- Add exact regression expectations for parsed entities, topology, and corrupted input.
- Correct KPartCircle() handling when an offset collapses a circular edge.
- Prevent fallback to the generic MAT algorithm after the circular special case has been recognized.
- Add GTests for circular wires at, above, and below the 2 mm diameter boundary.
- Cover negative taper, positive offset, and collapsed-circle cases.
Migrate some DRAW tests which do not use external
CAD files and which do not use visualisation/image dump.
Some tests were modified, but the original idea was preserved
- Detect complete coincidence between fillet and chamfer intersection curves.
- Preserve orientation relationships between equivalent intersection curves.
- Reuse existing restriction edges instead of constructing duplicate topology.
- Merge coincident curve endpoints into shared topological vertices.
- Exclude fully consumed faces and their obsolete boundary edges during reconstruction.
- Mark edges collapsed to a single vertex as degenerated during construction.
- Accept tangential contacts while rejecting transversal intersections.
- Preserve generated and modified shape history in the resulting topology.
- Add GTests for convex, concave, opposing-edge, chamfer, and history cases.
- Add IGES stream reading and writing to DEIGES providers.
- Extend IFSelect, XSControl, and work libraries with generic stream output.
- Keep STEP work-library output aligned with the shared stream interface.
- Convert the legacy IGES parser from C to modern C++.
- Introduce buffered parsing of fixed 80-column IGES records.
- Support LF, CRLF, CR-only, and delimiter-free record layouts.
- Preserve FNES preamble detection and encoded record handling.
- Handle stream errors, enabled exceptions, partial reads, and cleanup safely.
- Isolate mutable parser data with thread-local storage.
- Serialize access to process-wide IGES configuration and restore it on exit.
- Preserve supplied work sessions, transferred models, and selected modifiers.
- Apply modern OCCT naming, casting, documentation, and control-flow style.
- Add tests for shape and document stream I/O, record layouts, and failures.
- Add a thread-safe lazy grid to CSLib_Class2d for constant-time
classification away from polygon boundaries while preserving the exact
tolerance path for boundary cells.
- Normalize coordinates and explicit tolerances robustly, handle invalid and
extreme input values, and preserve cache state correctly across copy and
move operations.
- Cache face wires, edge occurrences, pcurves, parameter ranges, and optional
2D bounding boxes in BRepClass_FaceExplorer to avoid repeated topology and
geometry traversal during exact classification.
- Introduce explicit cached-geometry and bounding-box states in
BRepClass_Edge, invalidate derived data on topology changes, and isolate
bounding-box construction failures per edge.
- Reuse a lazily constructed exact face explorer in
BRepTopAdaptor_FClass2d, cache periodic surface properties, and serialize
access to mutable exact-classification traversal state.
- Replace node-based classifier and point sequences with contiguous linear
vectors, remove intermediate polygon copies, and make tighter wire
discretization transactional.
- Consolidate Perform() and TestOnRestriction() through a shared
classification path while preserving their boundary and periodic
recadrement semantics.
Guard invalid edges, faces, adaptors, and missing pcurves before they
are passed to BRepAdaptor_Curve2d or dereferenced during chamfer construction.
When the topology does not provide a valid curve-on-surface, preserve
the existing state where possible and return false.
This makes an oversized or otherwise invalid chamfer finish with IsDone() == false
instead of crashing in BRep_Tool::CurveOnSurface.
Use Adaptor3d_CurveOnSurface composed-curve recognition to handle
provable elementary cases directly:
- compute the exact maximum at interval endpoints for line pairs;
- Compute exact maxima for line pairs and use trigonometric roots for
circle and ellipse pairs.
- preserve the existing PSO/Newton pipeline for all other cases.
---------
CLA ID 1148
Co-authored-by: dpasukhi <dpasukhi@opencascade.com>
Initialize the output sequence when ConnectWiresToWires receives null or
empty input. This prevents SplitWires from appending a null sequence when
all free-boundary edges have been consumed as closed loops.
CLA ID: 1139
BRepFilletAPI_MakeFillet reconstructs its result solid through the legacy
TopOpeBRepBuild engine (ChFi3d_Builder::Compute -> TopOpeBRepBuild_HBuilder::
MergeSolid -> TopOpeBRepBuild_Builder::SplitSolid), which passes state between
methods through file-scope static variables. That makes it non-reentrant: two
BRepFilletAPI_MakeFillet builds on independent shapes on separate threads corrupt
each other and yield a wrong-but-plausible solid that fails BRepCheck.
ThreadSanitizer on an 8-thread fuse+fillet stress pinpoints the functional cause as
STATIC_SOLIDINDEX (TopOpeBRepBuild_Builder.cxx): SplitSolid sets it to 1/2 to tell
FillSolid which operand it is splitting, FillSolid reads it back. Concurrent
reconstructions interleave the writes, so FillSolid mis-classifies faces and drops
material. Converting that one variable to thread_local makes a 1600-build concurrent
stress return correct geometry every time (was ~15-20% corrupt).
Converts the fillet-path shared statics to thread_local (each thread keeps its own
copy of the cross-call state; single-thread behaviour is unchanged):
- Functional: TopOpeBRepBuild_Builder STATIC_SOLIDINDEX; TopOpeBRep_kpart
STATIC_lastVPind (same cross-call-cache pattern).
- Benign data races on the same path (no corruption, but flagged by TSan):
BlendFunc_ConstRad / BlendFunc_EvolRad ComputeValues scratch; ChFi3d_Builder_6
checkcurve.
Same class of fix, same engine, as the earlier TKBool thread_local conversion
(#1180); these were not covered by it. Reported downstream as SecondMouseAU/
OCCTSwift#298.
Validate the edge range against the effective curve basis before
constructing Geom_TrimmedCurve. Preserve valid periodic ranges and
return a null pcurve for inconsistent bounded ranges.
Split oversized raw STEP strings in StepData_StepWriter::AddString() instead of repeatedly flushing the current line when the text cannot fit into the 72-character buffer.
Drop indentation for continuation lines when the indented prefix would leave no room for the pending text.
Precompute conservative UV bounds for closed wires and skip expensive
containment checks for disjoint wire pairs. Fall back to the existing
classification when reliable finite bounds cannot be constructed.
ShapeFix_Face::FixPeriodicDegenerated() unconditionally recorded the
result through Context()->Replace(), although ShapeFix_Face can be used
without assigning a reshape context. This caused a null dereference when
healing a periodic conical face bounded by a single closed edge.
Guard the replacement when no context is available while preserving the
healed face in myResult.
Prevent null pcurve dereferences during pcurve relocation, transformation,
wire construction, and edge selection. Skip only the affected face group
instead of aborting processing of the entire shell.
Use BRepAdaptor_Curve::NbPoles() when selecting the integration order
for Bezier and BSpline curves. This keeps the pole count consistent with
the curve representation reported by GetType() and avoids dereferencing
a null 3D curve for edges represented only by a curve on surface.
The base mesh algorithm created constraint links for all pcurves of an
edge, including duplicate representations at periodic seams.
Register nodes and mesh indices for all pcurves so polygon-on-triangulation
data remains valid, but add links only for the pcurve of the wire occurrence.
Method Geom_BSplineCurve::PeriodicNormalization() is rewritten - it now
has algorithmic complexity O(1) instead of O(N) and protected against
rounding error for large numbers.
- Add helper to create shell with all faces reversed
- Test FaceRef stores REVERSED orientation for all faces
- Test ParentExplorer reports shell as parent for reversed faces
- Test Reconstruct produces valid face definitions
- Test shell reconstruction preserves REVERSED face orientations
- Unify test fixture names to BRepGraph_ReverseTest
- Add aspect API controlling vertex color use on back faces
- Generate front-only vertex color shader variants for face programs
- Expose the option through ViewerTest and add DRAW/GTest coverage
- Kept TopoDS definition data local while storing root
and compound placements on graph references.
- Preserved located triangulation and polygon-on-triangulation
data during population.
- Preserved degenerate natural boundary edges and cleared
full-graph state consistently in Perform().
- Kept original TopoDS shape lookup bindings valid
across population and compaction.
- Rebuilt compacted compounds in two passes so nested
compound references keep their local placement.
- Added focused regression coverage for located meshes,
nested compounds, shape lookup, compaction, degenerate boundaries, and reset behavior.
Infinite loop occurred in IntWalk_IWalking::ComputeOpenLine() inside 'while (!Arrive)' loop.
Fixed by checking for degenerate case after very large amount of iterations have passed.
- The Strtod() function used a shared static Bigint memory pool
(private_mem, pmem_next, TI0) without synchronization.
- When multiple threads called Strtod() concurrently (e.g. parallel
BRep reading), the pool was corrupted causing random mis-parses
of numeric values.
- Fix: declare private_mem, pmem_next and TI0 as thread_local so
each thread gets its own independent memory pool and freelist.
- Added Standard_Strtod_Test.cxx with parallel correctness tests
using OSD_Parallel::For.
- Added BRepTools_Test.cxx with integration tests for parallel
BRep file reading.