github Open-Cascade-SAS/OCCT V8_0_0_rc3

pre-release18 hours ago

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

  • Migrated QA DRAW tests to GTest #818, #823
  • Migrated QA NCollection to GTests #709
  • Added Boolean operation GTests #721
  • Added ShapeAnalysis_CanonicalRecognition unit tests #720
  • Added Standard_ArrayStreamBuffer unit tests #708
  • Added PLib functionality unit tests #705
  • Covered math module with GTests #684
  • Enhanced BRepOffsetAPI_ThruSections_Test with B-spline support #891

Bug Fixes

Modeling

  • Fixed thickness operation regression on circle-to-polygon lofts #889
  • Fixed ShapeUpgrade_UnifySameDomain crash #876
  • Fixed BRepBuilderAPI_GTransform face stretch crash #875
  • Fixed out-of-range access in BSplCLib_Reverse #863
  • Fixed Boolean fuse segfault on loft #860
  • Fixed BRepFilletAPI_MakeFillet::Add hang #859
  • Fixed BRepFilletAPI_MakeChamfer crash #743
  • Fixed BRepOffsetAPI_MakePipeShell crash #740
  • Fixed chamfer/fillet crash approaching ellipse #738
  • Fixed array indexing bug in IntAna_IntQuadQuad::NextCurve #703
  • Fixed null surface crash in fixshape #623
  • Fixed null surface crash in UnifySameDomain #624
  • Fixed Bnd_Box::CornerMax incorrect implementation #664
  • Fixed memory consumption in BOPAlgo_PaveFiller_6 #864

Shape Healing

  • Fixed regression after #584 #753, #769
  • Fixed inverted revolved shape import from STEP #699
  • Reverted BSpline check for ShapeConstruct_ProjectCurveOnSurface #894

Data Exchange

  • Fixed STEP import crash on empty list #671
  • Fixed STEPCAFControl_Reader hang #733

Mesh

  • Fixed stack overflow when meshing #695
  • Fixed STEP file import crash when visualizing boundary curves #745

Application Framework

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

Visualization

  • Fixed unexpected moving with AIS_ViewCube #727

Draw

  • Fixed message color mixing #685
  • Fixed dangerous use of 'cin' #681
  • Fixed incorrect return-value check for scanf-like functions #680

Migration Guide

Deprecated Math Functions

All OCCT math wrapper functions that duplicate C++ standard library functionality are now deprecated. While they still work, you should migrate to std:: equivalents:

// Before (deprecated)
double angle = ACos(value);
double dist = Sqrt(x*x + y*y);
double result = Max(a, b);
double val = Abs(x);

// After (recommended)
double angle = std::acos(value);
double dist = std::sqrt(x*x + y*y);
double result = std::max(a, b);
double val = std::abs(x);

Complete Mapping

Deprecated Function Standard Replacement
ACos(x) std::acos(x)
ASin(x) std::asin(x)
ATan(x) std::atan(x)
ATan2(y, x) std::atan2(y, x)
Cos(x) std::cos(x)
Sin(x) std::sin(x)
Tan(x) std::tan(x)
Cosh(x) std::cosh(x)
Sinh(x) std::sinh(x)
Tanh(x) std::tanh(x)
ACosh(x) std::acosh(x)
ASinh(x) std::asinh(x)
ATanh(x) std::atanh(x)
Sqrt(x) std::sqrt(x)
Log(x) std::log(x)
Log10(x) std::log10(x)
Exp(x) std::exp(x)
Pow(x, y) std::pow(x, y)
Abs(x) std::abs(x)
Sign(a, b) std::copysign(a, b)
Floor(x) std::floor(x)
Ceiling(x) std::ceil(x)
Round(x) std::round(x)
IntegerPart(x) std::trunc(x)
Min(a, b) std::min(a, b)
Max(a, b) std::max(a, b)
NextAfter(x, y) std::nextafter(x, y)

Note: ACosApprox() is also deprecated; use std::acos() instead.

Standard_Mutex Migration

Replace legacy mutex usage with standard C++ threading primitives:

// Before
#include <Standard_Mutex.hxx>

Standard_Mutex myMutex;
Standard_Mutex::Sentry aSentry(myMutex);
// or
myMutex.Lock();
// ... critical section ...
myMutex.Unlock();

// After
#include <mutex>

std::mutex myMutex;
std::lock_guard<std::mutex> aLock(myMutex);
// or for more control:
std::unique_lock<std::mutex> aLock(myMutex);

For optional/heap-allocated mutexes:

// Before
Standard_Mutex* myOptionalMutex;

// After
std::unique_ptr<std::mutex> myOptionalMutex;

PLib_Base Removal

PLib_Base abstract base class has been removed. PLib_JacobiPolynomial and PLib_HermitJacobi are now value types (not Handle-based):

// Before
Handle(PLib_JacobiPolynomial) aJacobi = new PLib_JacobiPolynomial(...);
aJacobi->D0(...);

// After
PLib_JacobiPolynomial aJacobi(...);
aJacobi.D0(...);  // Note: method is now const

PLib_DoubleJacobiPolynomial Removal

The PLib_DoubleJacobiPolynomial class has been completely removed. If you were using it, you'll need to refactor your code to use PLib_JacobiPolynomial directly.

TopTools_MutexForShapeProvider Removal

The TopTools_MutexForShapeProvider class has been removed. Use std::mutex with shape providers directly.

OSD_MAllocHook Removal

The OSD_MAllocHook class and the Draw command mallochook have been removed. Use platform-specific memory debugging tools instead (Valgrind, AddressSanitizer, etc.).

QANCollection Package Removal

The QANCollection package (test utilities for collections) has been removed. Use GTest-based tests in src/*/GTests/ directories instead.

Transfer_TransferDeadLoop Deprecation

The Transfer_TransferDeadLoop exception class is deprecated. Dead loop detection now uses local status flags instead of exceptions. The class is kept for backward compatibility but should not be used in new code.

StepData_ReadWriteModule::StepType() API Change

The StepType() method now returns const std::string_view& instead of TCollection_AsciiString:

// Before
TCollection_AsciiString aType = aModule->StepType(aTypeNum);

// After
const std::string_view& aType = aModule->StepType(aTypeNum);
// If you need TCollection_AsciiString:
TCollection_AsciiString aTypeStr(aType.data(), static_cast<int>(aType.length()));

Using Standard Direction Enumerations

New convenient enumerations for standard directions:

// Before
gp_Dir aDir(1.0, 0.0, 0.0);  // X direction
gp_Dir aNegZ(0.0, 0.0, -1.0); // Negative Z

// After
gp_Dir aDir(gp_Dir::D::X);   // X direction
gp_Dir aNegZ(gp_Dir::D::NZ); // Negative Z

// Available: X, Y, Z, NX, NY, NZ for gp_Dir
// Available: X, Y, NX, NY for gp_Dir2d

Empty String Access

Use the new static methods for efficient empty string access:

// Before
TCollection_AsciiString anEmpty;
const TCollection_AsciiString& GetEmpty() { static TCollection_AsciiString s; return s; }

// After
const TCollection_AsciiString& anEmpty = TCollection_AsciiString::EmptyString();
const TCollection_ExtendedString& anEmptyExt = TCollection_ExtendedString::EmptyString();

Removed Functionality

Item Commit Replacement
OSD_MAllocHook class #707 Platform memory tools
PLib_Base class #795 Direct value types
PLib_DoubleJacobiPolynomial #781 PLib_JacobiPolynomial
TopTools_MutexForShapeProvider #766 std::mutex
QANCollection package #718 GTests
Standard_Mutex (effectively) #766 std::mutex

Deprecated Functionality

Item Commit Replacement
Math global functions (ACos, Sin, etc.) #833 std:: equivalents
ACosApprox() #833 std::acos()
Transfer_TransferDeadLoop exception #817 Status flags

Performance Improvements Summary

  • BSpline cache optimized for local calls #906
  • BSpline data containers with constexpr and validation #897
  • PCurve projection optimization #890
  • BndLib optimization #856
  • Bnd package optimization and fixes #839
  • B-Spline curve computation enhancement #855
  • Quantity package optimization #834
  • TopExp package performance improvements #831
  • AsciiString optimization with pre-defined strings #752
  • FixFaceOrientation optimization #584
  • EigenValuesSearcher improvements #714
  • Math container optimization #717
  • Move semantics for math_Matrix/math_Vector #841
  • Precomputed Jacobi coefficients #778
  • Constexpr Pascal allocator for PLib::Bin #777
  • STEP type recognition using std::string_view #784

Documentation

Extensive documentation improvements including:

  • Whitespace and typo fixes across the codebase #806-#824
  • Comment uniformity improvements #767, #771
  • Updated AI Assistant guidelines #854
  • TCollection documentation update #665

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_rc2...V8_0_0_rc3

Don't miss a new OCCT release

NewReleases is sending notifications on new releases.