Version 1.2.7            19th Dec 2023
======================================
Shapes:
- Reverted change in UnplacedTrap for theta() and phi() methods introduced
  in release 1.2.2, causing failures in Geant4 co-planarity checks.

Version 1.2.6            6th Nov 2023
======================================
Overview:
- Fix in SimpleExtruded shape implementation of DistanceToOut().
- Fixes in configuration setup.

Configuration:
- Add full vecgeom version string to exported configuration; this gives
  provenance to installed versions of VecGeom that *aren't* point releases.
- Export CMake cache variables with VecGeomConfig.
- Changed static assert to runtime test failure.

Shapes:
- Fix for DistanceToOut() in simple extruded implementation.

Version 1.2.5            2nd Aug 2023
======================================
Overview:
- Fix for Jenkins builds.
- Fix for Extent of Booleans.

Build:
- Jenkins: explicitly target the PLATFORM instead of relying on links

Shapes:
- Fix for a major bug introduced by the commit 7894c5ee that changed the
  semantic of VPlacedVolume::Extent to compute the extent of the displaced
  volume rather than delegate to the unplaced extent calculation. The
  implementations of UnplacedBooleanVolume<op>::Extent were converting the
  extents of the Boolean components to the UnplacedBooleanVolume frame,
  so after the change this conversion was done twice.

Version 1.2.4            17th Jul 2023
======================================
Overview:
- Added cmake git version support.
- Fix in VGDML module.

Configuration:
- Added cmake git version support.

Persistency:
- Fix for the rotation used in VGDML for Boolean components.
  The rotation matrices have different layouts in VecGeom compared to Geant4,
  row versus column major, so the constructor based on rotation elements need
  to use transposed elements.

Version 1.2.3            15th Jun 2023
======================================
Overview:
- In PlaneShell, removed broken optimization for Trapezoid.
- Fixes in Polyhedra to provides correct navigation for dphi larger than pi.
- Fixed errors in geometry synchronization for GPU.

Configuration:
- Fix for name clash when including X11/X.h.

Navigation:
- ApproachSolid must return zero if called from inside the bounding box.

Shapes:
- PlaneShell: removed broken optimization for Trapezoid:
  * PlaneShell's SafetyToIn and SafetyToOut contained what looks like an
    optimization for the case N == 4. However, the condition / branches
    were swapped so that the code would use the general loop for N == 4
    and assume exactly four planes for N != 4. This wasn't a problem in
    practice because VecGeom only ever uses PlaneShell with N == 4, for
    the Trapezoid.
  * Performance measurements show that the re-ordering of Max operations
    yields a very minor improvement of at most 1.5% - 2%. As it wasn't
    active up to now, just remove the code path. As such, no performance
    difference expected nor measured.
- Polyhedra now provides correct navigation for dphi larger than pi.
  * Contains() takes into account the fact that the phi planes responses
    must be OR-ed.
  * Inside() correctly finds the inside surface and outside regions and
    uses consistently kTolerance instead of a mix with kHalfTolerance.
  * DistanceToIn/Out() correctly deals with early returns that were
    inappropriate in the larger than pi cases.
- Planes and quadrilaterals support the non-convex case to support phi
  planes at angle larger than pi:    
  * The logic for Contains and Inside must change from AND to OR if the
    planes are delimiting a non-convex body.
- Improved and simplified Print() format for several shapes:
  * Implemented SExTru Print() and warn for unexpected SExtru parameters
    from GMDL.

GPU:
- Fix errors in geometry synchronization for GPU:
  * Only used 'placed' volumes in BVH.
  * Copy missing components to GPU.
  * Use ID comparison rather than pointer comparison to determine size.
  * Moved ReflFactory from vgdml to vecgeom module.
  * Fixed missing copy of constituent volumes to GPU.
  * Eliminated redundant 'find'.
  * Use cout instead of printf().
  * Fix out-of-range errors in volume lookups.

Benchmarks & Tests:
- Added six polyhedron topologies in both the benchmarher and shape tester:
  * 0-NoInnerRadii, 1-WithInnerRadii, 2-WithPhiSectionConvex,
    3-WithPhiSectionNonConvex, 4-ManySegments and 5-SameZsection.
- Adjusted TestPolyhedra to deal with changed surface tolerance from
  kHalfTolerance to kTolerance.

Version 1.2.2            10th Mar 2023
======================================
Overview:
- Rationalised use of VECGEOM_{GEANT4,ROOT} in library code.
  Minimised use of ROOT/Geant4 in main VecGeom library.
- Improvements and extensions to the VGDML parser.
- BVHNavigator now allows relocation using VNavigator interface.

Configuration:
- Rationalised use of VECGEOM_{GEANT4,ROOT} in library code.
- Minimised use of ROOT/Geant4 in main VecGeom library:
  * Create VecGeomTest library for all shared testing code.
  * VGM is only needed by G4GeoManager as private dependency.
  * Make GDML tests a subdirectory of main tests.
  * Cleaner organization, find all tests under one tree.
  * Isolate ConvertTo{Geant4,Root} functions as far as possible.
  * Moved G4GeoManager out of VecGeom interface, as the class is only used
    for global benchmarks and should not be part of the main VecGeom interface.
  * Removed unused ResultComparator includes.
  * Made Transformation3D::ConvertToTGeoMatrix() a static method and updated
    client code to use it.
  * Fully remove ROOT dependence in NavState{Index,Path}; migrated remaining
  * ROOT conversion function to free function only used in testing code.
  * Removed NavState{Index,Path}::GetCurrentNode().
  * NavState{Index,Path} ROOT conversion/access can be static
    Removed copy assignment from TGeoBranchArray as this is not used.
    Made conversion/access ROOT functions static, as they can be
    implemented using public methods.
    Updated tests to use static member functions.
  * Remove ROOT dependence of FlatVoxelHashMap.
  * Minimize ROOT use in FlatVoxelManager.
    Removed private functions that are never called anywhere. Migrated
    remaining static functions to free functions in anonymous namespace
    to hide as much as possible.
  * Make all Volume use of VECGEOM_{ROOT,GEANT4} consistently.
  * Removed ROOT usage which is no longer relevant.
    Code never uses ROOT, so remove VECGEOM_ROOT.
  * Removed unused, obsolete header.
- Include config header to pick up VECGEOM_GEANT4; the symbol is no longer
  transmitted by compiler flag.
- No longer use VECGEOM_TEST_BENCHMARK in VecGeom library code.
- Use optional VMC from official upstream repository.

Navigation:
- BVHNavigator now allows relocation using VNavigator interface.
  Implemented VNavigator::Relocate() interface and related auxiliary helper
  methods; working on both host/device.

Shapes:
- Make Trap theta,phi recalculation transient, moving from construction
  to accessor. Fixed sign conventions for Trap angles as in Geant4.

Persistency:
- Improvements to VGDML parser:
  * Fixed EllipticalCone shape parsing.
  * Fixed memory leak.
  * Fixed construction arguments for full compatibility with Geant4
    in conversion.
  * Use names from GDML files when creating the volumes.
  * Improved handling of no-rotation identity matrix.
    In addition to being much faster, this also fixes the previous
    no-rotation identity matrix, obtained by actual rotations of zero angles.
  * Fixed unit treatment for some shape parameters from GDML parsing.
  * Added meaningful parameter printouts for Tet and Boolean shapes.
- Added VGDML support for GenericPolycone shape.

Version 1.2.1            29th Nov 2022
======================================
Overview:
- Fixes in shapes: polycone, cone, tube.
- Extended vgdml support for the existing shapes.
- Configuration updates and reorganisation for tests and benchmarks.
- Improved CUDA support for memory allocation from shapes.
- Simplified daughter crossing check in navigation.

Configuration:
- Split service code into vecgeom/tests as appropriate. Moved benchmarking code
  to dedicated test-only library. Made utilities/ code a test-only library.
  Updated build scripts to account for path changes.
- Compile ShapeTester code into test-only library.
- Updated location for test files download.
- Ensure asserts are always enabled in all tests.
- Fixed compilation warnings on gcc-12 and on recent clang versions.

Navigation:
- In VNavigator, simplified the logic which uses the mother volume convexity to
  prioritize daughter checks. This approach is not always justified because
  it may increase the search range for daughter candidates. The current
  approach is conservative and uses the distance to mother first to limit
  the search distance for daughters, only if there are daughters. The check
  for daughters at this point spares extra checks in the derived navigators,
  which in the case of BVH was even generating a crash.

Persistency:
- Added vgdml support for UnplacedEllipticalTube, UnplacedEllipticalCone
  and UnplacedEllispoid shapes.
- Fixed reading of (simple) extruded solid.

Shapes:
- Updated Polycone/Cone implementation to only use kConeTolerance.
  Fixing cases of stuck tracks in ATLAS simulation.
- [VECGEOM-542]: In Tube::DistanceToOut(), added logic to detect point location
  in Phi sector of a tube. Now SafetyToOut() uses Wedge to calculate the
  SafetyToOut() for a point from the phi section.
  These modifications fix the mismatches reported by ShapeTester.
  Since now checking the existence of a point in Phi section in DistanceToOut(),
  a minor performance penalty is expected.
- [VECGEOM-602] Fix in Polycone::SafetyToIn() to remove unececessary
  calculations, when a point is outside the Z range.
- Rewritten PolyhedronStruct::Initialize() without use of dynamic memory.
  CUDA has only a very limited amount of scratch space for malloc / new.
  Having many polyhedra in a geometry setup may exhaust that space.

GPU:
- Expose function to change heap limit in CUDA.
  As of now, all "dynamically sized" shapes such as polyhedra, polycones,
  and extruded solids allocate memory in kernels. This is problematic as
  CUDA only has a very limited amount of scratch space for malloc / new.
  Until the "transfer code" for these types of shapes is fixed, add the
  function CudaDeviceSetHeapLimit() similar to CudaDeviceSetStackLimit()
  to let VecGeom clients work around this problem.
- Make BVHSafetyEstimator and BVHNavigator usable on device.
  Function annotation as host device as needed. Implement the Instance method
  for the GPU case.
- Overload Transformation3D::Set for aligned/byte-wise data; allowing
  user to choose whether a byte-wise load of the passed translation/rotation,
  or an element-wise. The latter resulting in better load instructions.
  Remove obsolete byte-wise Transformation3D::Set().
- Ensure that transformation data in nav table is stored aligned;
  fixed size calculation of navigation index table.

Miscellaneous:
- Added protection when using BVH navigation in leaf volumes.
- Added implementation of marching cubes algorithm.
- Fixed pixels container overlaps for trackML GDML file.
- Self-consistency fixes for header inclusions in translation units.

Version 1.2.0             4th May 2022
======================================
Overview:
- Configuration updates: updated configuration flags.
- Switch to C++17 by default.
- Some code optimisations for GPU.

Configuration:
- Bump minimum CMake version to 3.16.
- Switch to C++17 by default.
- Use new-style project arguments.
- Use same C++ standard for C++ and CUDA.
- Fixed CudaAssertError in release builds.
- Facilitate error tracing in CudaManager.
- Force cache CUDA-required option and check CUDA Compiler ID/Version
  compatibility.
- Install python symlink package on CI image.
- Mark ccache program option as advanced and group options by build/test.
- Drop linking libraries from custom ClangTidy check.
- Migrated settings flags:
  o SINGLE_PRECISION to VECGEOM_SINGLE_PRECISION
  o FAST_MATH to VECGEOM_FAST_MATH
  o USE_CACHED_TRANSFORMATIONS to VECGEOM_USE_CACHED_TRANSFORMATIONS
  o EMBREE to VECGEOM_EMBREE
  o GDML to VECGEOM_GDML
  o USE_NAVINDEX to VECGEOM_USE_NAVINDEX
  o USE_INDEXEDNAVSTATES to VECGEOM_USE_INDEXEDNAVSTATES
  o INPLACE_TRANSFORMATIONS to VECGEOM_INPLACE_TRANSFORMATIONS
  o DISTANCE_DEBUG to VECGEOM_DISTANCE_DEBUG
  o QUADRILATERAL_ACCELERATION to VECGEOM_ENABLE_QUADRILATERAL_ACCELERATION
  o PLANESHELL to VECGEOM_PLANESHELL
  o NO_SPECIALIZATION to VECGEOM_NO_SPECIALIZATION
  o BUILTIN_VECCORE to VECGEOM_BUILTIN_VECCORE
  o BACKEND to VECGEOM_BACKEND
  o ROOT, Geant4 options to VECGEOM_ namespace
  o VECGEOM_BENCHMARK to VECGEOM_TEST_BENCHMARK
  o VECGEOM_VTUNE to VECGEOM_TEST_VTUNE
  o BENCHMARK to VECGEOM_TEST_BENCHMARK
  o STATIC_ANALYSIS to VECGEOM_TEST_STATIC_ANALYSIS
  o VALIDATION to VECGEOM_TEST_VALIDATION
  o COVERAGE_TESTING to VECGEOM_TEST_COVERAGE
- Clarification of compiler flag setup and documentation.
- Updated static analysis configuration.

GPU:
- Moved TopMatrixImpl into header and made iterative; moved some BVH functions
  and globals to header, improving performance in AdePT.

Primitives:
- Cone, Polycone: consistently replaced kHalfConeTolerance with kConeTolerance.

Miscellaneous:
- Make NavStateIndex trivially destructible.
- EmbreManager: fix Wsign-compare.
- Updated MaskedAssignCheck to avoid catching trivial expressions.
- Use Ubuntu 22.04LTS (Jammy) for CI code checks.
- Removed obsolete and unused Nuclei code.

Version 1.1.20         30th March 2022
======================================
Overview:
- [VECGEOM-540] Fixed stuck tracks during propagation for CutTubs reported in
  CMS simulation. Increased tolerance for negative solutions of tube second
  order solver.
- Preventing false misses in AABB::Intersect().
- Speed up BVH construction.
  Improved BVH construction for concentric objects.

Persistency:
- Added support for physnode::scale tags with reflections.
  Added support for scale in Transformation3D.

GPU:
- Added bulk copy functions for UnplacedPolyhedron and UnplacedPolycone.
  Activate bulk copy of UnplacedVolumes in CudaManager, reducing the time
  to construct instances on device.

Miscellaneous:
- Refactored GeometryTest to be non-recursive, extended to probe unplaced safety.
- Fix for Embree support.
- Fixes in printouts.

Version 1.1.19         11th March 2022
======================================
Overview:
- Improvements and optimisations in BVH:
  o Initialise memory in BVH nodes. Added tree printing to BVH.
  o Added a new new splitting heuristic for BVH.
  o Added surface area heuristic for BVH construction.
    Make it the default for BVH construction.
  o Added SurfaceArea() to AABB. Use AABB::SurfaceArea for BVH construction.
  o Stabilised AABB::Contains().
- Modernisation of CMake usage.

Migration / behaviour change(s):
- Allow for various construction algorithms in BVH.
  Moved existing splitting algorithm into dedicated function.
  By implementing an alternative function, one can easily adapt and
  compare splitting algorithms.
- [VECGEOM-307] Removed obsolete interface SafetyToInMinimize.
- Updated README and INSTALL documents. Merged INSTALL into README.
  Modernized the README, adding detailed requirements and notes on how
  to use the VecGeom CUDA library.

Configuration:
- Small modernisation of CMake target usage in place of variables.
- Use genexes to simplify library link choice.
  CMake can resolve targets without genex.
- Explicitly use builtin VecCore in GitLab CI; set BUILTIN_VECCORE to ON
  explicitly in build jobs on GitLab.
  Explicitly use system VecCore in Jenkins builds; add BUILTIN_VECCORE=OFF
  to default build arguments to make this use case explicit.
- Do not fallback to builtin VecCore if external not found.
  Support switch between builtin/external in current build directory to
  ensure consistent builds.
- Only use VECGEOM_ prefix internally.
- Streamlined variables/targets/components in VecGeomConfig.
- Removed obsolete local cmake_parse_arguments function.
  Removed the local implementation, relying on CMake's native support.
- Simplified cmake config of gdml.
- Moved creation of benchmark executables to test/benchmark.
  TestNavIndex is now automatically disabled when GDML is not active.

- Protect C++ compile options from direct use by NVCC.
  Limit direct use of C++ compile options to C++ compilation consumers.
  Wrap C++ compile options in `-Xcompiler=` flags for CUDA consumers to
  forward these to the host compiler for both CUDA 10 and newer.
  This can be dropped once VecGeom requires CUDA 11 or newer as the
  minimum version.
- Simplified VecGeom specific CUDA options. Removed no longer required option
  for CUDA static/shared runtime; unified CUDA volume specialization under one
  option.
- Suppressed CUDA stack size warnings in device link.
- Break a dependency from libvecgeom to libvecgeomcuda.
- Removed CMake FindCUDA module.
- Renamed the CMake option CUDA to VECGEOM_CUDA.
- Unified VECGEOM_CUDA with VECGEOM_ENABLE_CUDA. Use VECGEOM_ENABLE_CUDA
  as single CMake boolean to request/indicate use of CUDA.
- Hand choice of cuda architecture over to CMake.
- Provide static and shared variants of libvecgeomcuda.
  Use native CMake CUDA support to build static and shared variants
  of the vecgeomcuda library.
  o The static variant is a "standard" CUDA library that consumers
    can link/device link to.
  o The shared variant includes a device link object so that non-CUDA
    consumers can link to it without requiring an otherwise unneeded
    device link.
  o CUDA consumers can link to the shared variant provided they
    device-link explicitly to the static vecgeomcuda.
  Do not link the VGDML library to either CUDA variant of vecgeomcuda,
  allowing clients to use the desired static/shared variant.   
  Updated tests to use only static variant of vecgeomcuda when available.
- Support CMAKE_CUDA_ARCHITECTURES for CMake<3.18.
  Added flags to `CMAKE_CUDA_FLAGS` using same pattern as CMake >= 3.18's
  native support, which is equivalent to the old `-arch=sm_<ARCH>` shorthand.
- Modernised test dependencies.
- Build TestNavigationStatePool for CPU/CUDA.
- Fixed missing vecgeomcuda symbols in vgdml.

- Fixed build with SINGLE_PRECISION.

Details:
- Use C++11 in-class initialisers for AOS, SOA and Array classes.
  Small modernisation of initialisers and constructors for storage classes.
- Suppressed allocation for zero-size AOS3D, SOA3D and Array.
- [VECGEOM-522] Removed redundant lines (no side effects) in ConeImplementation.
- [VECGEOM-512] Homogenized Placed<Shape>::PrintType() implementations.
- [VECGEOM-597] Fixed uniformity issue in SamplePointOnSurface() for Tube.
- Removed a useless Vector3D..
- Removed unused static counter.
- Removed __host__ __device__ specifiers from defaulted constructors.
- Fixed conversion factors for safety in scale transformations in case of
  reflections.
- Fixed AssemblyTest.

Version 1.1.18       5th November 2021
======================================
Overview: 
- Further implementation of functions needed for inclusion of VecGeom
  Navigation into Geant4.
- Moved included version of VecCore to 0.8.0
- Use precision-dependent push rather than fixed one.
- Fix for GeometryTest in CUDA + vector mode
- More improvements and fixes to multiple shapes for improved test results
  in single precision mode
- Fixes for single-precision mode on GPU.

Migration / configuration / behaviour change(s):
- Added arb8 to gdml reader.
- Export required flags for VecGeom as compile options.
- Disable usage of fast math for nvcc unless requested via FAST_MATH option.

Details:
- VNavigators (HybridNavigator2, NewSimpleNavigator) improved.
- VolumeUtilities::FillUncontainedPoints revised to cope with no uncontained
  volume.
- Improvements for different compilers: Intel, LLVM, Clang 13.0
- Type consistency fixes.
- More robust type casting for utility methods.
- Compilation fixes for single-precision vector mode.
- Use vecCore::math function rather than standard ones, for consistent
  host/device behaviour.
- Improved cone performance: avoid a few redundant IsOnConicalSurface(...)
  function calls.
- Add Normal() CPU implementation also to GPU.
- Added doxygen docs for ApproachNextDaughter.
- BVH: Declare stacks as unsigned int and reduced code duplication of
  LevelLocate.

Version 1.1.17      3rd September 2021
======================================

Overview:
- Improvements and fixes to multiple shapes to enable tests to pass in single
  precision mode.
- Fixes for BVH.
- Added accessors for navigation state index.

Migration - configuration or interface changes:
- Removed navigation index setter since the state should rather be recomputed
  for consistency.

Details:
- Fix for on surface and moving out condition for grazing rays on sphere.
- Fix for BVH::ApproachNextDaughter: point/dir conversion to checked daughter
  frame.
- Fixes for cut tube DistanceToIn. Precision fixes for the cut tubes.
- Fixed cone shape tester. Consistent Inside tolerance check for cone.
- Fixed approaching bbox and removed leftover debug checks.
- Fixed convention checking for points on edges.
- Fixed formula for MakePlus/MinuTolerantSquare.
- More precision fixes in the ShapeTester, improved use of ApproachSolid
- Tolerance-related fixes for Tet to pass the ShapeTester.

- Introduce standalone kFarAway in ShapeTester and further reduce errors.
- Fix types in ConventionChecker and ApproxEqual.

- Unify construction of Quadrilaterals.
- Consistently mark functions & destructors with VECCORE_ATT_HOST_DEVICE.

- Use VECGEOM_CONST for constants of kTolerance.
- Rename kernel function for ConstructManyOnGpu.
- UnplacedTrd now exposes interface 'normal' on GPU. Value is computed even
  if point not exactly on surface.
- Transformation3D::Set copies from memory only if has_trans or has_rot are set.
- Added new method to approach the next daughter to its bounding box.
- Fixes for navigation index table in single precision mode.
- Add GPU transfer testing for cms2018 geometry.
- (upstream/fix_bboxes_gpu) Fix bounding boxes on GPU by copying the values
  calculated on host.
- Fix per solid tolerances and change types from double to Precision.

- Add bounding box tests to ctest.
- Implement ApproachSolid utility and store BBox in UnplacedVolume.
- Fix Polyhedron::Contains() around phi tolerance.
- Remove unused ScalarSegmentContainsKernel.
- Activate bulk copying of PlacedVolume and Transformation3D to the GPU.
- Implement functions for bulk copying Transformation3D instances to GPU.
- Implement functions for bulk-copying of placed volumes to GPU.
- Improve const correctness in CudaManager.
- Move verbose printouts to cout instead of cerr in CudaManager.
- Add "Testing/" to .gitignore, which is created by ctest.

- Reduce HOST_DEVICE attribute for PlacedVolume::GetName().
- Add geometry test that compares CPU and GPU geometries.
- [CMake] Remove -G from RelWithDebInfo.
- [clang-format] Prevent clang-format from breaking doxygen comments.
- [git] Extend git ignore to "build*" instead of build.
- [NFC] Make detailed BVH description show up in doxygen.
- [NFC] Add docstring for VECGEOM_DEVICE_INST_PLACED_VOLUME.
- Fix failing test by creating new utility function.
- Fix failing tests in single precision.
- Change kTolerance to kHalfTolerance.
- [VECGEOM-578] Fix an FP comparison that was failing on the GPU.
- Fix a typo in debugging printout.
- [CMake] Fix doxygen search path.
- Fix TestOrb unit test when using single precision.
