Compare commits

..
Author SHA1 Message Date
Dan Bailey ae0875bb06 Add an example to demonstrate sampling and point advection using an adaptive grid
Signed-off-by: Dan Bailey <danbailey@ilm.com>
2024-04-15 23:25:14 -07:00
Dan Bailey 13aa50ac1f Introduce a TreeTraits struct to differentiate between sparse and adaptive trees
Signed-off-by: Dan Bailey <danbailey@ilm.com>
2024-04-15 23:25:14 -07:00
Dan Bailey 77a424312e Add a type-dependent false expression
Signed-off-by: Dan Bailey <danbailey@ilm.com>
2024-03-11 22:46:35 -07:00
Dan Bailey 7624beab0a Add TreeAdapter partial specialization for AdaptiveAccessor
Signed-off-by: Dan Bailey <danbailey@ilm.com>
2024-03-11 22:46:35 -07:00
Dan Bailey 7262f8b113 Extend AdaptiveTree to add an AdaptiveAccessor
Signed-off-by: Dan Bailey <danbailey@ilm.com>
2024-03-11 22:46:35 -07:00
Dan Bailey a6c7af8109 Add AdaptiveTree and Grid registration
Signed-off-by: Dan Bailey <danbailey@ilm.com>
2024-03-11 22:46:35 -07:00
Dan Bailey f5f92dcde1 Adjust existing grid API to move ValueAccessor methods to the tree
Signed-off-by: Dan Bailey <danbailey@ilm.com>
2024-03-11 20:45:53 -07:00
1112 changed files with 42068 additions and 164520 deletions
+26 -33
View File
@@ -14,7 +14,6 @@ on:
- 'nanovdb/**'
- 'openvdb_maya/**'
- 'openvdb_houdini/**'
- 'fvdb/**'
- 'pendingchanges/**'
- '**.md'
pull_request:
@@ -27,9 +26,11 @@ on:
- 'nanovdb/**'
- 'openvdb_maya/**'
- 'openvdb_houdini/**'
- 'fvdb/**'
- 'pendingchanges/**'
- '**.md'
schedule:
# run this workflow every day 7am UTC
- cron: '0 7 * * *'
workflow_dispatch:
inputs:
type:
@@ -52,7 +53,7 @@ jobs:
github.event_name != 'workflow_dispatch' ||
github.event.inputs.type == 'all' ||
github.event.inputs.type == 'linux'
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
name: >
linux-ax:${{ matrix.config.image }}-cxx:${{ matrix.config.cxx }}-${{ matrix.config.build }}
container:
@@ -64,22 +65,19 @@ jobs:
matrix:
# Only test unified builds (core+ax). weekly CI should test standalone
config:
- { image: '2026', cxx: 'clang++', build: 'Release', cmake: '' }
- { image: '2026', cxx: 'g++', build: 'Release', cmake: '' }
- { image: '2026', cxx: 'clang++', build: 'Debug', cmake: '' }
- { image: '2025-clang19.1', cxx: 'clang++', build: 'Release', cmake: '' }
- { image: '2024-clang16.2', cxx: 'clang++', build: 'Release', cmake: '' }
# Needed to test LLVM 15.X
- { image: '2023-clang15', cxx: 'clang++', build: 'Release', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON' }
- { image: '2023-clang15', cxx: 'clang++', build: 'Release', cmake: '' }
- { image: '2023-clang15', cxx: 'g++', build: 'Release', cmake: '' }
- { image: '2023-clang15', cxx: 'clang++', build: 'Debug', cmake: '' }
- { image: '2022-clang11', cxx: 'clang++', build: 'Release', cmake: '' }
- { image: '2022-clang11', cxx: 'g++', build: 'Release', cmake: '' }
- { image: '2021-clang10', cxx: 'clang++', build: 'Release', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON' }
- { image: '2021-clang10', cxx: 'g++', build: 'Release', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON' }
fail-fast: false
steps:
- uses: actions/checkout@v3
- name: nanobind
run: ./ci/install_nanobind.sh 2.5.0
# 2026 images are broken with gtest/glfw installs
- name: deps
if: contains(matrix.config.image, '2026')
run: ./ci/install_gtest.sh latest
- name: pybind11
#if: contains(matrix.config.image, '2023') == false
run: ./ci/install_pybind11.sh 2.10.0
- name: timestamp
id: timestamp
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
@@ -96,11 +94,12 @@ jobs:
run: >
./ci/build.sh -v
--build-type=${{ matrix.config.build }}
--components='core,python,axcore,axbin,axtest'
--components='core,python,bin,axcore,axbin,axtest'
--cargs=\"
${{ matrix.config.cmake }}
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
-DUSE_EXPLICIT_INSTANTIATION=OFF
-DOPENVDB_CXX_STRICT=ON
\"
- name: test
run: cd build && ctest -V
@@ -123,30 +122,24 @@ jobs:
strategy:
matrix:
config:
- { runner: 'macos-15', cxx: 'clang++', build: 'Release', llvm: '21' }
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '21' }
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '20' }
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '19' }
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '18' }
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '17' }
- { runner: 'macos-14', cxx: 'clang++', build: 'Release', llvm: '16' }
#@note llvm10 never got its own brew formula...
- { runner: 'macos-latest', cxx: 'clang++', build: 'Release', llvm: '11' }
- { runner: 'macos-latest', cxx: 'clang++', build: 'Release', llvm: '12' }
- { runner: 'macos-latest', cxx: 'clang++', build: 'Release', llvm: '13' }
fail-fast: false
steps:
- uses: actions/checkout@v3
- name: install_deps
run: |
./ci/install_macos.sh ${{ matrix.config.llvm }}
./ci/install_tbb_macos.sh
run: ./ci/install_macos.sh ${{ matrix.config.llvm }}
- name: build
run: >
./ci/build.sh -v
--build-type=${{ matrix.config.build }}
--components="core,python,axcore,axbin,axtest"
--components="core,python,bin,axcore,axbin,axtest"
--cargs=\"
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
-DUSE_EXPLICIT_INSTANTIATION=OFF
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install
-DLLVM_DIR=/opt/homebrew/opt/llvm@${{ matrix.config.llvm }}/lib/cmake/llvm
-DLLVM_DIR=/usr/local/opt/llvm@${{ matrix.config.llvm }}/lib/cmake/llvm
\"
- name: test
run: cd build && ctest -V
@@ -157,15 +150,15 @@ jobs:
if: |
github.event_name == 'workflow_dispatch' &&
github.event.inputs.type == 'grammar'
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
container:
image: aswf/ci-openvdb:2025-clang19.1
image: aswf/ci-openvdb:2022-clang11
steps:
- uses: actions/checkout@v3
- name: build
run: ./ci/build.sh -v --components=axgr --target=openvdb_ax_grammar --cargs=\"-DOPENVDB_AX_GRAMMAR_NO_LINES=ON\"
- name: upload grammar
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v2
with:
name: ax_grammar
path: ./build/openvdb_ax/openvdb_ax/openvdb_ax/grammar
+64 -61
View File
@@ -15,12 +15,9 @@ on:
- 'openvdb_houdini/**'
- 'openvdb_ax/**'
- 'nanovdb/**'
- 'fvdb/**'
- 'pendingchanges/**'
- '**.md'
pull_request:
# Add 'ready_for_review' to run CI when a draft PR is marked ready.
types: [opened, synchronize, reopened, ready_for_review]
branches:
- '**'
paths-ignore:
@@ -31,9 +28,14 @@ on:
- 'openvdb_houdini/**'
- 'openvdb_ax/**'
- 'nanovdb/**'
- 'fvdb/**'
- 'pendingchanges/**'
- '**.md'
schedule:
# run this workflow every day at 7am UTC except Monday
- cron: '0 7 * * 0,2-6'
# run this workflow Monday 7am UTC
# warning: This pattern is checked in various places below
- cron: '0 7 * * 1'
workflow_dispatch:
inputs:
type:
@@ -55,13 +57,15 @@ jobs:
# VFX platform jobs. These are run on the appropriate CentOS images from
# the provided ASWF docker containers
if: |
(github.event_name == 'push' ||
(github.event_name == 'pull_request' && github.event.pull_request.draft == false) ||
(github.event_name == 'workflow_dispatch' &&
(github.event.inputs.type == 'all' || github.event.inputs.type == 'linux')))
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
github.event_name != 'workflow_dispatch' ||
github.event.inputs.type == 'all' ||
github.event.inputs.type == 'linux'
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
name: >
linux:${{ matrix.config.image }}-abi:${{ matrix.config.abi }}-cxx:${{ matrix.config.cxx }}-type:${{ matrix.config.build }}
linux-vfx:${{ matrix.config.image }}-
abi:${{ matrix.config.abi }}-
cxx:${{ matrix.config.cxx }}-
type:${{ matrix.config.build }}
container:
image: aswf/ci-openvdb:${{ matrix.config.image }}
env:
@@ -70,22 +74,22 @@ jobs:
strategy:
matrix:
config:
- { cxx: clang++, image: '2026', abi: '13', build: 'Release', cmake: '-DOPENVDB_USE_FUTURE_ABI_13=ON -DOPENVDB_ENABLE_ASSERTS=ON' }
- { cxx: g++, image: '2026', abi: '13', build: 'Release', cmake: '-DOPENVDB_USE_FUTURE_ABI_13=ON' }
- { cxx: clang++, image: '2026', abi: '13', build: 'Debug', cmake: '-DOPENVDB_USE_FUTURE_ABI_13=ON' }
- { cxx: clang++, image: '2025-clang19.1', abi: '12', build: 'Release', cmake: '' }
- { cxx: clang++, image: '2024-clang17.2', abi: '11', build: 'Release', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON' }
# @note we specifically use clang15.0 (not clang15) here as the newest
# versions of the clang15.X containers have some issues with the GLFW
# installation
- { cxx: clang++, image: '2023-clang15.0', abi: '11', build: 'Release', cmake: '' }
- { cxx: g++, image: '2023-clang15.0', abi: '11', build: 'Release', cmake: '' }
- { cxx: clang++, image: '2022-clang11', abi: '11', build: 'Debug', cmake: '' }
- { cxx: clang++, image: '2022-clang11', abi: '10', build: 'Release', cmake: '' }
- { cxx: g++, image: '2022-clang11', abi: '10', build: 'Release', cmake: '' }
- { cxx: clang++, image: '2022-clang11', abi: '9', build: 'Release', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON' }
- { cxx: g++, image: '2022-clang11', abi: '9', build: 'Release', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON' }
fail-fast: false
steps:
- uses: actions/checkout@v3
- name: nanobind
run: ./ci/install_nanobind.sh 2.5.0
# 2026 images are broken with gtest/glfw installs
- name: deps
if: contains(matrix.config.image, '2026')
run: |
./ci/install_gtest.sh latest
./ci/install_glfw.sh latest
- name: pybind11
#if: contains(matrix.config.image, '2023') == false
run: ./ci/install_pybind11.sh 2.10.0
- name: timestamp
id: timestamp
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
@@ -109,8 +113,9 @@ jobs:
-DOPENVDB_ABI_VERSION_NUMBER=${{ matrix.config.abi }}
\"
- name: test
# Skip Debug on commits as they take a while.
if: github.event_name == 'workflow_dispatch' || matrix.config.build == 'Release'
# Always run tests on weekly builds but skip Debug on commits as they take a while.
# https://github.community/t/distinct-job-for-each-schedule/17811/2
if: contains(github.event.schedule, '0 7 * * 1') || matrix.config.build == 'Release'
run: |
cd build && ctest -V
cd - && ./ci/test_install.sh
@@ -120,17 +125,29 @@ jobs:
run: ccache --evict-older-than 1d
windows:
# Windows CI. Tests a dynamic build with MD.
# Windows CI. Tests static and dynamic builds with MT and MD respectively.
if: |
(github.event_name == 'push' ||
(github.event_name == 'pull_request' && github.event.pull_request.draft == false) ||
(github.event_name == 'workflow_dispatch' &&
(github.event.inputs.type == 'all' || github.event.inputs.type == 'win')))
github.event_name != 'workflow_dispatch' ||
github.event.inputs.type == 'all' ||
github.event.inputs.type == 'win'
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'windows-2022-8c-32g-300h') || 'windows-latest' }}
name: windows
name: windows-vc:${{ matrix.config.vc }}-type:${{ matrix.config.build }}
env:
VCPKG_DEFAULT_TRIPLET: x64-windows
VCPKG_DEFAULT_TRIPLET: ${{ matrix.config.vc }}
strategy:
matrix:
config:
# static build of blosc from vcpkg does not build internal sources.
# USE_STATIC_DEPENDENCIES is required for IlmBase/OpenEXR defines and
# Boost as both shared and static libs are installed.
# USE_EXPLICIT_INSTANTIATION is disabled for debug static libraries
# due to disk space constraints
# @note Commented out the static debug build due to linker OOM LNK1102
- { vc: 'x64-windows-static', components: 'core,bin,view,render,test', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
#- { vc: 'x64-windows-static', components: 'core,bin,view,render,test', build: 'Debug', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON -DUSE_EXPLICIT_INSTANTIATION=OFF' }
- { vc: 'x64-windows', components: 'core,bin,view,render,python,test', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
- { vc: 'x64-windows', components: 'core,bin,view,render,python,test', build: 'Debug', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
#- { vc: 'x64-windows', build: 'Release', cmake: '-G \"MinGW Makefiles\" -DOPENVDB_CORE_STATIC=OFF' }
fail-fast: false
steps:
- uses: actions/checkout@v3
@@ -138,21 +155,17 @@ jobs:
shell: pwsh
run: |
# note: system path must be modified in a previous step to it's use
echo "$Env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
echo "${{github.workspace}}\build\openvdb\openvdb\Release" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
echo "$Env:VCPKG_INSTALLATION_ROOT\installed\${{ matrix.config.vc }}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
echo "${{github.workspace}}\build\openvdb\openvdb\${{ matrix.config.build }}" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
- name: install
shell: powershell
run: .\ci\install_windows.ps1
- name: install_numpy
shell: powershell
run: .\ci\install_windows_numpy.ps1
run: ./ci/install_windows.sh
- name: build
run: >
./ci/build.sh -v
--config='Release'
--components='core,bin,view,render,python,test'
--config=${{ matrix.config.build }}
--components=${{ matrix.config.components }}
--cargs=\'
-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF
${{ matrix.config.cmake }}
-DMSVC_COMPRESS_PDB=ON
-DUSE_EXR=ON
-DUSE_PNG=ON
@@ -163,37 +176,27 @@ jobs:
# Print the build directy size (monitor if we're hitting runner limits)
run: du -h build
- name: test
run: cd build && ctest -V -C Release
# Always run tests on weekly builds but skip Debug on commits as they take a while.
# https://github.community/t/distinct-job-for-each-schedule/17811/2
if: contains(github.event.schedule, '0 7 * * 1') || matrix.config.build == 'Release'
run: cd build && ctest -V -C ${{ matrix.config.build }}
macos:
if: |
(github.event_name == 'push' ||
(github.event_name == 'pull_request' && github.event.pull_request.draft == false) ||
(github.event_name == 'workflow_dispatch' &&
(github.event.inputs.type == 'all' || github.event.inputs.type == 'mac')))
runs-on: ${{ matrix.config.image }}
name: ${{ matrix.config.image }}
github.event_name != 'workflow_dispatch' ||
github.event.inputs.type == 'all' ||
github.event.inputs.type == 'mac'
runs-on: macos-latest
env:
CXX: clang++
strategy:
matrix:
config:
- { image: macos-14 }
- { image: macos-15 }
steps:
- uses: actions/checkout@v3
- name: install
run: |
./ci/install_macos.sh
./ci/install_tbb_macos.sh
run: ./ci/install_macos.sh
- name: build
run: >
./ci/build.sh -v
--build-type=Release
--components=\"core,python,bin,view,render,test\"
--cargs=\'
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install
\'
- name: test
run: cd build && ctest -V
+21 -41
View File
@@ -11,6 +11,7 @@ on:
- 'CHANGES'
- 'openvdb_maya/**'
- 'pendingchanges/**'
- '**.md'
pull_request:
branches:
- '**'
@@ -18,6 +19,7 @@ on:
- 'CHANGES'
- 'openvdb_maya/**'
- 'pendingchanges/**'
- '**.md'
workflow_dispatch:
inputs:
deploy:
@@ -31,41 +33,26 @@ concurrency:
cancel-in-progress: true
jobs:
validate_docs:
# Cheap static checks that run before the heavier doxygen build:
# * every #include <...> referenced from a fenced code block in doc/ resolves
# * every github.com/.../blob/<branch>/<path> URL points to a file on disk
# Catches the class of docs-rot from issue #2161 (e.g. nanovdb::util ->
# nanovdb::tools rename) before the doxygen job runs.
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: set_up_python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: run_validator
run: python3 ci/validate_docs_references.py
doxygen:
needs: validate_docs
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
runs-on: ubuntu-latest
env:
CXX: g++
container:
image: aswf/ci-openvdb:2026
# @note We can't update this as epydoc doesn't support python3. We'll
# need to re-write the python docs to use sphinx
image: aswf/ci-openvdb:2022
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v3
- name: install_doxygen
run: ./ci/install_doxygen.sh 1_14_0
- name: nanobind
run: ./ci/install_nanobind.sh 2.5.0
run: ./ci/install_doxygen.sh 1_8_11
- name: pybind11
#if: contains(matrix.config.image, '2023') == false
run: ./ci/install_pybind11.sh 2.10.0
# - name: install_epydoc
# run: pip install epydoc
- name: install_latex
run: yum -y install texlive-latex-bin texlive-dvips texlive-collection-fontsrecommended texlive-collection-latexrecommended
- name: build
# Doxygen's native WARN_AS_ERROR=FAIL_ON_WARNINGS gates the docs build:
# any warning fails the job. FAIL_ON_WARNINGS still generates the docs and
# writes the full warning log first, so the artifact step below captures
# it for debugging. Enabled via OPENVDB_DOXYGEN_WARN_AS_ERROR (see
# doc/CMakeLists.txt).
run: >
./ci/build.sh -v
--build-type=Release
@@ -76,18 +63,10 @@ jobs:
-DOPENVDB_PYTHON_WRAP_ALL_GRID_TYPES=ON
-DUSE_EXPLICIT_INSTANTIATION=OFF
-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON
-DOPENVDB_DOXYGEN_WARN_AS_ERROR=ON
\"
- name: upload_doxygen_warning_log
# Always upload so contributors can debug failed PR builds without
# having to reproduce the doxygen environment locally.
if: always()
uses: actions/upload-artifact@v4
with:
name: doxygen-warnings
path: build/doc/doxygen.warnings.log
if-no-files-found: ignore
retention-days: 14
# - name: epydoc
# run: |
# epydoc --html -o /usr/local/share/doc/OpenVDB/html/python pyopenvdb
- name: pre_deploy
# Overwrite global SSH configuration
# https://github.com/peaceiris/actions-gh-pages/issues/719
@@ -105,7 +84,7 @@ jobs:
github.event.inputs.deploy == 'docs'
uses: peaceiris/actions-gh-pages@v3
with:
deploy_key: ${{ secrets.PRIVATE_KEY }}
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
publish_dir: /usr/local/share/doc/OpenVDB/html
destination_dir: documentation/doxygen
external_repository: AcademySoftwareFoundation/openvdb-website
@@ -126,7 +105,7 @@ jobs:
github.event.inputs.deploy == 'coverage'
runs-on: ubuntu-latest
container:
image: aswf/ci-openvdb:2025-clang19.1
image: aswf/ci-openvdb:2023
env:
CXX: g++
steps:
@@ -176,3 +155,4 @@ jobs:
- Deployed from: AcademySoftwareFoundation/openvdb ${{ github.sha }}
Signed-off-by: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>"
+25 -19
View File
@@ -13,7 +13,6 @@ on:
- 'doc/**'
- 'nanovdb/**'
- 'openvdb_maya/**'
- 'fvdb/**'
- 'pendingchanges/**'
- '**.md'
pull_request:
@@ -25,9 +24,11 @@ on:
- 'doc/**'
- 'nanovdb/**'
- 'openvdb_maya/**'
- 'fvdb/**'
- 'pendingchanges/**'
- '**.md'
schedule:
# run this workflow every day 7am UTC
- cron: '0 7 * * *'
workflow_dispatch:
# Allow subsequent pushes to the same PR or REF to cancel any previous jobs.
@@ -62,8 +63,8 @@ jobs:
if: >
${{ needs.checksecret.outputs.HOUDINI_SECRETS == 'true' ||
github.repository_owner == 'AcademySoftwareFoundation' }}
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
name: hou:${{ matrix.config.hou_hash }}-vfx:${{ matrix.config.image }}-cxx:${{ matrix.config.cxx }}-build:${{ matrix.config.build }}
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
name: hou:${{ matrix.config.hou_hash }}-vfx:${{ matrix.config.image }}-cxx:${{ matrix.config.cxx }}
container:
image: aswf/ci-base:${{ matrix.config.image }}
env:
@@ -72,18 +73,22 @@ jobs:
strategy:
matrix:
config:
- { cxx: clang++, image: '2026', hou_hash: '21_0', build: 'Release', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
- { cxx: clang++, image: '2026', hou_hash: '21_0', build: 'Debug', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
- { cxx: g++, image: '2026', hou_hash: '21_0', build: 'Release', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
- { cxx: clang++, image: '2024', hou_hash: '20_5', build: 'Release', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
- { cxx: g++, image: '2024', hou_hash: '20_5', build: 'Release', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
- { cxx: clang++, image: '2023.0', hou_hash: '20_0-newabi', build: 'Release', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
- { cxx: clang++, image: '2022', hou_hash: '20_0-oldabi', build: 'Release', components: 'core,hou' }
- { cxx: clang++, image: '2021', hou_hash: '19_5', build: 'Release', components: 'core,hou' }
- { cxx: clang++, image: '2023.0', hou_hash: '20_0-newabi', build: 'Debug', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
- { cxx: g++, image: '2023.0', hou_hash: '20_0-newabi', build: 'Release', components: 'core,hou,bin,view,render,python,test,axcore,axbin,axtest' }
- { cxx: g++, image: '2022', hou_hash: '20_0-oldabi', build: 'Release', components: 'core,hou' }
fail-fast: false
steps:
# See note on this step in the Houdini weekly.yml job
# We can remove this when we no longer use < 2023 images
- name: remove zstd
run: yum -y remove zstd
- uses: actions/checkout@v3
- name: nanobind
run: ./ci/install_nanobind.sh 2.5.0
- name: install_gtest
run: ./ci/install_gtest.sh latest
- name: pybind11
#if: contains(matrix.config.image, '2023') == false
run: ./ci/install_pybind11.sh 2.10.0
- name: timestamp
id: timestamp
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
@@ -114,7 +119,7 @@ jobs:
- name: build
run: |
./ci/build.sh -v \
--build-type="${{ matrix.config.build }}" \
--build-type=Release \
--components="${{ matrix.config.components }}" \
--cargs=\" \
-DHOUDINI_ROOT=$HOME/houdini_install/hou \
@@ -124,7 +129,6 @@ jobs:
-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON \
\"
- name: test
if: matrix.config.build == 'Release'
run: cd build && ctest -V
# Keep ccache light by stripping out any caches not accessed in the last day
- name: ccache_clean
@@ -155,12 +159,15 @@ jobs:
cp hou/hou.tar.gz $HOME/houdini_install/hou.tar.gz
cd $HOME/houdini_install && tar -xzf hou.tar.gz && cd -
- name: install_deps
run: ./ci/install_macos.sh 20
run: |
brew update
brew install bash gnu-getopt cmake boost glfw googletest openexr pybind11 llvm@15 cppunit
echo "/usr/local/opt/gnu-getopt/bin" >> $GITHUB_PATH
- name: build
run: |
./ci/build.sh -v \
--build-type=Release \
--components="core,hou,bin,view,render,test,axcore,axbin" \
--components="core,hou,bin,view,render,python,test,axcore,axbin,axtest" \
--cargs=\" \
-DHOUDINI_ROOT=$HOME/houdini_install/hou \
-DOPENVDB_BUILD_HOUDINI_ABITESTS=OFF \
@@ -168,8 +175,7 @@ jobs:
-DDISABLE_CMAKE_SEARCH_PATHS=ON \
-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON \
-DUSE_EXPLICIT_INSTANTIATION=OFF \
-DLLVM_DIR=/opt/homebrew/opt/llvm@20/lib/cmake/llvm \
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install \
-DLLVM_DIR=/usr/local/opt/llvm@15/lib/cmake/llvm \
\"
- name: test
run: cd build && ctest -V
+63 -68
View File
@@ -14,12 +14,9 @@ on:
- 'openvdb_ax/**'
- 'openvdb_maya/**'
- 'openvdb_houdini/**'
- 'fvdb/**'
- 'pendingchanges/**'
- '**.md'
pull_request:
# Add 'ready_for_review' to run CI when a draft PR is marked ready.
types: [opened, synchronize, reopened, ready_for_review]
branches:
- '**'
paths-ignore:
@@ -29,9 +26,11 @@ on:
- 'openvdb_ax/**'
- 'openvdb_maya/**'
- 'openvdb_houdini/**'
- 'fvdb/**'
- 'pendingchanges/**'
- '**.md'
schedule:
# run this workflow every day 7am UTC
- cron: '0 7 * * *'
workflow_dispatch:
inputs:
type:
@@ -46,13 +45,11 @@ concurrency:
jobs:
linux-nanovdb:
# push OR non-draft PR OR matching manual run
if: |
(github.event_name == 'push' ||
(github.event_name == 'pull_request' && github.event.pull_request.draft == false) ||
(github.event_name == 'workflow_dispatch' &&
(github.event.inputs.type == 'all' || github.event.inputs.type == 'linux')))
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
github.event_name != 'workflow_dispatch' ||
github.event.inputs.type == 'all' ||
github.event.inputs.type == 'linux'
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
name: >
linux-nanovdb:cxx:${{ matrix.config.cxx }}-${{ matrix.config.build }}
container:
@@ -62,137 +59,135 @@ jobs:
strategy:
matrix:
config:
- { cxx: g++, image: '2024-clang17.2', build: 'Release' }
- { cxx: g++, image: '2024-clang17.2', build: 'Debug' }
- { cxx: clang++, image: '2024-clang17.2', build: 'Release' }
- { cxx: clang++, image: '2024-clang17.2', build: 'Debug' }
- { cxx: g++, image: '2022-clang11', build: 'Release' }
- { cxx: g++, image: '2022-clang11', build: 'Debug' }
- { cxx: clang++, image: '2022-clang11', build: 'Release' }
- { cxx: clang++, image: '2022-clang11', build: 'Debug' }
fail-fast: false
steps:
- uses: actions/checkout@v3
- name: setup_cuda_12
- name: install_cuda_11
run: |
echo "/usr/local/cuda-12/bin" >> $GITHUB_PATH
echo "LD_LIBRARY_PATH=/usr/local/cuda-12/lib64:$LD_LIBRARY_PATH" >> $GITHUB_ENV
- name: nanobind
run: ./ci/install_nanobind.sh 2.5.0
yum -y install yum-utils
yum-config-manager --add-repo http://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-rhel7.repo
echo "Installing cuda toolkit"
yum --enablerepo=epel -y install cuda-toolkit-11-6
echo "/usr/local/cuda-11.6/bin" >> $GITHUB_PATH
echo "LD_LIBRARY_PATH=/usr/local/cuda-11.6/lib64:$LD_LIBRARY_PATH" >> $GITHUB_ENV
- name: build
# NOTE: CMAKE_POSITION_INDEPENDENT_CODE set to fix default behaviour change in clang 14
# https://github.com/AcademySoftwareFoundation/aswf-docker/issues/228
run: >
./ci/build.sh -v
--build-type=${{ matrix.config.build }}
--components=core,nano,nanotest,nanoexam,nanobench,nanotool,nanopython,nanopytest
--components=core,nano,nanotest,nanoexam,nanobench,nanotool
--cargs=\'
-DUSE_EXPLICIT_INSTANTIATION=OFF
-DNANOVDB_USE_CUDA=ON
-DCMAKE_CUDA_ARCHITECTURES="80"
-DNANOVDB_USE_OPENVDB=ON
-DCMAKE_INSTALL_PREFIX=`pwd`
-DUSE_BLOSC=ON
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
-DUSE_BLOSC=OFF
\'
- name: test
run: cd build && sudo ctest -V -E ".*cuda.*|.*mgpu.*"
run: cd build && sudo ctest -V -E ".*cuda.*"
windows-nanovdb:
if: |
(github.event_name == 'push' ||
(github.event_name == 'pull_request' && github.event.pull_request.draft == false) ||
(github.event_name == 'workflow_dispatch' &&
(github.event.inputs.type == 'all' || github.event.inputs.type == 'win')))
github.event_name != 'workflow_dispatch' ||
github.event.inputs.type == 'all' ||
github.event.inputs.type == 'win'
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'windows-2022-8c-32g-300h') || 'windows-latest' }}
env:
VCPKG_DEFAULT_TRIPLET: 'x64-windows'
VCPKG_DEFAULT_TRIPLET: ${{ matrix.config.vc }}
visual_studio: "Visual Studio 17 2022"
cuda: "12.4.0"
cuda: "11.6.2"
strategy:
matrix:
config:
# static build of blosc from vcpkg does not build internal sources.
# USE_STATIC_DEPENDENCIES is required for IlmBase/OpenEXR defines and
# Boost as both shared and static libs are installed.
- { vc: 'x64-windows-static', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded' }
- { vc: 'x64-windows-static', build: 'Debug', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebug' }
- { vc: 'x64-windows', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
- { vc: 'x64-windows', build: 'Debug', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
fail-fast: false
steps:
- uses: actions/checkout@v3
- name: path
run: |
# note: system path must be modified in a previous step to it's use
echo "$Env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
echo "${{github.workspace}}\build\openvdb\openvdb\Release" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
echo "$Env:VCPKG_INSTALLATION_ROOT\installed\${{ matrix.config.vc }}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
echo "${{github.workspace}}\build\openvdb\openvdb\${{ matrix.config.build }}" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
- name: install_cuda
shell: powershell
run: .\ci\install_windows_cuda.ps1
- name: install
shell: powershell
run: .\ci\install_windows.ps1
- name: install_numpy
shell: powershell
run: .\ci\install_windows_numpy.ps1
- name: install_deps
shell: bash
run: |
vcpkg update
vcpkg install zlib tbb gtest blosc boost-iostreams boost-system boost-any boost-uuid boost-interprocess boost-algorithm
- name: build
# nvcc doesn't set _WIN32 when run in bash so we need to set it manually
shell: bash
run: >
./ci/build.sh -v
--config=Release
--components=core,nano,nanotest,nanoexam,nanobench,nanotool,nanopython,nanopytest
--config=${{ matrix.config.build }}
--components=core,nano,nanotest,nanoexam,nanobench,nanotool
--cargs=\'
-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF
${{ matrix.config.cmake }}
-DMSVC_COMPRESS_PDB=ON
-DUSE_EXPLICIT_INSTANTIATION=OFF
-DNANOVDB_USE_CUDA=ON
-DCMAKE_CUDA_ARCHITECTURES="80"
-DCMAKE_CUDA_FLAGS="-D_WIN32"
-DNANOVDB_USE_OPENVDB=ON
-DVCPKG_TARGET_TRIPLET=${VCPKG_DEFAULT_TRIPLET}
-DCMAKE_TOOLCHAIN_FILE=\"${VCPKG_INSTALLATION_ROOT}\\scripts\\buildsystems\\vcpkg.cmake\"
\'
- name: test
shell: bash
run: cd build && ctest -V -C Release -E ".*cuda.*|.*mgpu.*"
run: cd build && ctest -V -E ".*cuda.*"
macos-nanovdb:
if: |
(github.event_name == 'push' ||
(github.event_name == 'pull_request' && github.event.pull_request.draft == false) ||
(github.event_name == 'workflow_dispatch' &&
(github.event.inputs.type == 'all' || github.event.inputs.type == 'mac')))
github.event_name != 'workflow_dispatch' ||
github.event.inputs.type == 'all' ||
github.event.inputs.type == 'mac'
runs-on: ${{ matrix.config.runner }}
env:
CXX: ${{ matrix.config.cxx }}
strategy:
matrix:
config:
- { runner: 'macos-14', cxx: 'clang++', build: 'Release' }
- { runner: 'macos-14', cxx: 'clang++', build: 'Debug' }
- { runner: 'macos-11', cxx: 'clang++', build: 'Release' }
- { runner: 'macos-11', cxx: 'clang++', build: 'Debug' }
fail-fast: false
steps:
- uses: actions/checkout@v3
- name: install_deps
run: |
./ci/install_macos.sh
./ci/install_tbb_macos.sh
run: ./ci/install_macos.sh
- name: build
run: >
./ci/build.sh -v
--build-type=${{ matrix.config.build }}
--components=core,nano,nanotest,nanoexam,nanobench,nanotool,nanopython,nanopytest
--cargs=\'-DUSE_EXPLICIT_INSTANTIATION=OFF -DNANOVDB_USE_CUDA=OFF -DNANOVDB_USE_OPENVDB=ON -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install \'
--components=core,nano,nanotest,nanoexam,nanobench,nanotool
--cargs=\'-DUSE_EXPLICIT_INSTANTIATION=OFF -DNANOVDB_USE_CUDA=OFF -DNANOVDB_USE_OPENVDB=ON\'
- name: test
run: cd build && ctest -V -E ".*cuda.*|.*mgpu.*"
run: cd build && ctest -V -E ".*cuda.*"
nanovdb-lite:
if: |
(github.event_name == 'push' ||
(github.event_name == 'pull_request' && github.event.pull_request.draft == false) ||
(github.event_name == 'workflow_dispatch' &&
(github.event.inputs.type == 'all' || github.event.inputs.type == 'linux')))
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
container:
image: aswf/ci-openvdb:2024-clang17.2
github.event_name != 'workflow_dispatch' ||
github.event.inputs.type == 'all' ||
github.event.inputs.type == 'linux'
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
steps:
- uses: actions/checkout@v3
- name: install_gtest
run: ./ci/install_gtest.sh latest
run: |
sudo apt-get update
sudo apt-get -q install -y libgtest-dev
- name: build_and_test
run: |
cd nanovdb/nanovdb
sudo mkdir .build
cd .build
sudo cmake -DUSE_EXPLICIT_INSTANTIATION=OFF -DNANOVDB_BUILD_UNITTESTS=ON -DNANOVDB_USE_OPENVDB=OFF -DNANOVDB_USE_CUDA=OFF ../
sudo cmake -DUSE_EXPLICIT_INSTANTIATION=OFF -DNANOVDB_BUILD_UNITTESTS=ON ../
sudo make -j8 install
sudo ctest -V
-55
View File
@@ -1,55 +0,0 @@
name: TEACHME
# Compile-checks the NanoVDB TEACHME tutorial against the real headers. Runs
# when EITHER the NanoVDB headers or the tutorial change, so an API change that
# breaks a lesson code block is caught here (the whole point of the harness).
# Compile-only: no GPU is required.
on:
push:
branches:
- 'master'
- 'feature/**'
- 'pr/**'
paths:
- 'nanovdb/nanovdb/**'
- 'doc/nanovdb/TEACHME/**'
- '.github/workflows/teachme.yml'
pull_request:
branches:
- '**'
paths:
- 'nanovdb/nanovdb/**'
- 'doc/nanovdb/TEACHME/**'
- '.github/workflows/teachme.yml'
workflow_dispatch:
# Allow subsequent pushes to the same PR or REF to cancel any previous jobs.
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
teachme-docs-compile:
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
name: teachme-docs-compile
container:
image: aswf/ci-openvdb:2024-clang17.2
env:
# Compile-only target; matches the arch used by the other NanoVDB jobs.
CUDAARCHS: "80"
# Each TU compiles the kitchen-sink fixture (most of NanoVDB's heavy
# headers), so nvcc is memory-hungry. Cap parallel compiles to stay
# within the runner's RAM — unbounded -j OOMs the 8-core/32 GB runner.
TEACHME_JOBS: "4"
steps:
- uses: actions/checkout@v3
- name: setup_cuda_12
run: |
echo "/usr/local/cuda-12/bin" >> $GITHUB_PATH
echo "LD_LIBRARY_PATH=/usr/local/cuda-12/lib64:$LD_LIBRARY_PATH" >> $GITHUB_ENV
- name: run_harness
# Reference-checks every #include / prose header path, then compiles
# every tagged code block. The OpenVDB-dependent blocks are skipped
# (still reference-checked) when OpenVDB is not installed in the image.
run: bash doc/nanovdb/TEACHME/test/run.sh
+72 -199
View File
@@ -61,7 +61,7 @@ jobs:
(github.event_name != 'workflow_dispatch' ||
github.event.inputs.type == 'all' ||
github.event.inputs.type == 'houdini')
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
name: linux-houdini:${{ matrix.config.hou_hash }}
env:
CXX: clang++
@@ -70,13 +70,24 @@ jobs:
strategy:
matrix:
config:
- { houdini_version: '21.0', platform: 'linux_x86_64_gcc11.2', hou_hash: '21_0' }
- { houdini_version: '20.5', platform: 'linux_x86_64_gcc11.2', hou_hash: '20_5' }
- { houdini_version: '19.5', platform: 'linux_x86_64_gcc9.3', hou_hash: '19_5' }
- { houdini_version: '20.0', platform: 'linux_x86_64_gcc9.3', hou_hash: '20_0-oldabi' }
- { houdini_version: '20.0', platform: 'linux_x86_64_gcc11.2', hou_hash: '20_0-newabi' }
fail-fast: false
container:
image: aswf/ci-base:2024
image: aswf/ci-base:2023
steps:
- uses: actions/checkout@v3
# We bumped from the 2021 CI image to 2023 here to fix some OpenSSL issues
# with the Houdini download script. In so doing we broke some of the caching
# between this job and the jobs in houdini.yml which _don't_ use the 2023
# image yet. The issue is that the cache action will use zstd if it's
# available to zip the cache and this causes it to be inserted with a unique
# hash which images without zstd (i.e. the 2021/2022 images don't have
# access to). For now, uninstall zstd here instead of installing it
# everywhere and ask the LF to add zstd to the older base images.
- name: remove zstd
run: yum -y remove zstd
- name: timestamp
id: timestamp
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
@@ -100,10 +111,8 @@ jobs:
(github.event_name != 'workflow_dispatch' ||
github.event.inputs.type == 'all' ||
github.event.inputs.type == 'houdini')
# Note that macos-14 (current macos-latest) switches to M1. We could instead test
# the arm build here instead of the x86 one.
runs-on: macos-latest
name: macos-houdini
name: macos-houdini-20
env:
HOUDINI_CLIENT_ID: ${{ secrets.HOUDINI_CLIENT_ID }}
HOUDINI_SECRET_KEY: ${{ secrets.HOUDINI_SECRET_KEY }}
@@ -113,7 +122,7 @@ jobs:
id: timestamp
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
- name: download_houdini
run: ./ci/download_houdini.sh 21.0 macosx_arm64_clang15.0_14 --prod
run: ./ci/download_houdini.sh 20.0 macosx_x86_64_clang12.0_11 --prod
- name: install_houdini
run: |
mkdir $HOME/houdini_install
@@ -136,37 +145,34 @@ jobs:
github.event_name != 'workflow_dispatch' ||
github.event.inputs.type == 'all' ||
github.event.inputs.type == 'extra'
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
name: linux-extra:${{ matrix.config.name }}
container:
image: aswf/ci-openvdb:${{ matrix.config.image }}
# @note we specifically use clang15.0 (not clang15) here as the newest
# versions of the clang15.X containers have some issues with the GLFW
# installation
image: aswf/ci-openvdb:2023-clang15.0
env:
CXX: clang++
strategy:
matrix:
config:
- { name: 'all', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DUSE_BLOSC=ON -DUSE_ZLIB=ON -DUSE_EXR=ON -DUSE_PNG=ON' }
- { name: 'lite', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DUSE_BLOSC=OFF -DUSE_ZLIB=OFF -DUSE_EXR=OFF -DUSE_PNG=OFF -DOPENVDB_USE_DELAYED_LOADING=OFF' }
- { name: 'half', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DUSE_BLOSC=OFF -DUSE_IMATH_HALF=ON' }
- { name: 'simd', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DOPENVDB_X86_INSTRSET=7 -DUSE_VCL=ON' } # 7=AVX
- { name: 'pygrid', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DOPENVDB_PYTHON_WRAP_ALL_GRID_TYPES=ON' }
- { name: 'asan', image: '2026', build: 'asan', components: 'core,test', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON -DNANOVDB_USE_OPENVDB=ON -DOPENVDB_AX_STATIC=OFF -DOPENVDB_CORE_STATIC=OFF -DUSE_BLOSC=OFF' } # We never called blosc_destroy(), so disable blosc to silence these errors
- { name: 'ubsan', image: '2026', build: 'ubsan', components: 'core,test', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON -DCMAKE_CXX_FLAGS="-Wno-deprecated-declarations" ' }
- { name: 'c++20', image: '2026', build: 'Release', components: 'core,test', cmake: '-DCMAKE_CXX_STANDARD=20' }
- { name: 'conf', image: '2026', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON' }
- { name: 'all', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DUSE_BLOSC=ON -DUSE_ZLIB=ON -DUSE_EXR=ON -DUSE_PNG=ON' }
- { name: 'lite', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DUSE_BLOSC=OFF -DUSE_ZLIB=OFF -DUSE_EXR=OFF -DUSE_PNG=OFF -DOPENVDB_USE_DELAYED_LOADING=OFF' }
- { name: 'half', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DUSE_BLOSC=OFF -DUSE_IMATH_HALF=ON' }
- { name: 'sse', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DOPENVDB_SIMD=SSE42' }
- { name: 'avx', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DOPENVDB_SIMD=AVX' }
- { name: 'numpy', build: 'Release', components: 'core,python,bin,view,render,test', cmake: '-DUSE_NUMPY=ON -DOPENVDB_PYTHON_WRAP_ALL_GRID_TYPES=ON' }
- { name: 'asan', build: 'asan', components: 'core,test,axcore,axtest', cmake: '-DNANOVDB_USE_OPENVDB=ON -DOPENVDB_AX_STATIC=OFF -DOPENVDB_CORE_STATIC=OFF -DUSE_BLOSC=OFF' } # We never called blosc_destroy(), so disable blosc to silence these errors
- { name: 'ubsan', build: 'ubsan', components: 'core,test,axcore,axtest', cmake: '' }
- { name: 'c++20', build: 'Release', components: 'core,test,axcore,axtest', cmake: '-DCMAKE_CXX_STANDARD=20' }
- { name: 'conf', build: 'Release', components: 'core,python,bin,view,render,test,axcore,axtest', cmake: '-DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON' }
fail-fast: false
steps:
- uses: actions/checkout@v3
- name: nanobind
run: ./ci/install_nanobind.sh 2.5.0
# 2026 images are broken with gtest/glfw/exr installs
- name: deps
if: contains(matrix.config.image, '2026')
run: |
./ci/install_gtest.sh latest
./ci/install_glfw.sh latest
./ci/install_imath.sh v3.2.2
./ci/install_exr.sh v3.2.2
- name: pybind11
#if: contains(container.image, '2023') == false
run: ./ci/install_pybind11.sh 2.10.0
- name: build
run: >
./ci/build.sh -v
@@ -188,23 +194,20 @@ jobs:
strategy:
matrix:
config:
# llvm-17 is currently the default which has symbol issues with the python module
- { runson: ubuntu-latest, cxx: g++, cmake: '-DOPENVDB_PYTHON_USE_AX=OFF' }
- { runson: ubuntu-latest, cxx: g++, cmake: '' }
# Disable the clang job for now. See https://github.com/actions/runner-images/issues/8659
# - { runson: ubuntu-latest, cxx: clang++, cmake: '' }
# @todo gcc on macos
- { runson: macos-latest, cxx: '', cmake: '-DLLVM_DIR=/opt/homebrew/opt/llvm@20/lib/cmake/llvm' }
- { runson: macos-latest, cxx: '', cmake: '-D CMAKE_CXX_COMPILER=/usr/local/opt/llvm@15/bin/clang++' }
fail-fast: false
steps:
- uses: actions/checkout@v3
- name: install_deps
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
sudo apt-get -q install -y libboost-dev libboost-iostreams-dev libtbb-dev libblosc-dev libgtest-dev libgmock-dev python3-numpy
./ci/install_nanobind.sh 2.5.0
sudo apt-get -q install -y libboost-dev libboost-iostreams-dev libtbb-dev libblosc-dev llvm-dev libgtest-dev libcppunit-dev pybind11-dev
elif [ "$RUNNER_OS" == "macOS" ]; then
./ci/install_macos.sh 20
./ci/install_tbb_macos.sh
./ci/install_macos.sh 15
else
echo "$RUNNER_OS not supported"; exit 1
fi
@@ -212,75 +215,11 @@ jobs:
run: >
./ci/build.sh -v
--build-type=Release
--components=\"core,axcore,python,bin,render,test,axbin\"
--cargs=\'
-DCMAKE_CXX_STANDARD=20
-DOPENVDB_USE_DELAYED_LOADING=OFF
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install
${{ matrix.config.cmake }}
\'
--components=\"core,axcore,python,bin,render,test,axtest,axbin\"
--cargs=\"-DCMAKE_CXX_STANDARD=20 -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install ${{ matrix.config.cmake }}\"
- name: test
run: cd build && ctest -V
windows:
# Windows CI. Tests static and dynamic builds with MT and MD respectively.
if: |
github.event_name != 'workflow_dispatch' ||
github.event.inputs.type == 'all' ||
github.event.inputs.type == 'win'
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'windows-2022-8c-32g-300h') || 'windows-latest' }}
name: windows-vc:${{ matrix.config.vc }}-type:${{ matrix.config.build }}
env:
VCPKG_DEFAULT_TRIPLET: ${{ matrix.config.vc }}
strategy:
matrix:
config:
# static build of blosc from vcpkg does not build internal sources.
# USE_STATIC_DEPENDENCIES is required for IlmBase/OpenEXR defines and
# Boost as both shared and static libs are installed.
# USE_EXPLICIT_INSTANTIATION is disabled for debug static libraries
# due to disk space constraints
- { vc: 'x64-windows-static', components: 'core,bin,view,render,test', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
- { vc: 'x64-windows', components: 'core,bin,view,render,python,test', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
- { vc: 'x64-windows', components: 'core,bin,view,render,python,test', build: 'Debug', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
fail-fast: false
steps:
- uses: actions/checkout@v3
- name: path
shell: pwsh
run: |
# note: system path must be modified in a previous step to it's use
echo "$Env:VCPKG_INSTALLATION_ROOT\installed\${{ matrix.config.vc }}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
echo "${{github.workspace}}\build\openvdb\openvdb\${{ matrix.config.build }}" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
- name: install
shell: powershell
run: .\ci\install_windows.ps1
- name: install_numpy
if: matrix.config.vc == 'x64-windows'
shell: powershell
run: .\ci\install_windows_numpy.ps1
- name: build
run: >
./ci/build.sh -v
--config=${{ matrix.config.build }}
--components=${{ matrix.config.components }}
--cargs=\'
${{ matrix.config.cmake }}
-DMSVC_COMPRESS_PDB=ON
-DUSE_EXR=ON
-DUSE_PNG=ON
-DVCPKG_TARGET_TRIPLET=${VCPKG_DEFAULT_TRIPLET}
-DCMAKE_TOOLCHAIN_FILE=\"${VCPKG_INSTALLATION_ROOT}\\scripts\\buildsystems\\vcpkg.cmake\"
\'
- name: size
# Print the build directy size (monitor if we're hitting runner limits)
run: du -h build
- name: test
# Always run tests on weekly builds but skip Debug on commits as they take a while.
# https://github.community/t/distinct-job-for-each-schedule/17811/2
if: contains(github.event.schedule, '0 7 * * 1') || matrix.config.build == 'Release'
run: cd build && ctest -V -C ${{ matrix.config.build }}
#############################################################################
############################ AX Library Extras ##############################
#############################################################################
@@ -290,7 +229,7 @@ jobs:
github.event_name != 'workflow_dispatch' ||
github.event.inputs.type == 'all' ||
github.event.inputs.type == 'ax'
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
name: >
linux-ax:${{ matrix.config.image }}-cxx:${{ matrix.config.cxx }}-${{ matrix.config.build }}
container:
@@ -300,14 +239,22 @@ jobs:
strategy:
matrix:
config:
- { image: '2025-clang18.1', cxx: 'clang++', build: 'Release', components: 'core,axcore,axbin,axtest', cmake: '' }
# @note LLVM 17 builds are incompatible with the vdb python plugin on linux
- { image: '2024-clang17.2', cxx: 'clang++', build: 'Release', components: 'core,axcore,axbin,axtest', cmake: '-DOPENVDB_PYTHON_USE_AX=OFF' }
# Unified
- { image: '2022-clang14', cxx: 'clang++', build: 'Release', components: 'core,bin,axcore,axbin,axtest', cmake: '' }
- { image: '2022-clang14', cxx: 'g++', build: 'Release', components: 'core,bin,axcore,axbin,axtest', cmake: '' }
- { image: '2022-clang13', cxx: 'clang++', build: 'Release', components: 'core,bin,axcore,axbin,axtest', cmake: '' }
- { image: '2022-clang13', cxx: 'g++', build: 'Release', components: 'core,bin,axcore,axbin,axtest', cmake: '' }
# Standalone
- { image: '2021-clang10', cxx: 'clang++', build: 'Release', components: 'core', cmake: '-DDISABLE_DEPENDENCY_VERSION_CHECKS=ON' }
- { image: '2022-clang11', cxx: 'clang++', build: 'Debug', components: 'core', cmake: '' }
- { image: '2022-clang11', cxx: 'clang++', build: 'Release', components: 'core', cmake: '' }
- { image: '2022-clang11', cxx: 'g++', build: 'Release', components: 'core', cmake: '' }
fail-fast: false
steps:
- uses: actions/checkout@v3
- name: nanobind
run: ./ci/install_nanobind.sh 2.5.0
- name: pybind11
#f: contains(matrix.config.image, '2023') == false
run: ./ci/install_pybind11.sh 2.10.0
- name: build
run: >
./ci/build.sh -v
@@ -318,7 +265,6 @@ jobs:
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
-DUSE_EXPLICIT_INSTANTIATION=OFF
-DOPENVDB_CXX_STRICT=ON
-DOPENVDB_BUILD_VDB_TOOL=OFF
\"
- name: clean
if: matrix.config.components == 'core'
@@ -334,7 +280,6 @@ jobs:
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
-DUSE_EXPLICIT_INSTANTIATION=OFF
-DOPENVDB_CXX_STRICT=ON
-DOPENVDB_BUILD_VDB_TOOL=OFF
\"
- name: test
run: cd build && ctest -V
@@ -346,21 +291,21 @@ jobs:
github.event_name != 'workflow_dispatch' ||
github.event.inputs.type == 'all' ||
github.event.inputs.type == 'ax'
runs-on: ${{ matrix.config.runner }}
runs-on: macos-latest
name: macos-cxx:${{ matrix.config.cxx }}-llvm:${{ matrix.config.llvm }}-${{ matrix.config.build }}
env:
CXX: ${{ matrix.config.cxx }}
strategy:
matrix:
config:
- { runner: 'macos-latest', cxx: 'clang++', build: 'Release', llvm: '20' }
- { cxx: 'clang++', build: 'Release', llvm: '14' }
- { cxx: 'clang++', build: 'Release', llvm: '15' }
#- { cxx: 'clang++', build: 'Release', llvm: '16' } - not supported yet
fail-fast: false
steps:
- uses: actions/checkout@v3
- name: install_deps
run: |
./ci/install_macos.sh ${{ matrix.config.llvm }}
./ci/install_tbb_macos.sh
run: ./ci/install_macos.sh ${{ matrix.config.llvm }}
- name: build
run: >
./ci/build.sh -v
@@ -369,8 +314,7 @@ jobs:
--cargs=\"
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
-DUSE_EXPLICIT_INSTANTIATION=OFF
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install
-DLLVM_DIR=/opt/homebrew/opt/llvm@${{ matrix.config.llvm }}/lib/cmake/llvm
-DLLVM_DIR=/usr/local/opt/llvm@${{ matrix.config.llvm }}/lib/cmake/llvm
\"
- name: test
run: cd build && ctest -V
@@ -383,7 +327,7 @@ jobs:
github.event.inputs.type == 'all' ||
github.event.inputs.type == 'ax'
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'windows-2022-8c-32g-300h') || 'windows-latest' }}
name: ${{ matrix.config.vc }}-${{ matrix.config.crt }}-${{ matrix.config.build }}-llvm${{ matrix.config.llvm }}
name: windows-vc:${{ matrix.config.vc }}-type:${{ matrix.config.build }}
env:
VCPKG_DEFAULT_TRIPLET: ${{ matrix.config.vc }}
# Export this with '' avoid bash treating \ as escape
@@ -397,22 +341,16 @@ jobs:
# @todo We don't currently run the axtests with shared builds of ax
# due to symbol issues using LLVM as a static lib (which is the only
# option on Windows).
# @note currently only test static builds with MT as building LLVM as
# a shared lib on windows is a bit dicey
- { vc: 'x64-windows-static', llvm: '18.1.0', crt: 'MultiThreaded', components: 'core,axcore,axbin,axtest', build: 'Release', cmake: '-DOPENVDB_CORE_SHARED=OFF -DOPENVDB_AX_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
- { vc: 'x64-windows-static', llvm: '18.1.0', crt: 'MultiThreadedDebug', components: 'core,axcore,axbin,axtest', build: 'Debug', cmake: '-DOPENVDB_CORE_SHARED=OFF -DOPENVDB_AX_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
- { vc: 'x64-windows', llvm: '18.1.0', crt: 'MultiThreadedDLL', components: 'core,axcore,axbin', build: 'Release', cmake: '-DOPENVDB_CORE_STATIC=OFF -DOPENVDB_AX_STATIC=OFF' }
- { vc: 'x64-windows-static', llvm: '15.0.0', crt: 'MultiThreaded', components: 'core,axcore,axbin,axtest', build: 'Release', cmake: '-DOPENVDB_CORE_SHARED=OFF -DOPENVDB_AX_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
- { vc: 'x64-windows', crt: 'MD', components: 'core,bin,axcore,axbin,python', build: 'Release', cmake: '-DOPENVDB_CORE_STATIC=OFF -DOPENVDB_AX_STATIC=OFF' }
- { vc: 'x64-windows-static', crt: 'MT', components: 'core,bin,axcore,axbin,axtest', build: 'Release', cmake: '-DOPENVDB_CORE_SHARED=OFF -DOPENVDB_AX_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
- { vc: 'x64-windows-static', crt: 'MTd', components: 'core,bin,axcore,axbin,axtest', build: 'Debug', cmake: '-DOPENVDB_CORE_SHARED=OFF -DOPENVDB_AX_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON' }
fail-fast: false
steps:
- uses: actions/checkout@v3
- name: llvm
run: ./ci/install_llvm_windows.sh ${{ matrix.config.llvm }} ${{ matrix.config.crt }}
run: ./ci/install_llvm_windows.sh ${{ matrix.config.crt }}
- name: install
shell: powershell
run: |
vcpkg update
vcpkg install tbb gtest
run: ./ci/install_windows.sh
- name: build
run: >
./ci/build.sh -v
@@ -420,13 +358,10 @@ jobs:
--components="${{ matrix.config.components }}"
--cargs=\'
-A x64 -G \"Visual Studio 17 2022\"
-DOPENVDB_USE_DELAYED_LOADING=OFF
-DUSE_BLOSC=OFF \
-DUSE_ZLIB=OFF \
-DVCPKG_TARGET_TRIPLET=${VCPKG_DEFAULT_TRIPLET}
-DCMAKE_TOOLCHAIN_FILE=\"${VCPKG_INSTALLATION_ROOT}\\scripts\\buildsystems\\vcpkg.cmake\"
-DMSVC_COMPRESS_PDB=ON
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=OFF
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
-DUSE_EXPLICIT_INSTANTIATION=OFF
-DLLVM_DIR=\"${HOME}\\llvm_install\\lib\\cmake\\llvm\"
-DCMAKE_INSTALL_PREFIX=\"${VDB_INSTALL_PREFIX}\"
@@ -445,77 +380,18 @@ jobs:
################################## Blosc ####################################
#############################################################################
windows-nanovdb:
if: |
github.event_name != 'workflow_dispatch' ||
github.event.inputs.type == 'all' ||
github.event.inputs.type == 'win'
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'windows-2022-8c-32g-300h') || 'windows-latest' }}
env:
VCPKG_DEFAULT_TRIPLET: ${{ matrix.config.vc }}
visual_studio: "Visual Studio 17 2022"
cuda: "12.4.0"
strategy:
matrix:
config:
# static build of blosc from vcpkg does not build internal sources.
# USE_STATIC_DEPENDENCIES is required for IlmBase/OpenEXR defines and
# Boost as both shared and static libs are installed.
- { vc: 'x64-windows-static', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded' }
- { vc: 'x64-windows-static', build: 'Debug', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_SHARED=OFF -DUSE_STATIC_DEPENDENCIES=ON -DBLOSC_USE_EXTERNAL_SOURCES=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebug' }
- { vc: 'x64-windows', build: 'Release', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
- { vc: 'x64-windows', build: 'Debug', cmake: '-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF' }
fail-fast: false
steps:
- uses: actions/checkout@v3
- name: path
shell: powershell
run: |
# note: system path must be modified in a previous step to it's use
echo "$Env:VCPKG_INSTALLATION_ROOT\installed\${{ matrix.config.vc }}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
echo "${{github.workspace}}\build\openvdb\openvdb\${{ matrix.config.build }}" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
- name: install_cuda
shell: powershell
run: .\ci\install_windows_cuda.ps1
- name: install
shell: powershell
run: .\ci\install_windows.ps1
- name: build
shell: bash
run: >
./ci/build.sh -v
--config=${{ matrix.config.build }}
--components=core,nano,nanotest,nanoexam,nanobench,nanotool
--cargs=\'
${{ matrix.config.cmake }}
-DMSVC_COMPRESS_PDB=ON
-DUSE_EXPLICIT_INSTANTIATION=OFF
-DNANOVDB_USE_CUDA=ON
-DCMAKE_CUDA_ARCHITECTURES="80"
-DNANOVDB_USE_OPENVDB=ON
-DVCPKG_TARGET_TRIPLET=${VCPKG_DEFAULT_TRIPLET}
-DCMAKE_TOOLCHAIN_FILE=\"${VCPKG_INSTALLATION_ROOT}\\scripts\\buildsystems\\vcpkg.cmake\"
\'
- name: test
shell: bash
run: cd build && ctest -V -E ".*cuda.*|.*mgpu.*"
#############################################################################
################################## Blosc ####################################
#############################################################################
linux-blosc:
if: |
github.event_name != 'workflow_dispatch' ||
github.event.inputs.type == 'all' ||
github.event.inputs.type == 'blosc'
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-22.04-8c-32g-300h') || 'ubuntu-latest' }}
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'ubuntu-20.04-8c-32g-300h') || 'ubuntu-latest' }}
name: linux-blosc:${{ matrix.blosc }}
container:
image: aswf/ci-openvdb:2025-clang19.1
image: aswf/ci-base:2023
strategy:
matrix:
blosc: ['1.21.0', 'latest']
blosc: ['1.18.0','1.19.0','1.20.0','1.21.0']
fail-fast: false
steps:
- uses: actions/checkout@v3
@@ -544,9 +420,6 @@ jobs:
# may not have this build type. See OpenVDBCXX.cmake
CXXFLAGS: "-gdwarf-4 -g3 -ggdb -Og"
steps:
- name: Enable Node 16
run: |
echo "ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true" >> $GITHUB_ENV
- uses: actions/checkout@v3
with:
fetch-depth: 0
@@ -605,7 +478,7 @@ jobs:
-strict
-extended
- name: upload_report
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v3
if: always()
with:
name: abi_report
+2 -4
View File
@@ -4,12 +4,10 @@ name: Whitespace
on:
push:
paths-ignore:
- 'ext/**'
- 'pendingchanges/**'
- 'tsc/meetings/**'
pull_request:
paths-ignore:
- 'ext/**'
- 'pendingchanges/**'
- 'tsc/meetings/**'
@@ -27,7 +25,7 @@ jobs:
- name: test
run: |
set +e
git grep -n -I -E '^.+[ ]+$' -- ':!tsc/meetings/*' ':!pendingchanges/*' ':!ext/*' ':!*.wlt'
git grep -n -I -E '^.+[ ]+$' -- ':!tsc/meetings/*' ':!pendingchanges/*' ':!*.wlt'
test $? -eq 1
# Search for any tabs excluding meeting notes, image files and a few others
@@ -38,5 +36,5 @@ jobs:
- name: test
run: |
set +e
git grep -n " " -- ':!*/whitespace.yml' ':!tsc/meetings/*' ':!*.svg' ':!*.cmd' ':!*.png' ':!pendingchanges/*' ':!ext/*' ':!*.wlt' ':!*.jpg' ':!*.gif' ':!*.mp4' ':!*.pt' ':!*.pth' ':!*.nvdb' ':!*.npz'
git grep -n " " -- ':!*/whitespace.yml' ':!tsc/meetings/*' ':!*.svg' ':!*.cmd' ':!*.png' ':!pendingchanges/*' ':!*.wlt'
test $? -eq 1
+2 -522
View File
@@ -1,528 +1,7 @@
OpenVDB Version History
=======================
Version 13.0.1 - In Development
Version 13.0.0 - November 3, 2025
This version introduces ABI changes relative to older major releases,
so to preserve ABI compatibility it might be necessary to define the
macro OPENVDB_ABI_VERSION_NUMBER=N, where, for example, N is 11 for
Houdini 20.5 and 12 for Houdini 21.0.
Support for reading .vdb files written prior to VDB 1.0 has been removed.
To read older .vdb files, please use VDB 12.x or older and re-write them,
so that they use the newer file format and can be read in VDB 13+.
Highlights:
- OpenVDB now includes in-memory support for Half Grids and the file format
has been extended to add I/O serialization for half grids. More work is
planned on adapting algorithms when using Half Grids for better performance
and improved precision.
- NanoVDB is no longer limited to static applications, such as rendering, but
can increasingly be applied to problems that involve dynamic topology, such
as level set tracking, grid building, morphology operations and merging of
grids. This is due to the fact that we keep adding more and more tools to
NanoVDB that facilitates tree modification. However, unlike OpenVDB, these
operations generate new NanoVDB grids (as oppose to in-palace modifications
in OpenVDB), yet are typically much faster since they are performed on the
GPU. Many of these exciting new features are the foundation of fVDB.
OpenVDB:
New features:
- Added native registration of HalfGrid type.
- Added customization of the output transformation attribute for
points::pca(). Can be output as a quaternion or as a combined affine
transform with the scale/stretch ommitted.
- Added support for input quaternions attributes and affine
transformations (that include scale) in points::rasterizeSdf() for
ellipsoidal rasterizations.
API Changes:
- Added LeafBuffer::storage() for direct const access to the raw data
buffer when using the bool LeafNode.
- Removed Grid::evalMinMax(), use tools::minMax for superior threaded
performance.
- Removed points::rasterize() that took a custom filter and interrupter.
- Removed LeafNode<bool, ...>() TopologyCopy constructor in favor of using
explicit mask/buffer constructors.
- Removed ValueAccessor NodeT0, NodeT1, NodeT2 aliases, use NodeTypeAtLevel
instead.
- Add InternalNode::setValueMaskUnsafe() to write a value mask directly.
- LegacyFrustum and RootNodeMask have been removed. These classes were only
used for reading old .vdb files, which is no longer supported.
- io::writeCompressedValues() now takes a const ValueT* source buffer for
improved const-correctness.
Bug Fixes:
- Fix a bug in the LevelSetRayIntersector class where two of the methods
were incorrectly adjusting the time even when an intersection was not
found.
- Fixed an assertion in math::Quat where a vector length check was using
too small a tolerance.
- Fixed a bug in the unit tests where detecting if assertions were enabled
was using NDEBUG rather than OpenVDB assertions.
Build:
- Removed the unnecessary USE_NUMPY build option for the OpenVDB Python
module. All functions which take numpy arrays are now always generated
(numpy is not required at compile time for this support).
- Bumped minimum supported CMake version to 3.24, and new future minimum
to 4.0.0.
- Bumped minimum supported OpenEXR and Imath versions to 3.2, and new
future minimum to 3.3.
- Bumped minimum supported Boost version to 1.82, and new future minimum
to 1.85.
- Bumped minimum supported Python version to 3.11
- Bumped minimum supported Log4cplus version to 2.0
- Bumped minimum supported Houdini version to 20.5
- Bumped minimum supported GLFW version to 3.3
- Bumped future minimum for TBB to 2021 (oneapi).
- Bumped future minimum for nanobind to 2.5.0.
OpenVDB AX:
New:
- Added support for LLVM 21.
NanoVDB:
Highlights:
- NanoVDB is no longer limited to static applications, such as rendering,
but can increasingly be applied to problems that involve dynamic
topology, such as level set tracking, grid building, morphology
operations and merging of grids. This is due to the fact that we keep
adding more and more tools to NanoVDB that facilitates tree modification.
However, unlike OpenVDB, these operations generate new NanoVDB grids (as
oppose to in-palace modifications in OpenVDB), yet are typically much
faster since they are performed on the GPU. Many of these exciting new
features are the foundation of fVDB.
New features:
- Added nanovdb/tools/cuda/DilateGrid.cuh, which performs topology dilation
on the GPU.
- Added nanovdb/tools/cuda/MergeGrids.cuh, which merges the topology of two
grids on the GPU.
- Added nanovdb/tools/cuda/CoarsenGrid.cuh, which performs topological
coarsening of grids on the GPU.
- Added nanovdb/tools/cuda/RefineGrid.cuh, which performs topological
refinement of grids on the GPU.
- Added nanovdb/tools/cuda/PruneGrid.cuh, which prunes the topology of a
grid using a sidecar mask on the GPU.
- Added nanovdb/util/cuda/Injection.cuh, which facilitates sidecar data
copying - on the GPU - in the overlap of two grids with different
topology.
- Added Mat classes and other math types to NanoVDB.
- Major rewrite of nanovdb::NanoToOpenVDB, which now allows
nanovdb::IndexGrids and blind (or sidecar) data to be converted into an
openvdb grid.
- Added support for LevelSet, FogVolume, and Staggered grid semantics.
Added toGridClass and toSemantic to map Grid Blind data semantic to Grid
class and vice versa.
Improvements:
- Improvements to mGPU grid building and introduction of a separate test
executable for mGPU tests
- Added stand-alone function nanovdb::writeUncompressedGrid that allows
nanovdb::IndexGrids and blind (or sidecar) data to be written directly to
a stream.
- nanovdb_print now (optionally) prints the blind data count per grid.
- Extended nanovdb::GridBlindDataSemantic with nanovdb::GridClass types to
support conversion between IndexGrid and regular grids.
- Improvements and bugfixes to PNanoVDB.
API Changes:
- Removed nanovdb::ValueIndexMask and nanovdb::ValueOnIndexMask since they
are no longer used by fVDB (or elsewhere).
- NanoVDB version is now 32.9.0, so the ABI of the grid is preserved but
not the API. However, the API changes are very minor!
Bug Fixes:
- Several fixes for compiler warnings.
- Fixed error in nanovdb/io/IO.h related to missing throws.
Houdini:
- Remove support for openvdb_houdini::Interrupter, use
openvdb_houdini::HoudiniInterrupter instead.
- Remove input-stealing via duplicateSourceStealable(), SideFX have since
introduced verbification and compiled SOPs to provide zero-copy node
evaluation.
Version 12.1.1 - September 30, 2025
OpenVDB AX:
Fixes:
- Fixed an issue which was causing host specific optimization passes to be
omitted when using LLVM 16 and higher.
Houdini:
- Fixed a compilation issue with the OpenVDB Activate SOP with Houdini 21
[Reported by @callen128]
Version 12.1.0 - August 8, 2025
OpenVDB:
New features:
- New level set constructor tools::createLevelSetCapsule creates a grid
containing a narrow-band level set representation of a capsule (tube
with constant radius and sphere caps).
- New level set constructor tools::createLevelSetTaperedCapsule creates a
grid containing a narrow-band level set representation of a tapered
capsule (tube with sphere caps and different radii at both ends, or
equivalently the convex hull of two spheres with possibly different
centers and radii).
- New level set constructor tools::createLevelSetTubeComplex creates a grid
containing a narrow-band level set representation of a tube complex (a
collection of capsules or tapered capsules defined by endpoint coordinates
and segment indices).
- New level set constructor tools::createLevelSetDilatedMesh creates a grid
containing a narrow-band level set representation of a dilated surface
mesh (dilated by a radius in all directions).
- New class tools::ConvexVoxelizer, used by the above methods, which can be
inherited to implement a convex level set constructor.
- Introduced anisotropic surfacing tools in points/PointRasterizeSDF.h and
principal component analysis (PCA) methods in points/PrincipalComponentAnalysis.h.
The latter tool analyses point neighborhoods and computes affine
transformations representing elliptical distributions. The prior tool
takes rotational and stretch point attributes (optionally computed from
the prior PCA methods) and generates anisotropic surfaces.
Improvements:
- Significantly improved the performance of all LeafNode ValueIterators,
up to 5x on some platforms and up to 10x when delay loading is enabled.
Construction of a ValueIterator from a leaf node now requests the leaf
buffers ahead of iteration to avoid potentially expensive API calls.
- Improved the performance of PointRasterizeSDF.h tools with larger radii
with better bound computation approximations.
- Significant performance improvement to delay loaded files - the warning
logic which checks the underlying mapped file for the last modified time
has been removed, resulting in performance gains upwards of 10x when
loading in node data buffers. Note that the check that was removed is
entirely redundant on Windows and would only print a warning on other
system.
[Contributed by jjtParadox]
- Added OPENVDB_HAS_INVOKABLE_MEMBER_FUNCTION and OPENVDB_HAS_MEMBER_FUNCTION
macros to help determine the presence and compatibility of interface
member functions at compile time.
- Added OPENVDB_ASSUME macros to mimic builtin assume and C++23 assume
attributes.
- Improved read and write of PLY files with vdb_tool so they support Vec3d
and 64 bit attributes. Changed vdb_tool version number from 10.6.1 to
10.7.0.
API Changes:
- Mat3 and Mat4 functions have been marked [[nodiscard]] where it may be
confusing if they are operating in place or returning a result, in
particular tranpose, invert, adjoint, and timesDiagonal.
- Re-worked the API in PointRasterizeSDF.h with the addition of anisotropic
surfacing kernels. The new API exposes more concise free functions which
take structs of parameters. The old API remains supported but is
deprecated.
- Deprecated providing a filter or interrupter as arguments to
points::rasterize. These can instead be implemented on user transfer
schemes.
- Transfer schemes provided to points::rasterize can now optionally
implement a rasterizePoints callback that takes a range of points per
voxel.
Fixes:
- Fixed a bug in points::rasterizeSpheres and points::rasterizeSmoothSpheres
which could cause sections of the generated surface to incorrectly be
marked as negative interior values.
- Fixed a bug in points::rasterizeSmoothSpheres which could result in
incomplete surface reconstruction with significantly larger search
distances.
- Fixed some precision issues in various Matrix methods.
- Fixed bugs in vdb_tool that prevented build with newer namespaces in
nanovdb.
OpenVDB AX:
Improvements:
- Added support for LLVM versions greater than 15. Upgraded CI to test with
LLVM versions 16, 17, 18, 19 and 20.
- As of this release, LLVM 15 is the minimum required version for OpenVDB
AX. Note that there is an issue with LLVM 17 symbols which makes it
incompatible with the OpenVDB Python plugin. AS such, LLVM version 18 and
greater are the recommended LLVM versions to use, with LLVM 18 being the
new future minimum version.
- Significant performance improvement to the compilation of AX kernels when
using LLVM 18 and greater.
- Significant backend refactoring to AX IR generation to support newer
versions of LLVM. In particular, parts of the codegen::Function and
codegen::FunctionBuilder API require new usage from LLVM 16 due to
the LLVM opaque pointer changes. If you're not using the OpenVDB AX
Function codegen API then no client changes should be necessary.
- Migrated OpenVDB AX unit tests from cppunit to gtest
[Contributed by Tim Straubinger]
Fixes:
- Fixed a case of undefined behaviour when explicitly casting variables to
the same type as their storage type e.g:
double a; double b = double(a);
- Fixed an AX compiler error which would produce invalid IR when using 64bit
integer variables for matrix array offsetting e.g:
int64 a = 0; mat4f b = 1; float c = b[a,a];
NanoVDB:
- Added nanovdb::openToIndexVDB, which can convert an OpenVDB grid into a
NanoVDB IndexGrid.
- Added new options "--index" and "--onIndex" to the command-line tool
nanovdb_convert so it can produce IndexGrids.
- Fixed memory leak in DeviceBuffer.
- Added constructor for DeviceBuffer from an existing HostBuffer.
- Added VoxelBlockManager, an acceleration structure for sequential access
and stencil ops over active voxels.
- Added helper functions for kernel launches with shared memory.
- Added support for CUDA 13.0.
- Fix warnings and compilation errors for GCC and Clang.
- Fixed inconsistent usage of util::cuda::mallocAsync/freeAsync that
affected vGPUs.
- Added support for custom memory resources in PointsToGrid.
- Fixed race condition in split/mergeGridHandles.
- Fixed offset bug in nanovdb::tools::cuda::IndexToGrid related to non-POD
build types.
[Contributed by Andreas Henne]
Houdini:
- Define OP_InputIdx and OP_OutputIdx for Houdini 21.0 compatibility
- Add Houdini 21 style camera interface to support LOP cameras
- Include env flag for avoiding stream writing (was backported to 19.5)
Version 12.0.1 - April 3, 2025
OpenVDB:
New features:
- Added read and write support for OFF (Object File Format) files to
vdb_tool
Build:
- Fixed a build issue with vdb_render on Windows with newer versions of
glew not including glu.h by default
- Fixed issues with newer versions of clang refusing to accept older
::template syntax
NanoVDB:
New features:
- Added support for multiple GPUs to DeviceBuffer
- Added a UnifiedBuffer class that wraps CUDA unified memory
- Added example for multiGPU sparse convolution
- Added CUDA utility functions for device queries
- Added functions to independently stop and compute the elapsed time for
timer classes
Improvements:
- Replaced CUB's CachingDeviceAllocator with the default asynchronous
stream ordered allocator in PointsToGrid for improved performance
Bug fix:
- Map is now properly transposed when converting NanoVDB to OpenVDB.
- Fixed ostream specializations being hidden within the nanovdb namespace
- Fixed a call to a non-existent method in GridBuild.h
Version 12.0.0 - October 31, 2024
OpenVDB is now licensed under the Apache 2.0 license, instead of the MPL 2.0 license.
This version introduces ABI changes relative to older major releases,
so to preserve ABI compatibility it might be necessary to define the
macro OPENVDB_ABI_VERSION_NUMBER=N, where, for example, N is 10 for
Houdini 20.0 and 11 for Houdini 20.5.
GCC 9 is no longer supported.
OpenVDB:
New features:
- Added fillet() method in tools::LevelSetFilter to round off concave edges
to create smoother transition between surfaces.
Improvements:
- Added openvdb::assertAbort to replace cassert and a
OPENVDB_ENABLE_ASSERTS cmake argument/compile define to toggle
assertions in OpenVDB code, independantly of NDEBUG. Asserts are
no longer enabled by default in when NDEBUG is absent (e.g.
Debug builds).
- Removed last traces of Boost when OPENVDB_USE_DELAYED_LOADING is OFF
[Reported by Brian McKinnon]
- RootNode code cleanup to eliminate redundant key conversion and
to create map values in-place.
- Add RootNode::deleteChildOrTile() to delete a child or tile of
the root node.
- ValueAccessors are now defined and created in the Tree class
instead of in the Grid class so that custom Tree implementations
may define and create their own ValueAccessors if desired.
- Added support for PDAL to vdb_tool [Contributed by Tom Matterson]
- LeafManager and NodeManager now use Index64 for leaf counts internally.
- Added RootNode::probeChild() const.
- Added RootNode::probeChild() and RootNode::probeConstChild().
- Added RootNode::probe() and RootNode::probeConst() to query key presence,
child node, value and active state.
- Added InternalNode::probeChild() const.
- Added InternalNode::probeChild() and probeChildConst() with coord access
and optionally value and active state.
- Added InternalNode::probeChild() and probeChildConst() with index access
and optionally value and active state.
- Added InternalNode::isValueOff(), LeafNode::isValueOff(),
LeafNodeBool::isValueOff(), LeafNodeMask::isValueOff().
- Added LeafNodeMask::probeValue(Index,val), LeafNodeBool::probeValue(Index,val).
- Added RootNode::getValueUnsafe(), RootNode::getChildUnsafe(),
RootNode::getConstChildUnsafe().
- Added InternalNode::getValueUnsafe(), InternalNode::getChildUnsafe(),
InternalNode::getConstChildUnsafe().
- Added InternalNode::setActiveStateUnsafe(), InternalNode::setValueOnlyUnsafe(),
InternalNode::setValueOnUnsafe(), InternalNode::setValueOffUnsafe().
- Added InternalNode::setChildUnsafe(), InternalNode::resetChildUnsafe(),
InternalNode::stealChildUnsafe(), InternalNode::deleteChildUnsafe().
- For LeafNode, LeafNodeBool and LeafNodeMask - added
LeafNode::getValueUnsafe(), LeafNode::setActiveStateunsafe(),
LeafNode::setValueOnlyUnsafe(), LeafNode::setValueOnUnsafe(),
LeafNode::setValueOffUnsafe().
ABI changes:
- Tree::leafCount(), Tree::unallocatedLeafCount(),
Tree::nonLeafCount() and Tree::nodeCount() now use Index64 in their
return types instead of Index32.
API Changes:
- RootNode::tileCount(), RootNode::activeTileCount() and
RootNode::inactiveTileCount() are now public.
- RootNode::hasKey() and RootNode::coordToKey() are now public.
- RootNode::leafCount(), RootNode::nonLeafCount() and RootNode::nodeCount()
now use Index64 instead of Index32. The Index32 variant is deprecated.
- InternalNode::leafCount(), InternalNode::nonLeafCount() and
InternalNode::nodeCount() now use Index64 instead of Index32. The Index32
variant is deprecated.
- LeafNode::leafCount() and LeafNode::nonLeafCount() now use Index64 instead
of Index32. The Index32 variant is deprecated.
Bug Fixes:
- Fix potential crash reading corrupt .vdb files with invalid
blosc or zip chunks.
[Fix thanks to Matthias Ueberheide]
- Fix a bug in RootNode::setOrigin() where the origin was updated
before the error was thrown potentially leaving the root in an
invalid state.
- Fixed a thread sanitizer issue which could cause undefined
behaviour in VolumeToSpheres::fillWithSpheres
[Reported by Jérémie Dumas]
- Fixed an occurance of undefined behaviour in tools::activate
(though this would typically not have manifested with any
unintended behaviour)
NanoVDB:
Bug fix:
- nanovdb::readGrids works with raw grid buffer.
Improvements:
- Restructure files location and namespace to be more align with
OpenVDB. The namespaces touched by the restructuring are: io,
cuda, util, tools, and math.
- Add two scripts updateFiles.sh and updateFiles.py to update the
files using NanoVDB. The script updateFiles.py works on both
Windows and Linux. For a more complete list of changes, see API
Changes (details).
- cuda::PointsToGrid supports target density.
- Add support for NanoVDB Grid of type UInt8.
- Add ability to use externally managed CUDA buffer.
- Add create methods for CudaDeviceBuffer and exceptions.
- Improve GridValidator logic, e.g. include check for grid count.
- Add operator > and >= for class Coord according to lexicographical order.
- Add toCodec to convert string to Codec enumeration type.
- Add nanovdb::strlen<GridType>().
- Add strncpy util.
- Add NANOVDB_DISABLE_SYNC_CUDA_MALLOC that maps cudaMallocAsync
and cudaFreeAsync to cudaMalloc and cudaFree respectively.
- Add guard to UINT64_C.
- Remove use of cudaMallocAsync in PointsToGrid.cuh.
- Align PNanoVDB blind metadata to NanoVDB.
API Changes:
- Change mapToGridType to toGridType.
- Change mapToMagic to toMagic.
- Change CpuTimer.h to Timer.h.
API Changes (details):
- These APIs are now under the math namespace: Ray, DDA, HDDA,
Vec3, Vec4, BBox, ZeroCrossing, TreeMarcher, PointTreeMarcher,
BoxStencil, CurvatureStencil, GradStencil, WenoStencil, AlignUp,
Min, Max, Abs, Clamp, Sqrt, Sign, Maximum, Delta, RoundDown, pi,
isApproxZero, Round, createSampler, SampleFromVoxels.
- These APIs are now under the tools namespace: createNanoGrid,
StatsMode, createLevelSetSphere, createFogVolumeSphere,
createFogVolumeSphere, createFogVolumeSphere,
createFogVolumeTorus, createLevelSetBox, CreateNanoGrid,
updateGridStats, evalChecksum, validateChecksum, checkGrid,
Extrema.
- These APIs are now under the util namespace: is_floating_point,
findLowestOn, findHighestOn, Range, streq, strcpy, strcat,
empty, Split, invoke, forEach, reduce, prefixSum, is_same,
is_specialization, PtrAdd, PtrDiff.
- Move nanovdb::build to nanovdb::tools::build.
- Rename nanovdb::BBoxR to nanovdb::Vec3dBBox.
- Rename nanovdb::BBox<nanovdb::Vec3d> to nanovdb::Vec3dBbox.
- Move nanovdb::cudaCreateNodeManager to nanovdb::cuda::createNodeManager.
- Move and rename nanovdb::cudaVoxelsToGrid to nanovdb::cuda::voxelsToGrid.
- Move and rename nanovdb::cudaPointsToGrid to nanovdb::cuda::pointsToGrid.
- Move nanovdb::DitherLUT to nanovdb::math::DitherLUT.
- Move and rename nanovdb::PackedRGBA8 to nanovdb::math::Rgba8.
- Move nanovdb::Rgba8 to nanovdb::math::Rgba8.
- Move and rename nanovdb::CpuTimer to nanovdb::util::Timer.
- Move nanovdb::GpuTimer to nanovdb::util::cuda::Timer.
- Move and rename nanovdb::CountOn to nanovdb::util::countOn.
- Move util/GridHandle.h to GridHandle.h.
- Move util/BuildGrid.h to tools/GridBuilder.h.
- Move util/GridBuilder.h to tools/GridBuilder.h.
- Move util/IO.h to io/IO.h.
- Move util/CSampleFromVoxels.h to math/CSampleFromVoxels.h.
- Move util/DitherLUT.h to math/DitherLUT.h.
- Move util/HDDA.h to math/HDDA.h.
- Move util/Ray.h to math/Ray.h.
- Move util/SampleFromVoxels.h to math/SampleFromVoxels.h.
- Move util/Stencils.h to nanovdb/math/Stencils.h.
- Move util/CreateNanoGrid.h to tools/CreateNanoGrid.h.
- Move and rename util/Primitives.h to tools/CreatePrimitives.h.
- Move util/GridChecksum.h to tools/GridChecksum.h.
- Move util/GridStats.h to tools/GridStats.h.
- Move util/GridChecksum.h to tools/GridChecksum.h.
- Move util/GridValidator.h to tools/GridValidator.h.
- Move util/NanoToOpenVDB.h to tools/NanoToOpenVDB.h.
- Move util/cuda/CudaGridChecksum.cuh to tools/cuda/CudaGridChecksum.cuh.
- Move util/cuda/CudaGridStats.cuh to tools/cuda/CudaGridStats.cuh.
- Move util/cuda/CudaGridValidator.cuh to tools/cuda/CudaGridValidator.cuh.
- Move util/cuda/CudaIndexToGrid.cuh to tools/cuda/CudaIndexToGrid.cuh.
- Move and rename util/cuda/CudaPointsToGrid.cuh to tools/cuda/PointsToGrid.cuh.
- Move util/cuda/CudaSignedFloodFill.cuh to tools/cuda/CudaSignedFloodFill.cuh.
- Move and rename util/cuda/CudaDeviceBuffer.h to cuda/DeviceBuffer.h.
- Move and rename util/cuda/CudaGridHandle.cuh to cuda/GridHandle.cuh.
- Move and rename util/cuda/CudaUtils.h to util/cuda/Util.h.
- Move and consolidate util/cuda/GpuTimer.h to util/cuda/Timer.h.
Houdini:
- When OPENVDB_ENABLE_RPATH is ON, the location of
libopenvdb_houdini is now added to the rpath of all Houdini
dsos.
Python:
- OpenVDB Python bindings are now implemented using nanobind
instead of pybind11
- The OpenVDB Python module has been changed from pyopenvdb to openvdb
- Added Python bindings for NanoVDB
Build:
- Fixed an issue with OpenVDB AX's CMake on Windows where the
static and shared library targets would have the same name
[Reported by Nicholas Yue]
- USE_EXPLICIT_INSTANTIATION is now disabled on Windows by default
due to OOM linker issues.
- Jemalloc is now the preferred allocator of choice on all
platforms when CONCURRENT_MALLOC is set to Auto.
- Fixed an issue with the Blosc CMake FindPackage for the OpenVDB
Windows static library.
Version 11.0.1 - In development
Version 11.0.0 - November 1, 2023
@@ -920,6 +399,7 @@ Version 9.1.0 - June 9, 2022
Positional arguments as input files are deprecated.
- Added tools::minMax() which supports multithreaded evaluation of active
minimum and maximum values. Grid::evalMinMax() has been deprecated.
[Contributed by Greg Hurst]
- Significant performance improvements to AX point kernels, primarily due to
providing AX access to attribute buffers for superior code generation.
- vdb_print now prints both the in-core memory and total memory usage for
+33 -123
View File
@@ -1,5 +1,5 @@
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MPL-2.0
#
#[=======================================================================[
@@ -42,7 +42,7 @@
# note: cmake_minimum_required must be called before project commands to
# ensure policy scope is set up correctly
cmake_minimum_required(VERSION 3.24)
cmake_minimum_required(VERSION 3.18)
# CMP0091 allows for MSVC ABI targetting via CMAKE_MSVC_RUNTIME_LIBRARY
# from CMake 3.15 and above. Must come before project().
@@ -52,7 +52,7 @@ endif()
###### Version
set(OpenVDB_MAJOR_VERSION 13)
set(OpenVDB_MAJOR_VERSION 11)
set(OpenVDB_MINOR_VERSION 0)
set(OpenVDB_PATCH_VERSION 1)
set(OpenVDB_VERSION "${OpenVDB_MAJOR_VERSION}.${OpenVDB_MINOR_VERSION}.${OpenVDB_PATCH_VERSION}")
@@ -80,10 +80,6 @@ option(OPENVDB_BUILD_NANOVDB "Build the NanoVDB library. Turns ON if USE_NANOVDB
# Global options
option(OPENVDB_ENABLE_RPATH "Build with RPATH information" ON)
option(OPENVDB_ENABLE_ASSERTS "Build with asserts in OpenVDB code enabled" OFF)
option(OPENVDB_ENABLE_VEC_RELATIONAL_OPERATIONS [=[
Enabled deprecated relational < and > operators on Vector types. This option
will be switched to OFF and the feature will be subsequently removed in future
releases.]=] ON)
option(OPENVDB_USE_DELAYED_LOADING "Build the core OpenVDB library with delayed-loading." ON)
option(OPENVDB_CXX_STRICT "Enable or disable pre-defined compiler warnings" OFF)
cmake_dependent_option(OPENVDB_INSTALL_CMAKE_MODULES
@@ -135,30 +131,6 @@ required.]=] ${USE_EXR})
option(USE_PNG "Use PNG while building openvdb components." OFF)
option(USE_AX "Use OpenVDB AX while building openvdb components." ${OPENVDB_BUILD_AX})
option(USE_NANOVDB "Use NanoVDB while building openvdb components." ${OPENVDB_BUILD_NANOVDB})
option(USE_VCL [=[
Use the internally supplied copy of Agner Fog's vectorclass (VCL) SIMD wrapper
library to instrument OpenVDB tools. This also requires VCL to be installed
along with OpenVDB headers. Only applicable which compiling for x86 targets.]=] OFF)
set(OPENVDB_X86_INSTRSET 0 CACHE STRING [=[
The x86 instruction set to use. When unset, if USE_VCL is ON, this is
automatically configured based on provided build flags. When unset and USE_VCL
is OFF, defaults to 0. It is expected for you to provide this flag. Available
values are:
0: Unknown or unspecified
1: SSE -msse
2: SSE2 -msse2 # Minimum on x86_64
3: SSE3 -msse3
4: SSSE3 -mssse3
5: SSE4.1 -msse4.1
6: SSE4.2 -msse4.2 # Minimum recommended where supported
7: AVX -mavx
8: AVX2 -mavx2
9: AVX512F -mavx512f
10: AVX512BW/DQ/VL -mavx512bw -mavx512dq -mavx512vl
Note that (while not strictly enforced by vendors) each option implies all
preceeding flags. If you need more granular control you can provide your
desired flags via CXX_FLAGS. Only applicable which compiling for x86 targets.
]=])
cmake_dependent_option(OPENVDB_DISABLE_BOOST_IMPLICIT_LINKING
"Disable the implicit linking of Boost libraries on Windows" ON "WIN32" OFF)
@@ -200,6 +172,19 @@ elseif(NOT ${CONCURRENT_MALLOC} IN_LIST _CONCURRENT_MALLOC_OPTIONS)
set(CONCURRENT_MALLOC Auto CACHE STRING FORCE)
endif()
set(_OPENVDB_SIMD_OPTIONS None SSE42 AVX)
if(NOT OPENVDB_SIMD)
set(OPENVDB_SIMD None CACHE STRING
"Choose whether to enable SIMD compiler flags or not, options are: None SSE42 AVX.
Although not required, it is strongly recommended to enable SIMD. AVX implies SSE42.
None is the default." FORCE
)
elseif(NOT ${OPENVDB_SIMD} IN_LIST _OPENVDB_SIMD_OPTIONS)
message(WARNING "Unrecognized or unsupported value for OPENVDB_SIMD, "
"using None instead.")
set(OPENVDB_SIMD None CACHE STRING FORCE)
endif()
if(USE_BLOSC AND NOT USE_ZLIB)
message(WARNING "ZLib can only be disabled if Blosc is also disabled. Enabling ZLib.")
endif()
@@ -283,13 +268,6 @@ mark_as_advanced(
include(cmake/config/OpenVDBVersions.cmake)
if(OPENVDB_FUTURE_DEPRECATION AND FUTURE_MINIMUM_CMAKE_VERSION)
if(CMAKE_VERSION VERSION_LESS ${FUTURE_MINIMUM_CMAKE_VERSION})
message(DEPRECATION "Support for CMake versions < ${FUTURE_MINIMUM_CMAKE_VERSION} "
"is deprecated and will be removed.")
endif()
endif()
foreach(DEPRECATED_ABI ${OPENVDB_DEPRECATED_ABI_LIST})
option(OPENVDB_USE_DEPRECATED_ABI_${DEPRECATED_ABI} "Bypass minimum ABI requirement checks" OFF)
mark_as_advanced(OPENVDB_USE_DEPRECATED_ABI_${DEPRECATED_ABI})
@@ -307,30 +285,6 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
# Add cmake modules to installation command
if(SKBUILD)
set(OPENVDB_INSTALL_BINDIR openvdb/${CMAKE_INSTALL_BINDIR})
set(OPENVDB_INSTALL_LIBDIR openvdb/${CMAKE_INSTALL_LIBDIR})
set(OPENVDB_INSTALL_INCLUDEDIR openvdb/${CMAKE_INSTALL_INCLUDEDIR})
if(OPENVDB_BUILD_NANOVDB)
set(NANOVDB_INSTALL_BINDIR nanovdb/${CMAKE_INSTALL_BINDIR})
set(NANOVDB_INSTALL_LIBDIR nanovdb/${CMAKE_INSTALL_LIBDIR})
set(NANOVDB_INSTALL_INCLUDEDIR nanovdb/${CMAKE_INSTALL_INCLUDEDIR})
set(NANOVDB_INSTALL_DOCDIR nanovdb/${CMAKE_INSTALL_DOCDIR})
endif()
else()
set(OPENVDB_INSTALL_BINDIR ${CMAKE_INSTALL_BINDIR})
set(OPENVDB_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR})
set(OPENVDB_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR})
if(OPENVDB_BUILD_NANOVDB)
set(NANOVDB_INSTALL_BINDIR ${CMAKE_INSTALL_BINDIR})
set(NANOVDB_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR})
set(NANOVDB_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR})
set(NANOVDB_INSTALL_DOCDIR ${CMAKE_INSTALL_DOCDIR})
endif()
endif()
if(OPENVDB_INSTALL_CMAKE_MODULES)
set(OPENVDB_CMAKE_MODULES
cmake/FindBlosc.cmake
@@ -344,7 +298,7 @@ if(OPENVDB_INSTALL_CMAKE_MODULES)
cmake/OpenVDBMayaSetup.cmake
cmake/OpenVDBUtils.cmake
)
install(FILES ${OPENVDB_CMAKE_MODULES} DESTINATION ${OPENVDB_INSTALL_LIBDIR}/cmake/OpenVDB)
install(FILES ${OPENVDB_CMAKE_MODULES} DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenVDB)
endif()
# Configure component dependencies by loading the Houdini/Maya setup
@@ -400,28 +354,6 @@ endif()
#########################################################################
# Still support -DOPENVDB_SIMD=SSE42 and -DOPENVDB_SIMD=AVX, these alias to
# their respective OPENVDB_X86_INSTRSET value but, as a build option, are
# deprecated. Not that the defines in version.h need to persist in case
# downstream software was using them before including VDB headers
set(_OPENVDB_SIMD_OPTIONS None SSE42 AVX)
if(NOT OPENVDB_SIMD)
set(OPENVDB_SIMD None CACHE STRING "Deprecated, see OPENVDB_X86_INSTRSET." FORCE)
else()
if(NOT ${OPENVDB_SIMD} IN_LIST _OPENVDB_SIMD_OPTIONS)
message(WARNING "Unrecognized or unsupported value for OPENVDB_SIMD, using None instead.")
set(OPENVDB_SIMD None CACHE STRING "Deprecated, see OPENVDB_X86_INSTRSET." FORCE)
endif()
message(DEPRECATION "The OPENVDB_SIMD option is deprecated and will be removed. Use OPENVDB_X86_INSTRSET.")
if(OPENVDB_SIMD STREQUAL "AVX")
set(OPENVDB_X86_INSTRSET 7)
elseif(OPENVDB_SIMD STREQUAL "SSE42")
set(OPENVDB_X86_INSTRSET 6)
endif()
endif()
#########################################################################
# Configure general CMake and CXX settings
include(cmake/config/OpenVDBCXX.cmake)
@@ -441,6 +373,22 @@ if(CONCURRENT_MALLOC STREQUAL "Auto")
endif()
endif()
# Configure SIMD. AVX implies SSE 4.2.
if(OPENVDB_SIMD STREQUAL "AVX")
if (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)")
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-mavx>")
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-msse4.2>")
endif()
add_compile_definitions("$<$<COMPILE_LANGUAGE:CXX>:OPENVDB_USE_AVX>")
add_compile_definitions("$<$<COMPILE_LANGUAGE:CXX>:OPENVDB_USE_SSE42>")
elseif(OPENVDB_SIMD STREQUAL "SSE42")
if (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)")
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-msse4.2>")
endif()
add_compile_definitions("$<$<COMPILE_LANGUAGE:CXX>:OPENVDB_USE_SSE42>")
endif()
#########################################################################
# Configure our cmake modules to only search for static libraries
@@ -503,44 +451,6 @@ if(NOT OPENVDB_BUILD_NANOVDB AND
find_package(OpenVDB REQUIRED COMPONENTS nanovdb)
endif()
# Locate Python and nanobind if necessary
if(OPENVDB_BUILD_PYTHON_MODULE OR (OPENVDB_BUILD_NANOVDB AND NANOVDB_BUILD_PYTHON_MODULE))
find_package(Python ${MINIMUM_PYTHON_VERSION} REQUIRED COMPONENTS Development Interpreter)
if(OPENVDB_FUTURE_DEPRECATION AND FUTURE_MINIMUM_PYTHON_VERSION)
if(Python_VERSION VERSION_LESS ${FUTURE_MINIMUM_PYTHON_VERSION})
message(DEPRECATION "Support for Python versions < ${FUTURE_MINIMUM_GLFW_VERSION} "
"is deprecated and will be removed.")
endif()
endif()
find_package(nanobind REQUIRED CONFIG)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(nanobind
FOUND_VAR nanobind_FOUND
REQUIRED_VARS NB_DIR
VERSION_VAR nanobind_VERSION)
if(OPENVDB_FUTURE_DEPRECATION AND FUTURE_MINIMUM_NANOBIND_VERSION)
if(nanobind_VERSION VERSION_LESS ${FUTURE_MINIMUM_NANOBIND_VERSION})
message(DEPRECATION "Support for nanobind versions < ${FUTURE_MINIMUM_NANOBIND_VERSION} "
"is deprecated and will be removed.")
endif()
endif()
if(NOT DEFINED VDB_PYTHON_INSTALL_DIRECTORY)
if(DEFINED Python_SITELIB)
get_filename_component(Python_PACKAGES_DIR ${Python_SITELIB} NAME)
else()
set(Python_PACKAGES_DIR "site-packages")
endif()
set(VDB_PYTHON_INSTALL_DIRECTORY
${CMAKE_INSTALL_LIBDIR}/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/${Python_PACKAGES_DIR}
CACHE STRING "The directory to install the openvdb and nanovdb Python modules."
)
endif()
endif()
# Validate the OpenVDB ABI Version. If OpenVDB_ABI is not set, we're either building
# the core library OR the ABI hasn't been deduced from a VDB installation. Use the
+1 -1
View File
@@ -6,10 +6,10 @@
# Admin/General
/.github/ @kmuseth @apradhana @jmlait @idclip @danrbailey @richhones
/.github/workflows/nanovdb.yml @kmuseth @apradhana
/ci/ @kmuseth @apradhana @jmlait @idclip @danrbailey @richhones
/cmake/ @kmuseth @apradhana @jmlait @idclip @danrbailey @richhones
/doc/ @kmuseth @apradhana @jmlait @idclip @danrbailey @richhones
/pendingchanges/ @kmuseth @apradhana @jmlait @idclip @danrbailey @richhones
/tsc/ @kmuseth @apradhana @jmlait @idclip @danrbailey @richhones
CODEOWNERS @kmuseth @apradhana @jmlait @idclip @danrbailey @richhones
LICENSE @kmuseth @apradhana @jmlait @idclip @danrbailey @richhones
+16 -23
View File
@@ -22,7 +22,7 @@ open source software best practice policies of the Linux Foundation.
#### License
OpenVDB is licensed under the [Apache License, version 2.0](LICENSE.md)
OpenVDB is licensed under the [Mozilla Public License, version 2.0](LICENSE.md)
license. Contributions to OpenVDB should abide by that standard
license.
@@ -54,27 +54,21 @@ Every commit must be signed off. That is, every commit log message
must include a “`Signed-off-by`” line (generated, for example, with
“`git commit --signoff`”), indicating that the committer wrote the
code and has the right to release it under the
[Apache License, version 2.0](LICENSE.md)
[Mozilla Public License, version 2.0](LICENSE.md)
license. See the [TAC documentation on contribution sign off](https://github.com/AcademySoftwareFoundation/tac/blob/master/process/contributing.md#contribution-sign-off) for more information on this requirement.
#### Stale PRs
## Committer
A PR that does not have a signed CLA or DCO sign-off will be given at least one week in which to resolve the issue and then will be closed. The TSC cannot review or merge PRs without these requirements having been met. Please re-open PRs that are now expected to pass once this criteria has been met.
The committer role enables the participant to commit code directly to the repository, but also comes with the obligation to be a responsible leader in the community.
## Maintainer
The maintainer role is the equivalent of the "Committer" role in the charter.
This role enables the participant to commit code directly to the repository, but also comes with the obligation to be a responsible leader in the community.
### Process for becoming a maintainer
### Process for becoming a committer
* Show your experience with the codebase through contributions and engagement on the community channels.
* Request to become a maintainer.
* Have the majority of maintainers approve you becoming a maintainer.
* Request to become a committer.
* Have the majority of committers approve you becoming a committer.
* Your name and email is added to the MAINTAINERS.md file for the project.
### Maintainer responsibilities
### Committer responsibilities
* Monitor email aliases.
* Monitor Slack (delayed response is perfectly acceptable).
@@ -82,29 +76,28 @@ This role enables the participant to commit code directly to the repository, but
* Make sure that ongoing PRs are moving forward at the right pace or close them.
* Remain an active contributor to the project in general and the code base in particular.
### When does a maintainer lose maintainer status?
### When does a committer lose committer status?
If a maintainer is no longer interested or cannot perform the maintainer duties listed above, they
If a committer is no longer interested or cannot perform the committer duties listed above, they
should volunteer to be moved to emeritus status. In extreme cases this can also occur by a vote of
the maintainers per the voting process below.
the committers per the voting process below.
## Technical Steering Committee (TSC) member
The Technical Steering Committee (TSC) oversees the overall technical direction of OpenVDB, as defined in the [charter](charter.md).
TSC voting members consist of maintainers that have been nominated by the TSC, with a supermajority of voting members required to have a maintainer elected to be a TSC voting member. TSC voting members term and succession is defined in the [charter](charter.md).
TSC voting members consist of committers that have been nominated by the committers, with a supermajority of voting members required to have a committer elected to be a TSC voting member. TSC voting members term and succession is defined in the [charter](charter.md).
All meetings of the TSC are open to participation by any member of the OpenVDB community. Meeting times are listed in the [ASWF technical community calendar](https://lists.aswf.io/g/tac/calendar).
## Current TSC members
* Ken Museth (Chair), Nvidia
* Andre Pradhana, Nvidia
* Ken Museth, Chair / NVIDIA
* Andre Pradhana, DreamWorks
* Jeff Lait, SideFX
* Nick Avramoussis, WETA FX
* Nick Avramoussis, WETA
* Dan Bailey, ILM
* Richard Jones, ILM
* Gregory Hurst, United Therapeutics
* Richard Jones, DNEG
# Release Process
+347 -150
View File
@@ -1,176 +1,373 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
Mozilla Public License Version 2.0
==================================
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions
--------------
1. Definitions.
1.1. "Contributor"
means each individual or legal entity that creates, contributes to
the creation of, or owns Covered Software.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
1.3. "Contribution"
means Covered Software of a particular Contributor.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
1.4. "Covered Software"
means Source Code Form to which the initial Contributor has attached
the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case
including portions thereof.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
1.5. "Incompatible With Secondary Licenses"
means
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
(a) that the initial Contributor has attached the notice described
in Exhibit B to the Covered Software; or
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
(b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the
terms of a Secondary License.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
1.6. "Executable Form"
means any form of the work other than Source Code Form.
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
1.7. "Larger Work"
means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
1.8. "License"
means this document.
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
1.9. "Licensable"
means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
1.10. "Modifications"
means any of the following:
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
(a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered
Software; or
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(b) any new file in Source Code Form that contains any Covered
Software.
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its
Contributor Version.
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those
licenses.
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
1.13. "Source Code Form"
means the form of the work preferred for making modifications.
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For
purposes of this definition, "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of more than
fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
2. License Grants and Conditions
--------------------------------
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
2.1. Grants
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
(a) under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
(b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
2.2. Effective Date
END OF TERMS AND CONDITIONS
The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.
2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:
(a) for any code that a Contributor has removed from Covered Software;
or
(b) for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor
Version); or
(c) under Patent Claims infringed by Covered Software in the absence of
its Contributions.
This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).
2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).
2.5. Representation
Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use
This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.
2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1.
3. Responsibilities
-------------------
3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.
3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then:
(a) such Covered Software must also be made available in Source Code
Form, as described in Section 3.1, and You must inform recipients of
the Executable Form how they can obtain a copy of such Source Code
Form by reasonable means in a timely manner, at a charge no more
than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).
3.4. Notices
You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.
4. Inability to Comply Due to Statute or Regulation
---------------------------------------------------
If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it.
5. Termination
--------------
5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License
prior to termination shall survive termination.
************************************************************************
* *
* 6. Disclaimer of Warranty *
* ------------------------- *
* *
* Covered Software is provided under this License on an "as is" *
* basis, without warranty of any kind, either expressed, implied, or *
* statutory, including, without limitation, warranties that the *
* Covered Software is free of defects, merchantable, fit for a *
* particular purpose or non-infringing. The entire risk as to the *
* quality and performance of the Covered Software is with You. *
* Should any Covered Software prove defective in any respect, You *
* (not any Contributor) assume the cost of any necessary servicing, *
* repair, or correction. This disclaimer of warranty constitutes an *
* essential part of this License. No use of any Covered Software is *
* authorized under this License except under this disclaimer. *
* *
************************************************************************
************************************************************************
* *
* 7. Limitation of Liability *
* -------------------------- *
* *
* Under no circumstances and under no legal theory, whether tort *
* (including negligence), contract, or otherwise, shall any *
* Contributor, or anyone who distributes Covered Software as *
* permitted above, be liable to You for any direct, indirect, *
* special, incidental, or consequential damages of any character *
* including, without limitation, damages for lost profits, loss of *
* goodwill, work stoppage, computer failure or malfunction, or any *
* and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the *
* extent applicable law prohibits such limitation. Some *
* jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. *
* *
************************************************************************
8. Litigation
-------------
Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims.
9. Miscellaneous
----------------
This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor.
10. Versions of the License
---------------------------
10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.
10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.
10.3. Modified Versions
If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses
If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice
-------------------------------------------
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look
for such a notice.
You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0.
-2
View File
@@ -14,5 +14,3 @@ The current OpenVDB maintainers are:
| Ken Museth | ken.museth@gmail.com
| Andre Pradhana | andre.pradhana@gmail.com
| Richard Jones | richardj@ilm.com
| Gregory Hurst | tbd
| Jonathan Swartz | tbd
-33
View File
@@ -1,33 +0,0 @@
The following copyright holders agree that all of their contributions
originally submitted to this project under the Mozilla Public License
Version 2.0, are hereby relicensed to the Apache License, Version 2.0,
and are submitted pursuant to the Developer Certificate of Origin, version 1.1:
Ken Museth
Mehdi Chinoune
DreamWorks Animation
Side Effects Software Inc.
Blender Foundation
NVIDIA Corporation
United Therapeutics Corporation
Digital Domain 3.0, Inc.
Double Negative
Ubisoft Entertainment SA
Adobe Inc.
Mathieu Malaterre
Brecht Sanders
Ignacio Vizzo
Ben FrantzDale
Sebastian Gaida
Alessio Quaglino
Benedikt Mersch
David Aguilar
Brian Sharpe
Kartik Shrivastava
Michael Lackner
Lucas Baraya
Kuba Roth
Tom Cnops
Walt Disney Pictures (Walt Disney Animation Studios)
The Linux Foundation
Industrial Light & Magic (ILM)
+5 -5
View File
@@ -10,7 +10,7 @@
[Discussion Forum](https://github.com/AcademySoftwareFoundation/openvdb/discussions) |
[Documentation](https://www.openvdb.org/documentation/doxygen) |
[Releases](https://github.com/AcademySoftwareFoundation/openvdb/releases) |
[License](https://www.apache.org/licenses/LICENSE-2.0) |
[License](https://www.mozilla.org/MPL/2.0) |
[Slack](https://slack.aswf.io/)
OpenVDB is an open source C++ library comprising a novel hierarchical data
@@ -28,15 +28,13 @@ generally less stable than the [production releases](https://github.com/AcademyS
### License
OpenVDB is released under the [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0),
OpenVDB is released under the [Mozilla Public License Version 2.0](https://www.mozilla.org/MPL/2.0/),
which is a free, open source software license developed and maintained by the
Apache Software Foundation.
Mozilla Foundation.
The trademarks of any contributor to this project may not be used in
association with the project without the contributor's express permission.
NOTE: OpenVDB has completed re-licensing from [Mozilla Public License Version 2.0](https://www.mozilla.org/MPL/2.0/) to [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0). Please see the file RE-LICENSE_NOTE.txt for more details.
### Contributing
OpenVDB welcomes contributions to the OpenVDB project. Please refer to the
@@ -95,6 +93,8 @@ vcpkg install zlib:x64-windows
vcpkg install blosc:x64-windows
vcpkg install tbb:x64-windows
vcpkg install boost-iostreams:x64-windows
vcpkg install boost-any:x64-windows
vcpkg install boost-algorithm:x64-windows
vcpkg install boost-interprocess:x64-windows
```
+10 -22
View File
@@ -1,6 +1,4 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
set -e
@@ -33,13 +31,8 @@ PARMS[--target]=install
PARMS[--build-dir]=build
if [[ $RUNNER_NAME == *"8c-32g-300h"* ]]; then
if [[ $CXX == "g++" ]]; then
# GCC hits memory limits on runners, reduce threads
PARMS[-j]=6
else
# ASWF github actions runners have 8 threads
PARMS[-j]=8
fi
# ASWF github actions runners have 8 threads
PARMS[-j]=8
else
# Github actions runners have 2 threads
# https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners
@@ -56,8 +49,7 @@ declare -A COMPONENTS
COMPONENTS['core']='OPENVDB_BUILD_CORE'
COMPONENTS['python']='OPENVDB_BUILD_PYTHON_MODULE'
COMPONENTS['test']='OPENVDB_BUILD_UNITTESTS'
# @todo split out vdb tool from this...
COMPONENTS['bin']='OPENVDB_BUILD_VDB_PRINT,OPENVDB_BUILD_VDB_LOD,OPENVDB_BUILD_VDB_TOOL,OPENVDB_BUILD_VDB_TOOL_UNITTESTS'
COMPONENTS['bin']='OPENVDB_BUILD_BINARIES'
COMPONENTS['view']='OPENVDB_BUILD_VDB_VIEW'
COMPONENTS['render']='OPENVDB_BUILD_VDB_RENDER'
COMPONENTS['hou']='OPENVDB_BUILD_HOUDINI_PLUGIN'
@@ -73,8 +65,6 @@ COMPONENTS['nanotest']='NANOVDB_BUILD_UNITTESTS'
COMPONENTS['nanoexam']='NANOVDB_BUILD_EXAMPLES'
COMPONENTS['nanobench']='NANOVDB_BUILD_BENCHMARK'
COMPONENTS['nanotool']='NANOVDB_BUILD_TOOLS'
COMPONENTS['nanopython']='NANOVDB_BUILD_PYTHON_MODULE'
COMPONENTS['nanopytest']='NANOVDB_BUILD_PYTHON_UNITTESTS'
################################################
@@ -158,11 +148,7 @@ for comp in "${!COMPONENTS[@]}"; do
setting="ON"; break
fi
done
OPENVDB_TOGGLES="${COMPONENTS[$comp]}"
OPENVDB_TOGGLES=(${OPENVDB_TOGGLES//,/ })
for toggle in "${!OPENVDB_TOGGLES[@]}"; do
CMAKE_EXTRA+=("-D${OPENVDB_TOGGLES[$toggle]}=$setting")
done
CMAKE_EXTRA+=("-D${COMPONENTS[$comp]}=$setting")
done
################################################
@@ -194,14 +180,16 @@ cd ${BUILD_DIR}
set -x
# Note:
# - OPENVDB_BUILD_BINARIES is always ON, but each binary will be toggled depending on the provided comps
# - print and lod binary options are always on and can be toggles with: OPENVDB_BUILD_BINARIES=ON/OFF
# - always enabled the python tests with OPENVDB_BUILD_PYTHON_UNITTESTS if the python module is in use,
# regardless of the 'test' component being enabled or not (see the OPENVDB_BUILD_PYTHON_UNITTESTS option).
cmake \
-DOPENVDB_USE_DEPRECATED_ABI_11=ON \
-DOPENVDB_USE_DEPRECATED_ABI_12=ON \
-DOPENVDB_USE_DEPRECATED_ABI_9=ON \
-DOPENVDB_USE_DEPRECATED_ABI_10=ON \
-DOPENVDB_BUILD_VDB_PRINT=ON \
-DOPENVDB_BUILD_VDB_LOD=ON \
-DOPENVDB_BUILD_VDB_TOOL=ON \
-DOPENVDB_TOOL_USE_NANO=OFF \
-DOPENVDB_BUILD_BINARIES=ON \
-DOPENVDB_BUILD_PYTHON_UNITTESTS=ON \
-DMSVC_MP_THREAD_COUNT=${PARMS[-j]} \
"${CMAKE_EXTRA[@]}" \
-2
View File
@@ -1,6 +1,4 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
set -ex
+1 -1
View File
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
#
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MPL-2.0
#
# Python script to download the latest Houdini builds
# using the SideFX download API:
+16 -24
View File
@@ -1,6 +1,4 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
set -ex
@@ -8,14 +6,8 @@ HOUDINI_MAJOR="$1"
PLATFORM="$2"
OTHER_ARGS="$3"
if [[ $PLATFORM =~ "linux" ]]; then
pip3 install --user requests
elif [[ $PLATFORM =~ "macos" ]]; then
# Tell the homebrew install of pip3 that we don't care about installing directly through pip3
pip3 install --user requests --break-system-packages
fi
python3 ci/download_houdini.py $HOUDINI_MAJOR $PLATFORM $OTHER_ARGS
pip install --user requests
python ci/download_houdini.py $HOUDINI_MAJOR $PLATFORM $OTHER_ARGS
if [[ $PLATFORM =~ "linux" ]]; then
# create dir hierarchy
@@ -37,20 +29,20 @@ if [[ $PLATFORM =~ "linux" ]]; then
ls -al dsolib/
# copy required libraries
mv toolkit/cmake ../hou/toolkit/.
mv toolkit/include ../hou/toolkit/.
mv dsolib/libHoudini* ../hou/dsolib/.
mv dsolib/libopenvdb_sesi* ../hou/dsolib/.
mv dsolib/libblosc* ../hou/dsolib/.
mv dsolib/libhboost* ../hou/dsolib/.
mv dsolib/libz* ../hou/dsolib/.
mv dsolib/libbz2* ../hou/dsolib/.
mv dsolib/libtbb* ../hou/dsolib/.
mv dsolib/libjemalloc* ../hou/dsolib/.
mv dsolib/liblzma* ../hou/dsolib/.
mv dsolib/libIex* ../hou/dsolib/.
mv dsolib/libImath* ../hou/dsolib/.
mv dsolib/libIlmThread* ../hou/dsolib/.
cp -r toolkit/cmake ../hou/toolkit/.
cp -r toolkit/include ../hou/toolkit/.
cp -r dsolib/libHoudini* ../hou/dsolib/.
cp -r dsolib/libopenvdb_sesi* ../hou/dsolib/.
cp -r dsolib/libblosc* ../hou/dsolib/.
cp -r dsolib/libhboost* ../hou/dsolib/.
cp -r dsolib/libz* ../hou/dsolib/.
cp -r dsolib/libbz2* ../hou/dsolib/.
cp -r dsolib/libtbb* ../hou/dsolib/.
cp -r dsolib/libjemalloc* ../hou/dsolib/.
cp -r dsolib/liblzma* ../hou/dsolib/.
cp -r dsolib/libIex* ../hou/dsolib/.
cp -r dsolib/libImath* ../hou/dsolib/.
cp -r dsolib/libIlmThread* ../hou/dsolib/.
cd ..
elif [[ $PLATFORM =~ "macos" ]]; then
-2
View File
@@ -1,6 +1,4 @@
#!/usr/bin/env python3
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
import os
import sys
-2
View File
@@ -1,6 +1,4 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
#################################################################################
# This script extracts all code blocks from AX documentation which are NOT #
# marked as cpp/sh/unparsed and attempts to parse or compile them through the #
-2
View File
@@ -1,6 +1,4 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
set -ex
-17
View File
@@ -1,17 +0,0 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
set -ex
CURL_VERSION="$1"
wget -O cppunit.tar.gz https://dev-www.libreoffice.org/src/cppunit-${CURL_VERSION}.tar.gz
tar -xzf cppunit.tar.gz
cd cppunit-${CURL_VERSION}
./configure
make -j8
make install
+1 -3
View File
@@ -1,6 +1,4 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
set -ex
@@ -15,6 +13,6 @@ fi
mkdir build
cd build
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 ../.
cmake ../.
make -j8
make install
-21
View File
@@ -1,21 +0,0 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
set -ex
EXR_VERSION="$1"
git clone https://github.com/AcademySoftwareFoundation/openexr.git
cd openexr
if [ "$EXR_VERSION" != "latest" ]; then
git checkout tags/${EXR_VERSION} -b ${EXR_VERSION}
fi
mkdir build
cd build
cmake ..
make -j$(nproc)
sudo make install
-21
View File
@@ -1,21 +0,0 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
set -ex
GLFW_VERSION="$1"
git clone https://github.com/glfw/glfw.git
cd glfw
if [ "$GLFW_VERSION" != "latest" ]; then
git checkout tags/${GLFW_VERSION} -b ${GLFW_VERSION}
fi
mkdir build
cd build
cmake ..
make -j8
make install
-21
View File
@@ -1,21 +0,0 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
set -ex
GTEST_VERSION="$1"
git clone https://github.com/google/googletest.git
cd googletest
if [ "$GTEST_VERSION" != "latest" ]; then
git checkout tags/${GTEST_VERSION} -b ${GTEST_VERSION}
fi
mkdir build
cd build
cmake ..
make -j$(nproc)
sudo make install
-21
View File
@@ -1,21 +0,0 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
set -ex
IMATH_VERSION="$1"
git clone https://github.com/AcademySoftwareFoundation/Imath.git
cd Imath
if [ "$IMATH_VERSION" != "latest" ]; then
git checkout tags/${IMATH_VERSION} -b ${IMATH_VERSION}
fi
mkdir build
cd build
cmake ..
make -j$(nproc)
sudo make install
+6 -37
View File
@@ -1,58 +1,27 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
set -ex
LLVM_VER="$1"
LLVM_CRT="$2"
LLVM_CRT="$1"
# Legacy define for older versions of LLVM
LLVM_LEGACY_CRT_DEFINE=""
if [[ "${LLVM_CRT}" == "MultiThreaded" ]]; then
LLVM_LEGACY_CRT_DEFINE="MT"
elif [[ "${LLVM_CRT}" == "MultiThreadedDebug" ]]; then
LLVM_LEGACY_CRT_DEFINE="MTd"
elif [[ "${LLVM_CRT}" == "MultiThreadedDLL" ]]; then
LLVM_LEGACY_CRT_DEFINE="MD"
elif [[ "${LLVM_CRT}" == "MultiThreadedDebugDLL" ]]; then
LLVM_LEGACY_CRT_DEFINE="MDd"
fi
git clone -b llvmorg-${LLVM_VER} --depth 1 https://github.com/llvm/llvm-project.git llvm
git clone -b llvmorg-12.0.0 --depth 1 https://github.com/llvm/llvm-project.git llvm
cd llvm
mkdir .build
cd .build
# @note currently only test static builds with MT
cmake -B . -S ../llvm -A x64 -G "Visual Studio 17 2022" -Thost=x64 \
-DCMAKE_INSTALL_PREFIX="${HOME}/llvm_install" \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=OFF \
-DLLVM_ENABLE_PROJECTS="" \
-DLLVM_ENABLE_RUNTIMES="" \
-DLLVM_ENABLE_UNWIND_TABLES=OFF \
-DLLVM_TARGETS_TO_BUILD="host" \
-DLLVM_BUILD_TOOLS=OFF \
-DLLVM_INCLUDE_BENCHMARKS=OFF \
-DLLVM_INCLUDE_EXAMPLES=OFF \
-DLLVM_INCLUDE_TESTS=OFF \
-DLLVM_INCLUDE_DOCS=OFF \
-DLLVM_INCLUDE_TOOLS=OFF \
-DLLVM_INCLUDE_UTILS=OFF \
-DLLVM_BUILD_BENCHMARKS=OFF \
-DLLVM_BUILD_EXAMPLES=OFF \
-DLLVM_BUILD_TESTS=OFF \
-DLLVM_BUILD_DOCS=OFF \
-DLLVM_BUILD_TOOLS=OFF \
-DLLVM_BUILD_UTILS=OFF \
-DLLVM_ENABLE_BINDINGS=OFF \
-DLLVM_ENABLE_OCAMLDOC=OFF \
-DLLVM_PARALLEL_COMPILE_JOBS=4 \
-DLLVM_PARALLEL_LINK_JOBS=4 \
-DCMAKE_MSVC_RUNTIME_LIBRARY=${LLVM_CRT} \
-DLLVM_USE_CRT_RELEASE=${LLVM_LEGACY_CRT_DEFINE}
-DLLVM_USE_CRT_RELEASE=${LLVM_CRT}
cmake --build . --parallel 4 --config Release --target install
cmake --build . --config Release --target install
cd ..
+6 -19
View File
@@ -1,16 +1,7 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
set -x
# Remove Python3 symlinks in /usr/local/bin as workaround to brew update issues
# https://github.com/actions/setup-python/issues/577
rm /usr/local/bin/2to3* || :
rm /usr/local/bin/idle3* || :
rm /usr/local/bin/pydoc* || :
rm /usr/local/bin/python3* || :
brew update
brew install bash gnu-getopt # for CI scripts
brew install boost
@@ -20,33 +11,29 @@ brew install glfw
brew install googletest
brew install jq # for trivial parsing of brew json
brew install openexr
brew install nanobind # also installs the dependent python version
brew install robin-map # required for nanobind
brew install numpy # only for python tests
brew install pybind11 # also installs the dependent python version
brew install tbb
brew install zlib
brew install jemalloc
# Alias python version installed by nanobind to path
py_version=$(brew info nanobind --json | \
# Alias python version installed by pybind11 to path
py_version=$(brew info pybind11 --json | \
jq -cr '.[].dependencies[] | select(. | startswith("python"))')
echo "Using python $py_version"
# export for subsequent action steps (note, not exported for this env)
echo "Python_ROOT_DIR=/usr/local/opt/$py_version" >> $GITHUB_ENV
echo "/usr/local/opt/$py_version/bin" >> $GITHUB_PATH
# use bash
echo "/usr/local/opt/bash/bin" >> $GITHUB_PATH
echo "/opt/homebrew/opt/bash/bin" >> $GITHUB_PATH
# use gnu-getopt
echo "/usr/local/opt/gnu-getopt/bin" >> $GITHUB_PATH
echo "/opt/homebrew/opt/gnu-getopt/bin" >> $GITHUB_PATH
LLVM_VERSION=$1
if [ ! -z "$LLVM_VERSION" ]; then
if [ "$LLVM_VERSION" == "latest" ]; then
brew install llvm
brew install cppunit
else
brew install llvm@$LLVM_VERSION
brew install cppunit
fi
fi
@@ -1,6 +1,4 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
set -ex
@@ -11,8 +9,8 @@ if [ ! -z "${INSTALL_ROOT}" ]; then
CMAKE_EXTRA+=("-DCMAKE_INSTALL_PREFIX=${INSTALL_ROOT}")
fi
git clone --recurse-submodules https://github.com/wjakob/nanobind.git
cd nanobind
git clone https://github.com/pybind/pybind11.git
cd pybind11
if [ "$PYBIND11_VERSION" != "latest" ]; then
git checkout tags/v${PYBIND11_VERSION} -b v${PYBIND11_VERSION}
@@ -22,9 +20,9 @@ mkdir build
cd build
cmake \
-DNB_TEST=OFF \
-DPYBIND11_TEST=OFF \
"${CMAKE_EXTRA[@]}" \
..
make -j8
sudo make install
make install
-8
View File
@@ -1,8 +0,0 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
set -x
brew update
brew install tbb
-28
View File
@@ -1,28 +0,0 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
set -ex
# Download the TeX Live installer
wget https://mirrors.mit.edu/CTAN/systems/texlive/tlnet/install-tl-unx.tar.gz
# Extract
tar xzf install-tl-unx.tar.gz
rm install-tl-unx.tar.gz
cd install-tl-*
# Run the installer with no docs or source installation
./install-tl --no-interaction --no-doc-install --no-src-install --scheme=minimal --repository https://mirrors.mit.edu/CTAN/systems/texlive/tlnet
# Export the texlive PATH to GITHUB_PATH
TEXLIVE_PATH=$(echo /usr/local/texlive/*/bin/x86_64-linux)
export PATH=${TEXLIVE_PATH}:${PATH}
echo "${TEXLIVE_PATH}" >> $GITHUB_PATH
# Install the required packages
tlmgr install latex-bin dvips collection-fontsrecommended collection-latexrecommended
# Validate that installing dvips and latex has been successful
dvips --version
latex --version
-40
View File
@@ -1,40 +0,0 @@
# Enable verbose and stop on error
$ErrorActionPreference = "Stop"
$VerbosePreference = "Continue"
# Required dependencies
$vcpkgPackages = @(
"zlib",
"libpng",
"openexr",
"tbb",
"gtest",
"cppunit",
"blosc",
"glfw3",
"glew",
"python3",
"jemalloc",
"boost-iostreams",
"boost-interprocess",
"boost-algorithm",
"nanobind"
)
# Update vcpkg
vcpkg update
# Allow the vcpkg command to fail once so we can retry with the latest
try {
vcpkg install $vcpkgPackages
} catch {
Write-Host "vcpkg install failed, retrying with latest ports..."
# Retry the installation with updated ports
Push-Location $env:VCPKG_INSTALLATION_ROOT
git pull
Pop-Location
vcpkg update
vcpkg install $vcpkgPackages
}
Write-Host "vcpkg install completed successfully"
+8
View File
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
set -ex
vcpkg update
vcpkg install zlib libpng openexr tbb gtest cppunit blosc glfw3 glew python3 jemalloc \
boost-iostreams boost-interprocess boost-algorithm pybind11 \
--clean-after-build
+2 -3
View File
@@ -26,13 +26,12 @@ $CUDA_KNOWN_URLS = @{
"11.2.1" = "https://developer.download.nvidia.com/compute/cuda/11.2.1/network_installers/cuda_11.2.1_win10_network.exe";
"11.2.2" = "https://developer.download.nvidia.com/compute/cuda/11.2.2/network_installers/cuda_11.2.2_win10_network.exe";
"11.3.0" = "https://developer.download.nvidia.com/compute/cuda/11.3.0/network_installers/cuda_11.3.0_win10_network.exe";
"11.6.2" = "https://developer.download.nvidia.com/compute/cuda/11.6.2/network_installers/cuda_11.6.2_windows_network.exe";
"12.4.0" = "https://developer.download.nvidia.com/compute/cuda/12.4.0/network_installers/cuda_12.4.0_windows_network.exe"
"11.6.2" = "https://developer.download.nvidia.com/compute/cuda/11.6.2/network_installers/cuda_11.6.2_windows_network.exe"
}
# @todo - change this to be based on _MSC_VER intead, or invert it to be CUDA keyed instead?
$VISUAL_STUDIO_MIN_CUDA = @{
"2022" = "12.4";
"2022" = "11.6";
"2019" = "10.1";
"2017" = "10.0"; # Depends on which version of 2017! 9.0 to 10.0 depending on version
"2015" = "8.0"; # might support older, unsure.
-9
View File
@@ -1,9 +0,0 @@
# Enable verbose and stop on error
$ErrorActionPreference = "Stop"
$VerbosePreference = "Continue"
# Install numpy for tests
& "$env:VCPKG_INSTALLATION_ROOT\installed\$env:VCPKG_DEFAULT_TRIPLET\tools\python3\python.exe" -m ensurepip --upgrade
& "$env:VCPKG_INSTALLATION_ROOT\installed\$env:VCPKG_DEFAULT_TRIPLET\tools\python3\python.exe" -m pip install numpy
Write-Host "pip numpy install completed successfully"
+1 -3
View File
@@ -1,6 +1,4 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
set -e
# Various tests to test the FindOpenVDB CMake modules and
@@ -10,7 +8,7 @@ set -e
# the expected VDB installation
cmakelists="
cmake_minimum_required(VERSION 3.24)
cmake_minimum_required(VERSION 3.18)
project(TestInstall LANGUAGES CXX)
find_package(OpenVDB REQUIRED COMPONENTS openvdb)
add_executable(test_vdb_print \"../openvdb_cmd/vdb_print/main.cc\")
-2
View File
@@ -1,6 +1,4 @@
#!/usr/bin/env bash
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
set -ex
-236
View File
@@ -1,236 +0,0 @@
#!/usr/bin/env python3
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
"""Validate cross-references inside the OpenVDB documentation tree.
Run from the repo root (no arguments) or pass paths to validate explicitly.
The script scans Markdown (`.md`) and Doxygen narrative (`.txt`) files under
``doc/`` and checks two classes of cross-reference for staleness:
1. ``#include <path/to/header.h>`` lines that appear inside Markdown
``cpp``/``cuda``/``c``/``c++`` fenced code blocks or inside Doxygen
``@code``/``\\code`` blocks. Each include is resolved to a real file in
``openvdb/``, ``openvdb_ax/``, ``openvdb_houdini/`` or ``nanovdb/``.
2. ``https://github.com/AcademySoftwareFoundation/openvdb/blob/<ref>/<path>``
URLs. The ``<path>`` portion is checked against the local checkout.
The script exits non-zero on any unresolved reference and prints a
``file:line`` style error so the failure is actionable in CI logs. It is
intentionally dependency-free so it can run in a minimal Python container.
This guards against the class of bug tracked in issue #2161, where renames
under ``nanovdb/util/ -> nanovdb/tools/`` and ``nanovdb/util/IO.h ->
nanovdb/io/IO.h`` silently left the docs referencing paths that no longer
exist.
"""
from __future__ import annotations
import re
import sys
from pathlib import Path
from typing import Iterable, List, Sequence, Tuple
REPO_ROOT = Path(__file__).resolve().parent.parent
# Map a top-level include namespace to one or more on-disk directories that it
# resolves against. ``#include <nanovdb/io/IO.h>`` resolves to
# ``nanovdb/nanovdb/io/IO.h`` because the repo uses a double-named layout;
# ``#include <houdini_utils/ParmFactory.h>`` resolves to
# ``openvdb_houdini/openvdb_houdini/ParmFactory.h`` because the Houdini plugin
# CMake configuration synthesises a ``houdini_utils/`` subtree at build time
# (see ``openvdb_houdini/openvdb_houdini/CMakeLists.txt``).
INCLUDE_NAMESPACE_ROOTS = {
"openvdb": ("openvdb/openvdb", "openvdb"),
"openvdb_ax": ("openvdb_ax/openvdb_ax", "openvdb_ax"),
"openvdb_houdini": ("openvdb_houdini/openvdb_houdini", "openvdb_houdini"),
"nanovdb": ("nanovdb/nanovdb", "nanovdb"),
"houdini_utils": ("openvdb_houdini/openvdb_houdini",),
}
# Top-level include path components that come from outside this repo. When a
# header's leading component matches one of these, we skip resolution entirely.
# Houdini SDK headers (``UT/``, ``GA/``, ``GEO_*``, etc.) live in the Houdini
# install, not in our checkout.
EXTERNAL_INCLUDE_PREFIXES = (
"boost/",
"tbb/",
"cuda", # cuda_runtime.h, cuda.h, ...
"thrust/",
"Eigen/",
"OpenEXR/",
"Imath/",
"openexr/",
"GL/",
# Houdini SDK prefixes
"UT/",
"GA/",
"GU/",
"GEO/",
"GT/",
"GR/",
"OP/",
"PRM/",
"SOP/",
"SYS/",
"CH/",
"DEP/",
"PI/",
"RE/",
# Standard library headers (no '/' is the usual signal, but list a few
# explicitly to be safe).
"stdio.h",
"iostream",
"vector",
"string",
"memory",
"cstdint",
)
# Match a Markdown fenced code block whose language is one of cpp/cuda/c/c++.
_MARKDOWN_FENCE_RE = re.compile(
r"^```(?:cpp|cuda|c\+\+|c)\s*$(?P<body>.*?)^```\s*$",
re.DOTALL | re.MULTILINE,
)
# Doxygen ``@code``/``\code`` ... ``@endcode``/``\endcode`` blocks. The
# language hint (``@code{.cpp}``) is optional.
_DOXY_CODE_RE = re.compile(
r"[@\\]code(?:\{[^}]*\})?\s*$(?P<body>.*?)^[@\\]endcode\s*$",
re.DOTALL | re.MULTILINE,
)
_INCLUDE_RE = re.compile(r"#\s*include\s*<([^>\n]+)>")
# Match URLs pointing into a blob in this repo. ``<ref>`` may be a branch
# name or a sha; ``<path>`` is the portion that must exist on disk today.
_GITHUB_BLOB_RE = re.compile(
r"https?://github\.com/AcademySoftwareFoundation/openvdb/blob/"
r"(?P<ref>[^/\s]+)/(?P<path>[^\s)\"'#?]+)"
)
def is_external_include(header: str) -> bool:
"""Return True for headers we cannot resolve from this repo."""
head, _, _ = header.partition("/")
if head in INCLUDE_NAMESPACE_ROOTS:
return False
return any(header.startswith(p) for p in EXTERNAL_INCLUDE_PREFIXES) or "/" not in header
def resolve_include(header: str) -> Path | None:
"""Resolve ``#include <header>`` to a path on disk, or None if not found."""
head, _, rest = header.partition("/")
roots = INCLUDE_NAMESPACE_ROOTS.get(head)
if roots is None or not rest:
return None
for root in roots:
candidate = REPO_ROOT / root / rest
if candidate.is_file():
return candidate
return None
def iter_code_block_lines(text: str) -> Iterable[Tuple[int, str]]:
"""Yield (line_number, line_text) for every line inside a code block.
Line numbers are 1-based and refer to the original ``text``. Handles both
Markdown fences (```cpp ...```) and Doxygen ``@code``/``\\code`` blocks.
"""
for match in _MARKDOWN_FENCE_RE.finditer(text):
body_start = match.start("body")
yield from _lines_with_offsets(text, match.group("body"), body_start)
for match in _DOXY_CODE_RE.finditer(text):
body_start = match.start("body")
yield from _lines_with_offsets(text, match.group("body"), body_start)
def _lines_with_offsets(full_text: str, body: str, body_offset: int) -> Iterable[Tuple[int, str]]:
base_line = full_text.count("\n", 0, body_offset) + 1
for i, line in enumerate(body.splitlines()):
yield base_line + i, line
def find_doc_files(extra_paths: Sequence[str]) -> List[Path]:
"""Return the list of doc files to scan.
Without arguments, scan ``doc/**/*.md`` and ``doc/**/*.txt``. With
arguments, scan only those files (resolved relative to the repo root).
"""
if extra_paths:
return [
(Path(p) if Path(p).is_absolute() else REPO_ROOT / p).resolve()
for p in extra_paths
]
doc_dir = REPO_ROOT / "doc"
return sorted(
list(doc_dir.rglob("*.md")) + list(doc_dir.rglob("*.txt"))
)
def check_file(path: Path) -> List[str]:
"""Return a list of human-readable error strings for the given doc file."""
errors: List[str] = []
try:
text = path.read_text(encoding="utf-8")
except (OSError, UnicodeDecodeError) as exc:
return [f"{path}: failed to read: {exc}"]
rel = path.relative_to(REPO_ROOT) if path.is_relative_to(REPO_ROOT) else path
for line_no, line in iter_code_block_lines(text):
for include_match in _INCLUDE_RE.finditer(line):
header = include_match.group(1).strip()
if is_external_include(header):
continue
if resolve_include(header) is None:
errors.append(
f"{rel}:{line_no}: include <{header}> does not resolve "
"to a file in this checkout"
)
for url_match in _GITHUB_BLOB_RE.finditer(text):
ref = url_match.group("ref")
url_path = url_match.group("path")
on_disk = REPO_ROOT / url_path
if not on_disk.exists():
# Compute the 1-based line number of the URL for the error report.
line_no = text.count("\n", 0, url_match.start()) + 1
errors.append(
f"{rel}:{line_no}: github URL "
f"AcademySoftwareFoundation/openvdb/blob/{ref}/{url_path} "
"does not exist in this checkout"
)
return errors
def main(argv: Sequence[str]) -> int:
files = find_doc_files(argv[1:])
total_errors: List[str] = []
for path in files:
if not path.exists():
total_errors.append(f"{path}: file does not exist")
continue
total_errors.extend(check_file(path))
if total_errors:
print("Documentation reference validation FAILED.", file=sys.stderr)
print("", file=sys.stderr)
for err in total_errors:
print(err, file=sys.stderr)
print("", file=sys.stderr)
print(
f"{len(total_errors)} broken reference(s) across "
f"{len(files)} file(s).",
file=sys.stderr,
)
return 1
print(f"OK: {len(files)} doc file(s) validated, no broken references.")
return 0
if __name__ == "__main__":
sys.exit(main(sys.argv))
-24
View File
@@ -1,24 +0,0 @@
# SPDX-License-Identifier: MIT
#
# SPDX-FileCopyrightText: Copyright (c) 2019-2023 Lars Melchior and contributors
set(CPM_DOWNLOAD_VERSION 0.40.2)
set(CPM_HASH_SUM "c8cdc32c03816538ce22781ed72964dc864b2a34a310d3b7104812a5ca2d835d")
if(CPM_SOURCE_CACHE)
set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
elseif(DEFINED ENV{CPM_SOURCE_CACHE})
set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
else()
set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
endif()
# Expand relative path. This is important if the provided path contains a tilde (~)
get_filename_component(CPM_DOWNLOAD_LOCATION ${CPM_DOWNLOAD_LOCATION} ABSOLUTE)
file(DOWNLOAD
https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
${CPM_DOWNLOAD_LOCATION} EXPECTED_HASH SHA256=${CPM_HASH_SUM}
)
include(${CPM_DOWNLOAD_LOCATION})
+28 -7
View File
@@ -1,5 +1,5 @@
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MPL-2.0
#
#[=======================================================================[.rst:
@@ -88,7 +88,7 @@ may be provided to tell this module where to look.
#]=======================================================================]
cmake_minimum_required(VERSION 3.24)
cmake_minimum_required(VERSION 3.18)
include(GNUInstallDirs)
mark_as_advanced(
@@ -188,6 +188,22 @@ list(APPEND _BLOSC_LIBRARYDIR_SEARCH_DIRS
${SYSTEM_LIBRARY_PATHS}
)
# Library suffix handling
set(_BLOSC_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
set(_BLOSC_ORIG_CMAKE_FIND_LIBRARY_PREFIXES ${CMAKE_FIND_LIBRARY_PREFIXES})
if(MSVC)
if(BLOSC_USE_STATIC_LIBS)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
set(CMAKE_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES};lib")
endif()
else()
if(BLOSC_USE_STATIC_LIBS)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
endif()
endif()
set(Blosc_LIB_COMPONENTS "")
# NOTE: Search for debug version first (see vcpkg hack)
list(APPEND BLOSC_BUILD_TYPES DEBUG RELEASE)
@@ -230,6 +246,13 @@ foreach(BUILD_TYPE ${BLOSC_BUILD_TYPES})
set(CMAKE_IGNORE_PATH ${_BLOSC_CMAKE_IGNORE_PATH})
endforeach()
# Reset library suffix
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_BLOSC_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
set(CMAKE_FIND_LIBRARY_PREFIXES ${_BLOSC_ORIG_CMAKE_FIND_LIBRARY_PREFIXES})
unset(_BLOSC_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
unset(_BLOSC_ORIG_CMAKE_FIND_LIBRARY_PREFIXES)
if(Blosc_LIBRARY_DEBUG AND Blosc_LIBRARY_RELEASE)
# if the generator is multi-config or if CMAKE_BUILD_TYPE is set for
# single-config generators, set optimized and debug libraries
@@ -419,11 +442,9 @@ if(NOT TARGET Blosc::blosc)
set(${BLOSC_EXTERNAL_LIB}_LIBRARIES ${${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG})
endif()
if(${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE OR ${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG)
target_link_libraries(Blosc::blosc INTERFACE
$<$<CONFIG:Release>:${${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE}>
$<$<CONFIG:Debug>:${${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG}>)
endif()
target_link_libraries(Blosc::blosc INTERFACE
$<$<CONFIG:Release>:${${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE}>
$<$<CONFIG:Debug>:${${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG}>)
endforeach()
endif()
+320
View File
@@ -0,0 +1,320 @@
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: MPL-2.0
#
#[=======================================================================[.rst:
FindCppUnit
-----------
Find CppUnit include dirs and libraries
Use this module by invoking find_package with the form::
find_package(CppUnit
[version] [EXACT] # Minimum or EXACT version
[REQUIRED] # Fail with error if CppUnit is not found
)
IMPORTED Targets
^^^^^^^^^^^^^^^^
``CppUnit::cppunit``
This module defines IMPORTED target CppUnit::cppunit, if CppUnit has been
found.
Result Variables
^^^^^^^^^^^^^^^^
This will define the following variables:
``CppUnit_FOUND``
True if the system has the CppUnit library.
``CppUnit_VERSION``
The version of the CppUnit library which was found.
``CppUnit_INCLUDE_DIRS``
Include directories needed to use CppUnit.
``CppUnit_RELEASE_LIBRARIES``
Libraries needed to link to the release version of CppUnit.
``CppUnit_RELEASE_LIBRARY_DIRS``
CppUnit release library directories.
``CppUnit_DEBUG_LIBRARIES``
Libraries needed to link to the debug version of CppUnit.
``CppUnit_DEBUG_LIBRARY_DIRS``
CppUnit debug library directories.
Deprecated - use [RELEASE|DEBUG] variants:
``CppUnit_LIBRARIES``
Libraries needed to link to CppUnit.
``CppUnit_LIBRARY_DIRS``
CppUnit library directories.
Cache Variables
^^^^^^^^^^^^^^^
The following cache variables may also be set:
``CppUnit_INCLUDE_DIR``
The directory containing ``cppunit/Portability.h``.
``CppUnit_LIBRARY``
The path to the CppUnit library.
Hints
^^^^^
Instead of explicitly setting the cache variables, the following variables
may be provided to tell this module where to look.
``CppUnit_ROOT``
Preferred installation prefix.
``CPPUNIT_INCLUDEDIR``
Preferred include directory e.g. <prefix>/include
``CPPUNIT_LIBRARYDIR``
Preferred library directory e.g. <prefix>/lib
``CPPUNIT_DEBUG_SUFFIX``
Suffix of the debug version of CppUnit libs. Defaults to "_d".
``SYSTEM_LIBRARY_PATHS``
Global list of library paths intended to be searched by and find_xxx call
``CPPUNIT_USE_STATIC_LIBS``
Only search for static cppunit libraries
``DISABLE_CMAKE_SEARCH_PATHS``
Disable CMakes default search paths for find_xxx calls in this module
#]=======================================================================]
cmake_minimum_required(VERSION 3.18)
include(GNUInstallDirs)
mark_as_advanced(
CppUnit_INCLUDE_DIR
CppUnit_LIBRARY
)
set(_FIND_CPPUNIT_ADDITIONAL_OPTIONS "")
if(DISABLE_CMAKE_SEARCH_PATHS)
set(_FIND_CPPUNIT_ADDITIONAL_OPTIONS NO_DEFAULT_PATH)
endif()
# Set _CPPUNIT_ROOT based on a user provided root var. Xxx_ROOT and ENV{Xxx_ROOT}
# are prioritised over the legacy capitalized XXX_ROOT variables for matching
# CMake 3.12 behaviour
# @todo deprecate -D and ENV CPPUNIT_ROOT from CMake 3.12
if(CppUnit_ROOT)
set(_CPPUNIT_ROOT ${CppUnit_ROOT})
elseif(DEFINED ENV{CppUnit_ROOT})
set(_CPPUNIT_ROOT $ENV{CppUnit_ROOT})
elseif(CPPUNIT_ROOT)
set(_CPPUNIT_ROOT ${CPPUNIT_ROOT})
elseif(DEFINED ENV{CPPUNIT_ROOT})
set(_CPPUNIT_ROOT $ENV{CPPUNIT_ROOT})
endif()
# Additionally try and use pkconfig to find cppunit
if(USE_PKGCONFIG)
if(NOT DEFINED PKG_CONFIG_FOUND)
find_package(PkgConfig)
endif()
pkg_check_modules(PC_CppUnit QUIET cppunit)
endif()
# ------------------------------------------------------------------------
# Search for CppUnit include DIR
# ------------------------------------------------------------------------
set(_CPPUNIT_INCLUDE_SEARCH_DIRS "")
list(APPEND _CPPUNIT_INCLUDE_SEARCH_DIRS
${CPPUNIT_INCLUDEDIR}
${_CPPUNIT_ROOT}
${PC_CppUnit_INCLUDEDIR}
${SYSTEM_LIBRARY_PATHS}
)
# Look for a standard cppunit header file.
find_path(CppUnit_INCLUDE_DIR cppunit/Portability.h
${_FIND_CPPUNIT_ADDITIONAL_OPTIONS}
PATHS ${_CPPUNIT_INCLUDE_SEARCH_DIRS}
PATH_SUFFIXES ${CMAKE_INSTALL_INCLUDEDIR} include
)
if(EXISTS "${CppUnit_INCLUDE_DIR}/cppunit/Portability.h")
file(STRINGS "${CppUnit_INCLUDE_DIR}/cppunit/Portability.h"
_cppunit_version_string REGEX "#define CPPUNIT_VERSION "
)
string(REGEX REPLACE "#define CPPUNIT_VERSION +\"(.+)\".*$" "\\1"
_cppunit_version_string "${_cppunit_version_string}"
)
string(STRIP "${_cppunit_version_string}" CppUnit_VERSION)
unset(_cppunit_version_string )
endif()
# ------------------------------------------------------------------------
# Search for CppUnit lib DIR
# ------------------------------------------------------------------------
if(NOT DEFINED CPPUNIT_DEBUG_SUFFIX)
set(CPPUNIT_DEBUG_SUFFIX "d")
endif()
set(_CPPUNIT_LIBRARYDIR_SEARCH_DIRS "")
list(APPEND _CPPUNIT_LIBRARYDIR_SEARCH_DIRS
${CPPUNIT_LIBRARYDIR}
${_CPPUNIT_ROOT}
${PC_CppUnit_LIBDIR}
${SYSTEM_LIBRARY_PATHS}
)
# Library suffix handling
set(_CPPUNIT_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
if(MSVC)
if(CPPUNIT_USE_STATIC_LIBS)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
else()
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "_dll.lib")
endif()
else()
if(CPPUNIT_USE_STATIC_LIBS)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
endif()
endif()
list(APPEND CPPUNIT_BUILD_TYPES RELEASE DEBUG)
foreach(BUILD_TYPE ${CPPUNIT_BUILD_TYPES})
set(_CPPUNIT_LIB_NAME cppunit)
if(BUILD_TYPE STREQUAL DEBUG)
set(_CPPUNIT_LIB_NAME "${_CPPUNIT_LIB_NAME}${CPPUNIT_DEBUG_SUFFIX}")
endif()
# Find the lib
find_library(CppUnit_LIBRARY_${BUILD_TYPE} ${_CPPUNIT_LIB_NAME}
${_FIND_CPPUNIT_ADDITIONAL_OPTIONS}
PATHS ${_CPPUNIT_LIBRARYDIR_SEARCH_DIRS}
PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} lib64 lib
)
endforeach()
# Reset library suffix
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_CPPUNIT_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
unset(_CPPUNIT_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
if(CppUnit_LIBRARY_DEBUG AND CppUnit_LIBRARY_RELEASE)
# if the generator is multi-config or if CMAKE_BUILD_TYPE is set for
# single-config generators, set optimized and debug libraries
get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(_isMultiConfig OR CMAKE_BUILD_TYPE)
set(CppUnit_LIBRARY optimized ${CppUnit_LIBRARY_RELEASE} debug ${CppUnit_LIBRARY_DEBUG})
else()
# For single-config generators where CMAKE_BUILD_TYPE has no value,
# just use the release libraries
set(CppUnit_LIBRARY ${CppUnit_LIBRARY_RELEASE})
endif()
# FIXME: This probably should be set for both cases
set(CppUnit_LIBRARIES optimized ${CppUnit_LIBRARY_RELEASE} debug ${CppUnit_LIBRARY_DEBUG})
endif()
# if only the release version was found, set the debug variable also to the release version
if(CppUnit_LIBRARY_RELEASE AND NOT CppUnit_LIBRARY_DEBUG)
set(CppUnit_LIBRARY_DEBUG ${CppUnit_LIBRARY_RELEASE})
set(CppUnit_LIBRARY ${CppUnit_LIBRARY_RELEASE})
set(CppUnit_LIBRARIES ${CppUnit_LIBRARY_RELEASE})
endif()
# if only the debug version was found, set the release variable also to the debug version
if(CppUnit_LIBRARY_DEBUG AND NOT CppUnit_LIBRARY_RELEASE)
set(CppUnit_LIBRARY_RELEASE ${CppUnit_LIBRARY_DEBUG})
set(CppUnit_LIBRARY ${CppUnit_LIBRARY_DEBUG})
set(CppUnit_LIBRARIES ${CppUnit_LIBRARY_DEBUG})
endif()
# If the debug & release library ends up being the same, omit the keywords
if("${CppUnit_LIBRARY_RELEASE}" STREQUAL "${CppUnit_LIBRARY_DEBUG}")
set(CppUnit_LIBRARY ${CppUnit_LIBRARY_RELEASE} )
set(CppUnit_LIBRARIES ${CppUnit_LIBRARY_RELEASE} )
endif()
if(CppUnit_LIBRARY)
set(CppUnit_FOUND TRUE)
else()
set(CppUnit_FOUND FALSE)
endif()
# ------------------------------------------------------------------------
# Cache and set CppUnit_FOUND
# ------------------------------------------------------------------------
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(CppUnit
FOUND_VAR CppUnit_FOUND
REQUIRED_VARS
CppUnit_LIBRARY
CppUnit_INCLUDE_DIR
VERSION_VAR CppUnit_VERSION
)
if(NOT CppUnit_FOUND)
if(CppUnit_FIND_REQUIRED)
message(FATAL_ERROR "Unable to find CppUnit")
endif()
return()
endif()
# Partition release/debug lib vars
set(CppUnit_RELEASE_LIBRARIES ${CppUnit_LIBRARY_RELEASE})
get_filename_component(CppUnit_RELEASE_LIBRARY_DIRS ${CppUnit_RELEASE_LIBRARIES} DIRECTORY)
set(CppUnit_DEBUG_LIBRARIES ${CppUnit_LIBRARY_DEBUG})
get_filename_component(CppUnit_DEBUG_LIBRARY_DIRS ${CppUnit_DEBUG_LIBRARIES} DIRECTORY)
set(CppUnit_LIBRARIES ${CppUnit_RELEASE_LIBRARIES})
set(CppUnit_LIBRARY_DIRS ${CppUnit_RELEASE_LIBRARY_DIRS})
set(CppUnit_INCLUDE_DIRS ${CppUnit_INCLUDE_DIR})
# Configure lib type. If XXX_USE_STATIC_LIBS, we always assume a static
# lib is in use. If win32, we can't mark the import .libs as shared, so
# these are always marked as UNKNOWN. Otherwise, infer from extension.
set(CPPUNIT_LIB_TYPE UNKNOWN)
if(CPPUNIT_USE_STATIC_LIBS)
set(CPPUNIT_LIB_TYPE STATIC)
elseif(UNIX)
get_filename_component(_CPPUNIT_EXT ${CppUnit_LIBRARY_RELEASE} EXT)
if(_CPPUNIT_EXT STREQUAL ".a")
set(CPPUNIT_LIB_TYPE STATIC)
elseif(_CPPUNIT_EXT STREQUAL ".so" OR
_CPPUNIT_EXT STREQUAL ".dylib")
set(CPPUNIT_LIB_TYPE SHARED)
endif()
endif()
if(NOT TARGET CppUnit::cppunit)
add_library(CppUnit::cppunit ${CPPUNIT_LIB_TYPE} IMPORTED)
set_target_properties(CppUnit::cppunit PROPERTIES
INTERFACE_COMPILE_OPTIONS "${PC_CppUnit_CFLAGS_OTHER}"
INTERFACE_INCLUDE_DIRECTORIES "${CppUnit_INCLUDE_DIRS}")
# Standard location
set_target_properties(CppUnit::cppunit PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${CppUnit_LIBRARY}")
# Release location
if(EXISTS "${CppUnit_LIBRARY_RELEASE}")
set_property(TARGET CppUnit::cppunit APPEND PROPERTY
IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(CppUnit::cppunit PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX"
IMPORTED_LOCATION_RELEASE "${CppUnit_LIBRARY_RELEASE}")
endif()
# Debug location
if(EXISTS "${CppUnit_LIBRARY_DEBUG}")
set_property(TARGET CppUnit::cppunit APPEND PROPERTY
IMPORTED_CONFIGURATIONS DEBUG)
set_target_properties(CppUnit::cppunit PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX"
IMPORTED_LOCATION_DEBUG "${CppUnit_LIBRARY_DEBUG}")
endif()
endif()
+2 -2
View File
@@ -1,5 +1,5 @@
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MPL-2.0
#
#[=======================================================================[.rst:
@@ -64,7 +64,7 @@ may be provided to tell this module where to look.
#]=======================================================================]
cmake_minimum_required(VERSION 3.24)
cmake_minimum_required(VERSION 3.18)
include(GNUInstallDirs)
+2 -2
View File
@@ -1,5 +1,5 @@
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MPL-2.0
#
#[=======================================================================[.rst:
@@ -87,7 +87,7 @@ may be provided to tell this module where to look.
#]=======================================================================]
cmake_minimum_required(VERSION 3.24)
cmake_minimum_required(VERSION 3.18)
include(GNUInstallDirs)
-44
View File
@@ -1,44 +0,0 @@
include (FindPackageHandleStandardArgs)
if(NCCL_ROOT)
set(_NCCL_ROOT ${NCCL_ROOT})
elseif(DEFINED ENV{NCCL_ROOT})
set(_NCCL_ROOT $ENV{NCCL_ROOT})
endif()
set(_NCCL_INCLUDE_SEARCH_DIRS "")
list(APPEND _NCCL_INCLUDE_SEARCH_DIRS
${_NCCL_ROOT}/include
)
find_path(NCCL_INCLUDE_DIR
NAMES nccl.h
PATHS ${_NCCL_INCLUDE_SEARCH_DIRS}
)
set(_NCCL_LIBRARY_SEARCH_DIRS "")
list(APPEND _NCCL_LIBRARY_SEARCH_DIRS
${_NCCL_ROOT}/bin
)
find_library(NCCL_LIBRARY
NAMES nccl
PATHS ${_NCCL_LIBRARY_SEARCH_DIRS}
)
find_package_handle_standard_args(NCCL REQUIRED_VARS NCCL_INCLUDE_DIR NCCL_LIBRARY)
if (NCCL_FOUND)
mark_as_advanced(NCCL_INCLUDE_DIR)
mark_as_advanced(NCCL_LIBRARY)
endif()
if (NCCL_FOUND AND NOT TARGET NCCL::NCCL)
add_library(NCCL::NCCL SHARED IMPORTED)
if(MSVC)
string(REPLACE ".lib" ".dll" NCCL_DLL ${NCCL_LIBRARY})
set_property(TARGET NCCL::NCCL PROPERTY IMPORTED_LOCATION ${NCCL_DLL})
set_property(TARGET NCCL::NCCL PROPERTY IMPORTED_IMPLIB ${NCCL_LIBRARY})
else()
set_property(TARGET NCCL::NCCL PROPERTY IMPORTED_LOCATION ${NCCL_LIBRARY})
endif()
target_include_directories(NCCL::NCCL INTERFACE ${NCCL_INCLUDE_DIR})
endif()
+2 -2
View File
@@ -1,5 +1,5 @@
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MPL-2.0
#
#[=======================================================================[.rst:
@@ -93,7 +93,7 @@ may be provided to tell this module where to look.
#]=======================================================================]
cmake_minimum_required(VERSION 3.24)
cmake_minimum_required(VERSION 3.18)
include(GNUInstallDirs)
+31 -7
View File
@@ -1,5 +1,5 @@
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MPL-2.0
#
#[=======================================================================[.rst:
@@ -109,7 +109,7 @@ may be provided to tell this module where to look.
#]=======================================================================]
cmake_minimum_required(VERSION 3.24)
cmake_minimum_required(VERSION 3.18)
include(GNUInstallDirs)
@@ -334,8 +334,10 @@ set(_OPENVDB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
set(OPENVDB_PYTHON_PATH_SUFFIXES
lib64/python
lib64/python2.7
lib64/python3
lib/python
lib/python2.7
lib/python3
)
@@ -489,11 +491,37 @@ endif()
# Add standard dependencies
find_package(TBB REQUIRED COMPONENTS tbb)
find_package(Boost REQUIRED COMPONENTS iostreams)
# Add deps for pyopenvdb
# @todo track for numpy
if(pyopenvdb IN_LIST OpenVDB_FIND_COMPONENTS)
find_package(Python REQUIRED)
# Boost python handling - try and find both python and pythonXx (version suffixed).
# Prioritize the version suffixed library, failing if neither exist.
find_package(Boost ${MINIMUM_BOOST_VERSION}
QUIET COMPONENTS python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}
)
if(TARGET Boost::python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR})
set(BOOST_PYTHON_LIB "python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}")
message(STATUS "Found boost_python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}")
else()
find_package(Boost ${MINIMUM_BOOST_VERSION} QUIET COMPONENTS python)
if(TARGET Boost::python)
set(BOOST_PYTHON_LIB "python")
message(STATUS "Found non-suffixed boost_python, assuming to be python version "
"\"${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}\" compatible"
)
else()
message(FATAL_ERROR "Unable to find boost_python or "
"boost_python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}."
)
endif()
endif()
endif()
# Add deps for openvdb_ax
@@ -628,10 +656,6 @@ if(OpenVDB_USES_IMATH_HALF)
find_package(Imath REQUIRED CONFIG)
endif()
if(OpenVDB_USES_DELAYED_LOADING)
find_package(Boost REQUIRED COMPONENTS iostreams)
endif()
if(UNIX)
find_package(Threads REQUIRED)
endif()
@@ -742,7 +766,7 @@ if(OpenVDB_pyopenvdb_LIBRARY)
set_target_properties(OpenVDB::pyopenvdb PROPERTIES
IMPORTED_LOCATION "${OpenVDB_pyopenvdb_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${OpenVDB_pyopenvdb_INCLUDE_DIR};${PYTHON_INCLUDE_DIR}"
INTERFACE_LINK_LIBRARIES "OpenVDB::openvdb;${PYTHON_LIBRARIES}"
INTERFACE_LINK_LIBRARIES "OpenVDB::openvdb;Boost::${BOOST_PYTHON_LIB};${PYTHON_LIBRARIES}"
INTERFACE_COMPILE_FEATURES cxx_std_17
)
endif()
+2 -2
View File
@@ -1,5 +1,5 @@
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MPL-2.0
#
#[=======================================================================[.rst:
@@ -93,7 +93,7 @@ may be provided to tell this module where to look.
#]=======================================================================]
cmake_minimum_required(VERSION 3.24)
cmake_minimum_required(VERSION 3.18)
include(GNUInstallDirs)
+14 -2
View File
@@ -1,5 +1,5 @@
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MPL-2.0
#
#[=======================================================================[.rst:
@@ -47,7 +47,7 @@ The following variables may be provided to tell this module where to look.
# Find the glfw3 installation and use glfw's CMake to initialize
# the glfw lib
cmake_minimum_required(VERSION 3.24)
cmake_minimum_required(VERSION 3.18)
set(_FIND_GLFW3_ADDITIONAL_OPTIONS "")
if(DISABLE_CMAKE_SEARCH_PATHS)
@@ -109,6 +109,18 @@ endif()
set(glfw3_FIND_VERSION ${MINIMUM_GLFW_VERSION})
find_package(glfw3 ${MINIMUM_GLFW_VERSION} REQUIRED)
# We only use find_package_handle_standard_args to verify and print
# appropriate messages. This now explicitly errors in 3.19...
# @todo Improve this entire GLFW3 search
# https://gitlab.kitware.com/cmake/cmake/-/issues/21505
if(${CMAKE_VERSION} VERSION_LESS 3.19)
find_package(PackageHandleStandardArgs)
find_package_handle_standard_args(glfw3
REQUIRED_VARS glfw3_DIR glfw3_FOUND
VERSION_VAR glfw3_VERSION
)
endif()
if(OPENVDB_FUTURE_DEPRECATION AND FUTURE_MINIMUM_GLFW_VERSION)
if(glfw3_VERSION VERSION_LESS ${FUTURE_MINIMUM_GLFW_VERSION})
message(DEPRECATION "Support for GLFW versions < ${FUTURE_MINIMUM_GLFW_VERSION} "
+2 -2
View File
@@ -1,5 +1,5 @@
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MPL-2.0
#
#[=======================================================================[.rst:
@@ -73,7 +73,7 @@ may be provided to tell this module where to look.
# Find the Houdini installation and use Houdini's CMake to initialize
# the Houdini lib
cmake_minimum_required(VERSION 3.24)
cmake_minimum_required(VERSION 3.18)
# Include utility functions for version information
include(${CMAKE_CURRENT_LIST_DIR}/OpenVDBUtils.cmake)
+2 -2
View File
@@ -1,5 +1,5 @@
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MPL-2.0
#
#[=======================================================================[.rst:
@@ -51,7 +51,7 @@ variables may be provided to tell this module where to look.
# Find the Maya installation and use Maya's CMake to initialize
# the Maya lib
cmake_minimum_required(VERSION 3.24)
cmake_minimum_required(VERSION 3.18)
set(_FIND_MAYA_ADDITIONAL_OPTIONS "")
+6 -118
View File
@@ -1,5 +1,5 @@
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MPL-2.0
#
#[=======================================================================[.rst:
@@ -57,7 +57,7 @@ The following functions are provided:
#]=======================================================================]
cmake_minimum_required(VERSION 3.24)
cmake_minimum_required(VERSION 3.18)
function(OPENVDB_GET_VERSION_DEFINE HEADER KEY VALUE)
@@ -83,8 +83,8 @@ function(OPENVDB_GET_VERSION_DEFINE HEADER KEY VALUE)
endfunction()
###############################################################################
###############################################################################
########################################################################
########################################################################
function(OPENVDB_VERSION_FROM_HEADER OPENVDB_VERSION_FILE)
@@ -120,8 +120,8 @@ function(OPENVDB_VERSION_FROM_HEADER OPENVDB_VERSION_FILE)
endfunction()
###############################################################################
###############################################################################
########################################################################
########################################################################
function(OPENVDB_ABI_VERSION_FROM_PRINT OPENVDB_PRINT)
@@ -162,115 +162,3 @@ function(OPENVDB_ABI_VERSION_FROM_PRINT OPENVDB_PRINT)
set(${_VDB_ABI} ${_OpenVDB_ABI} PARENT_SCOPE)
endif()
endfunction()
###############################################################################
## @brief Compute the enumerated ISA value for x86/x86_64 architectures that
## VCL will use during compilation of OpenVDB. The value is stored in the
## VCL_INSTRSET variable. Possible values are:
## 0: Unknown or error
## 2: SSE2
## 3: SSE3
## 4: SSSE3
## 5: SSE4.1
## 6: SSE4.2
## 7: AVX
## 8: AVX2
## 9: AVX512F
## 10: AVX512BW/DQ/VL
function(OPENVDB_COMPUTE_X86_INSTRSET_FROM_VCL VCL_INSTRSET)
# Append project specific flags
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
if(OPENVDB_SIMD STREQUAL "AVX")
set(CMAKE_REQUIRED_FLAGS "-mavx;-msse4.2")
elseif(OPENVDB_SIMD STREQUAL "SSE42")
set(CMAKE_REQUIRED_FLAGS "-msse4.2")
endif()
# Figure out that the INSTRSET macro would expand to.
# @note would be much faster with try_run but this way doesn't involve
# invoking bad instruction sets on unsupported ISAs on the build machine.
include(CheckCXXSourceCompiles)
check_cxx_source_compiles([[
#include "${CMAKE_SOURCE_DIR}/ext/vcl/openvdb/ext/vcl/instrset.h"
int main() { static_assert(INSTRSET == 10); return 0; } ]] COMPUTE_VCL_INSTRSET__AVX512VL_DQ_BW__)
if(COMPUTE_VCL_INSTRSET__AVX512VL_DQ_BW__)
set(${VCL_INSTRSET} 10 PARENT_SCOPE)
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
return()
endif()
check_cxx_source_compiles([[
#include "${CMAKE_SOURCE_DIR}/ext/vcl/openvdb/ext/vcl/instrset.h"
int main() { static_assert(INSTRSET == 9); return 0; } ]] COMPUTE_VCL_INSTRSET__AVX512F__)
if(COMPUTE_VCL_INSTRSET__AVX512F__)
set(${VCL_INSTRSET} 9 PARENT_SCOPE)
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
return()
endif()
check_cxx_source_compiles([[
#include "${CMAKE_SOURCE_DIR}/ext/vcl/openvdb/ext/vcl/instrset.h"
int main() { static_assert(INSTRSET == 8); return 0; } ]] COMPUTE_VCL_INSTRSET__AVX2__)
if(COMPUTE_VCL_INSTRSET__AVX2__)
set(${VCL_INSTRSET} 8 PARENT_SCOPE)
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
return()
endif()
check_cxx_source_compiles([[
#include "${CMAKE_SOURCE_DIR}/ext/vcl/openvdb/ext/vcl/instrset.h"
int main() { static_assert(INSTRSET == 7); return 0; } ]] COMPUTE_VCL_INSTRSET__AVX__)
if(COMPUTE_VCL_INSTRSET__AVX__)
set(${VCL_INSTRSET} 7 PARENT_SCOPE)
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
return()
endif()
check_cxx_source_compiles([[
#include "${CMAKE_SOURCE_DIR}/ext/vcl/openvdb/ext/vcl/instrset.h"
int main() { static_assert(INSTRSET == 6); return 0; } ]] COMPUTE_VCL_INSTRSET__SSE4_2__)
if(COMPUTE_VCL_INSTRSET__SSE4_2__)
set(${VCL_INSTRSET} 6 PARENT_SCOPE)
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
return()
endif()
check_cxx_source_compiles([[
#include "${CMAKE_SOURCE_DIR}/ext/vcl/openvdb/ext/vcl/instrset.h"
int main() { static_assert(INSTRSET == 5); return 0; } ]] COMPUTE_VCL_INSTRSET__SSE4_1__)
if(COMPUTE_VCL_INSTRSET__SSE4_1__)
set(${VCL_INSTRSET} 5 PARENT_SCOPE)
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
return()
endif()
check_cxx_source_compiles([[
#include "${CMAKE_SOURCE_DIR}/ext/vcl/openvdb/ext/vcl/instrset.h"
int main() { static_assert(INSTRSET == 4); return 0; } ]] COMPUTE_VCL_INSTRSET__SSSE3__)
if(COMPUTE_VCL_INSTRSET__SSSE3__)
set(${VCL_INSTRSET} 4 PARENT_SCOPE)
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
return()
endif()
check_cxx_source_compiles([[
#include "${CMAKE_SOURCE_DIR}/ext/vcl/openvdb/ext/vcl/instrset.h"
int main() { static_assert(INSTRSET == 3); return 0; } ]] COMPUTE_VCL_INSTRSET__SSE3__)
if(COMPUTE_VCL_INSTRSET__SSE3__)
set(${VCL_INSTRSET} 3 PARENT_SCOPE)
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
return()
endif()
check_cxx_source_compiles([[
#include "${CMAKE_SOURCE_DIR}/ext/vcl/openvdb/ext/vcl/instrset.h"
int main() { static_assert(INSTRSET == 2); return 0; } ]] COMPUTE_VCL_INSTRSET__SSE2__)
if(COMPUTE_VCL_INSTRSET__SSE2__)
set(${VCL_INSTRSET} 2 PARENT_SCOPE)
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
return()
endif()
check_cxx_source_compiles([[
#include "${CMAKE_SOURCE_DIR}/ext/vcl/openvdb/ext/vcl/instrset.h"
int main() { static_assert(INSTRSET == 1); return 0; } ]] COMPUTE_VCL_INSTRSET__SSE__)
if(COMPUTE_VCL_INSTRSET__SSE__)
set(${VCL_INSTRSET} 1 PARENT_SCOPE)
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
return()
endif()
# Unknown or error
set(${VCL_INSTRSET} 0 PARENT_SCOPE)
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
endfunction()
+2 -2
View File
@@ -1,5 +1,5 @@
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MPL-2.0
#
#[=======================================================================[.rst:
@@ -16,7 +16,7 @@ existing from a previous run of cmake.
#]=======================================================================]
cmake_minimum_required(VERSION 3.24)
cmake_minimum_required(VERSION 3.18)
set(MANIFEST "${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt")
+7 -51
View File
@@ -1,5 +1,5 @@
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MPL-2.0
#
#[=======================================================================[
@@ -7,7 +7,7 @@
#]=======================================================================]
cmake_minimum_required(VERSION 3.24)
cmake_minimum_required(VERSION 3.18)
###############################################################################
@@ -127,47 +127,6 @@ endif()
###############################################################################
# x86 ISA selection
if(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)")
if(OPENVDB_X86_INSTRSET GREATER_EQUAL 1)
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-msse>")
endif()
if(OPENVDB_X86_INSTRSET GREATER_EQUAL 2)
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-msse2>")
endif()
if(OPENVDB_X86_INSTRSET GREATER_EQUAL 3)
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-msse3>")
endif()
if(OPENVDB_X86_INSTRSET GREATER_EQUAL 4)
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-mssse3>")
endif()
if(OPENVDB_X86_INSTRSET GREATER_EQUAL 5)
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-msse4.1>")
endif()
if(OPENVDB_X86_INSTRSET GREATER_EQUAL 6)
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-msse4.2>")
endif()
if(OPENVDB_X86_INSTRSET GREATER_EQUAL 7)
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-mavx>")
endif()
if(OPENVDB_X86_INSTRSET GREATER_EQUAL 8)
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-mavx2>")
endif()
if(OPENVDB_X86_INSTRSET GREATER_EQUAL 9)
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-mavx512f>")
endif()
if(OPENVDB_X86_INSTRSET GREATER_EQUAL 10)
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-mavx512bw>")
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-mavx512dq>")
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-mavx512vl>")
endif()
elseif(OPENVDB_X86_INSTRSET GREATER 0)
message(WARNING "OPENVDB_X86_INSTRSET has been set but has no effect when building for ${CMAKE_SYSTEM_PROCESSOR}.")
endif()
###############################################################################
# Increase the number of sections that an object file can contain
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/bigobj>")
# Enable MSVC options that make it behave like other compilers
@@ -225,23 +184,20 @@ if(OPENVDB_CXX_STRICT)
add_compile_options("$<$<AND:$<CXX_COMPILER_ID:GNU>,$<VERSION_GREATER_EQUAL:$<CXX_COMPILER_VERSION>,9.3.0>>:-Wimplicit-fallthrough>")
# Only check global constructors for libraries (we should really check for
# executables too but gtest relies on these types of constructors for its
# framework). nanobind also incorporates these constructors so skip it as well.
add_compile_options("$<$<AND:$<NOT:$<OR:$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>>>,$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>>:-Wglobal-constructors>")
# framework).
add_compile_options("$<$<AND:$<NOT:$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>>,$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>>:-Wglobal-constructors>")
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wno-sign-conversion>")
# GNU
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Werror>")
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wall>")
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wextra>")
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-pedantic>")
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wcast-align>")
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wcast-qual>")
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wconversion>")
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wdisabled-optimization>")
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Woverloaded-virtual>")
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wnon-virtual-dtor>")
# Disable select warnings for the nanobind static library
add_compile_options("$<$<AND:$<NOT:$<OR:$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,openvdb_python>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanovdb_python>>>,$<COMPILE_LANG_AND_ID:CXX,GNU>>:-pedantic>")
add_compile_options("$<$<AND:$<NOT:$<OR:$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,openvdb_python>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanovdb_python>>>,$<COMPILE_LANG_AND_ID:CXX,GNU>>:-Wcast-qual>")
add_compile_options("$<$<AND:$<NOT:$<OR:$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,openvdb_python>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanovdb_python>>>,$<COMPILE_LANG_AND_ID:CXX,GNU>>:-Wconversion>")
add_compile_options("$<$<AND:$<OR:$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,openvdb_python>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanovdb_python>>,$<COMPILE_LANG_AND_ID:CXX,GNU>>:-Wno-unused-variable>")
add_compile_options("$<$<AND:$<OR:$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanobind-static>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,openvdb_python>,$<STREQUAL:$<TARGET_PROPERTY:NAME>,nanovdb_python>>,$<COMPILE_LANG_AND_ID:CXX,GNU>>:-Wno-unused-but-set-parameter>")
else()
# NO OPENVDB_CXX_STRICT, suppress some warnings
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
+28 -28
View File
@@ -1,5 +1,5 @@
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MPL-2.0
#
#[=======================================================================[
@@ -8,7 +8,7 @@
#]=======================================================================]
cmake_minimum_required(VERSION 3.24)
cmake_minimum_required(VERSION 3.18)
###############################################################################
@@ -27,59 +27,59 @@ set(OPENVDB_DEPRECATED_ABI_LIST ${MINIMUM_OPENVDB_ABI_VERSION} ${_PREV_ABI})
unset(_PREV_ABI)
if(NOT DISABLE_DEPENDENCY_VERSION_CHECKS)
# @note Currently tracking CY2024 of the VFX platform where available
# (that is, our minimum requirements are for the current VFX platform)
# minus 2 years to be able to build with legacy ABI)
# @note Currently tracking CY2022 of the VFX platform where available
# @Note Compiler versions are not really a hard and fast rule, you just need
# a compiler with complete support for our MINIMUM_CXX_STANDARD (currently 17).
# What's usually important is that the version of libstdc++ and glibc in use
# matches. Compilers other than GCC should provide options to ensure this
# targetting e.g. --gcc-toolchain and -fgnuc-version with Clang.
set(MINIMUM_GCC_VERSION 11.2.1)
set(MINIMUM_GCC_VERSION 9.3.1)
set(MINIMUM_CLANG_VERSION 5.0)
set(MINIMUM_ICC_VERSION 19)
set(MINIMUM_MSVC_VERSION 19.30) # 1928 (Visual Studio 2019 Version 16.8 + 16.9)
set(MINIMUM_MSVC_VERSION 19.28) # 1928 (Visual Studio 2019 Version 16.8 + 16.9)
set(MINIMUM_BOOST_VERSION 1.82)
set(MINIMUM_OPENEXR_VERSION 3.2)
set(MINIMUM_IMATH_VERSION 3.2)
# Should be 1.76 for VFX 22, but only version in apt is 1.73
set(MINIMUM_BOOST_VERSION 1.73)
set(MINIMUM_PYBIND_VERSION 2.9.1)
set(MINIMUM_IMATH_VERSION 3.1)
set(MINIMUM_OPENEXR_VERSION 3.1)
set(MINIMUM_ZLIB_VERSION 1.2.7)
set(MINIMUM_TBB_VERSION 2020.3)
set(MINIMUM_LLVM_VERSION 15.0.0)
set(MINIMUM_LLVM_VERSION 10.0.0)
set(MINIMUM_BLOSC_VERSION 1.17.0)
set(MINIMUM_GLFW_VERSION 3.3)
set(MINIMUM_GLFW_VERSION 3.1)
set(MINIMUM_PYTHON_VERSION 3.11)
set(MINIMUM_PYTHON_VERSION 3.9.1)
set(MINIMUM_NUMPY_VERSION 1.20.0)
set(MINIMUM_GOOGLETEST_VERSION 1.10)
set(MINIMUM_LOG4CPLUS_VERSION 2.0)
set(MINIMUM_HOUDINI_VERSION 20.5)
set(MINIMUM_LOG4CPLUS_VERSION 1.1.2)
set(MINIMUM_HOUDINI_VERSION 19.5)
# These always promote warnings rather than errors
set(MINIMUM_MAYA_VERSION 2017)
set(MINIMUM_DOXYGEN_VERSION 1.8.8)
endif()
# VFX 24 deprecations to transition to MINIMUM_* variables in OpenVDB 14.0.0
# VFX 23 deprecations to transition to MINIMUM_* variables in OpenVDB 12.0.0
# @note At the time of writing, any variables that are commented out don't
# have target transitional versions.
# set(FUTURE_MINIMUM_GCC_VERSION 11.2.1)
# set(FUTURE_MINIMUM_MSVC_VERSION 19.30)
set(FUTURE_MINIMUM_GCC_VERSION 11.2.1)
set(FUTURE_MINIMUM_MSVC_VERSION 19.30) # 1930 (Visual Studio 2022)
# set(FUTURE_MINIMUM_ICC_VERSION 19)
# set(FUTURE_MINIMUM_CXX_STANDARD 20)
set(FUTURE_MINIMUM_CMAKE_VERSION 4.0)
set(FUTURE_MINIMUM_OPENEXR_VERSION 3.3)
set(FUTURE_MINIMUM_IMATH_VERSION 3.3)
set(FUTURE_MINIMUM_TBB_VERSION 2021)
set(FUTURE_MINIMUM_BOOST_VERSION 1.85)
#set(FUTURE_MINIMUM_GLFW_VERSION 3.3)
#set(FUTURE_MINIMUM_LOG4CPLUS_VERSION 2.0)
set(FUTURE_MINIMUM_NANOBIND_VERSION 2.5.0)
set(FUTURE_MINIMUM_CMAKE_VERSION 3.20)
# set(FUTURE_MINIMUM_OPENEXR_VERSION 3.1)
set(FUTURE_MINIMUM_BOOST_VERSION 1.80)
set(FUTURE_MINIMUM_GLFW_VERSION 3.3)
set(FUTURE_MINIMUM_LOG4CPLUS_VERSION 2.0)
# set(FUTURE_MINIMUM_BLOSC_VERSION 1.17.0)
# set(FUTURE_MINIMUM_PYTHON_VERSION 3.11)
# set(FUTURE_MINIMUM_TBB_VERSION 2020.3)
set(FUTURE_MINIMUM_PYTHON_VERSION 3.10)
set(FUTURE_MINIMUM_NUMPY_VERSION 1.23.0)
# set(FUTURE_MINIMUM_HOUDINI_VERSION 20.0)
set(FUTURE_MINIMUM_LLVM_VERSION 18.0.0)
set(FUTURE_MINIMUM_LLVM_VERSION 13.0.0)
+22 -101
View File
@@ -1,5 +1,5 @@
# Copyright Contributors to the OpenVDB Project
# SPDX-License-Identifier: Apache-2.0
# SPDX-License-Identifier: MPL-2.0
#
#[=======================================================================[
@@ -7,7 +7,7 @@
#]=======================================================================]
cmake_minimum_required(VERSION 3.24)
cmake_minimum_required(VERSION 3.18)
project(OpenVDBDocs LANGUAGES NONE)
include(GNUInstallDirs)
@@ -25,16 +25,8 @@ option(OPENVDB_DOXYGEN_NANOVDB "Build NanoVDB documentation" ON)
option(OPENVDB_DOXYGEN_INTERNAL [=[
Enable documentation of methods and classes which have been explicitly marked as internal
]=] OFF)
# When enabled, Doxygen's WARN_AS_ERROR=FAIL_ON_WARNINGS makes any warning fail
# the docs build (it still generates the docs and writes the full warning log
# first, then exits non-zero). CI turns this ON -- see .github/workflows/docs.yml
# -- so net-new doc warnings fail the PR that introduces them. Defaults OFF so a
# local doc build isn't blocked by a stray warning from a different Doxygen
# version; pass -DOPENVDB_DOXYGEN_WARN_AS_ERROR=ON to gate locally too.
option(OPENVDB_DOXYGEN_WARN_AS_ERROR
"Treat Doxygen warnings as errors" OFF)
find_package(Doxygen 1.0...<1.15.0 REQUIRED doxygen)
find_package(Doxygen REQUIRED doxygen)
if(MINIMUM_DOXYGEN_VERSION)
if(DOXYGEN_VERSION VERSION_LESS MINIMUM_DOXYGEN_VERSION)
message(WARNING "The doxygen-config doxyfile has been generated with version "
@@ -49,11 +41,11 @@ set(DOXY_FILES
openvdb/openvdb/io
openvdb/openvdb/math
openvdb/openvdb/points
openvdb/openvdb/thread
openvdb/openvdb/points/impl
openvdb/openvdb/python/pyopenvdb.h
openvdb/openvdb/tools
openvdb/openvdb/tree
openvdb/openvdb/util
ext/imath/openvdb/math
doc/build.txt
doc/changes.txt
doc/codingstyle.txt
@@ -65,93 +57,28 @@ set(DOXY_FILES
doc/points.txt
doc/python.txt)
if(OPENVDB_DOXYGEN_INTERNAL)
list(APPEND
openvdb/openvdb/points/impl
openvdb/openvdb/tools/impl)
endif()
if(NOT OPENVDB_DOXYGEN_INTERNAL)
# Hide implementation-detail symbols in the lowercase `internal` namespaces
# (the project convention for non-public helpers). Note: do NOT add a
# capital-I "*Internal*" glob here -- it also matches the public
# tree::InternalNode (and nanovdb::InternalNode) class, silently dropping it
# from the docs and breaking every \link to it (e.g. InternalNode::childCount
# in doc/changes.txt) while its RootNode/LeafNode siblings resolve fine.
set(DOXYGEN_EXCLUDE_SYMBOLS
"*internal*")
endif()
set(DOXYGEN_PROJECT_NAME "OpenVDB")
set(DOXYGEN_PROJECT_LOGO "${CMAKE_CURRENT_SOURCE_DIR}/img/openvdb_logo.png")
set(DOXYGEN_PROJECT_NUMBER "${OpenVDB_VERSION}")
set(DOXYGEN_PROJECT_BRIEF "")
set(DOXYGEN_FILE_PATTERNS *.h *h.in) # headers only
set(DOXYGEN_EXTENSION_MAPPING .in=C) # parse CMake config headers as C
set(DOXYGEN_IMAGE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/img")
set(DOXYGEN_IMAGE_PATH "doc/img")
set(DOXYGEN_RECURSIVE NO)
set(DOXYGEN_NUM_PROC_THREADS 0) # detects from system
# Enable \snippet resolution against the on-disk example sources. Paths in
# \snippet directives are resolved relative to EXAMPLE_PATH, so referring to
# `nanovdb/nanovdb/examples/ex_xxx/yyy.cc` from a doc page works as written.
set(DOXYGEN_EXAMPLE_PATH "${CMAKE_SOURCE_DIR}")
set(DOXYGEN_EXAMPLE_PATTERNS *.cc *.cpp *.cu *.cuh *.h *.txt)
set(DOXYGEN_EXAMPLE_RECURSIVE YES)
# Always capture Doxygen warnings to a logfile so CI can publish it as an
# artifact and contributors can see exactly what's broken.
set(DOXYGEN_WARN_LOGFILE "${CMAKE_CURRENT_BINARY_DIR}/doxygen.warnings.log")
if(OPENVDB_DOXYGEN_WARN_AS_ERROR)
# FAIL_ON_WARNINGS keeps generating docs but exits non-zero at the end if
# any warning was emitted. Requires Doxygen >= 1.9.x.
set(DOXYGEN_WARN_AS_ERROR FAIL_ON_WARNINGS)
# Don't suppress messages so contributors can see warnings during the build.
set(DOXYGEN_QUIET NO)
else()
set(DOXYGEN_QUIET YES)
endif()
set(DOXYGEN_QUIET YES)
set(DOXYGEN_GENERATE_HTML YES)
set(DOXYGEN_GENERATE_MAN NO)
set(DOXYGEN_GENERATE_LATEX NO)
set(DOXYGEN_GENERATE_TODOLIST NO)
set(DOXYGEN_HTML_TIMESTAMP NO) # for simpler website diffs
# Render math formulas via MathJax instead of LaTeX -> PNG. This removes the
# entire `latex`/`dvips`/`gs` toolchain dependency from both local doc builds
# and CI (see .github/workflows/docs.yml), eliminates a class of cross-platform
# install pain, and produces crisper, selectable math in the rendered HTML.
set(DOXYGEN_USE_MATHJAX YES)
set(DOXYGEN_MATHJAX_VERSION MathJax_3) # default JS bundle loaded from a CDN
set(DOXYGEN_HTML_COLORSTYLE_HUE 4)
set(DOXYGEN_HTML_COLORSTYLE_SAT 222)
set(DOXYGEN_HTML_TIMESTAMP NO) # for simpler website diffs
set(DOXYGEN_EXTRACT_ALL YES)
set(DOXYGEN_EXTRACT_STATIC YES)
set(DOXYGEN_EXTRACT_LOCAL_CLASSES NO)
# Configuration for doxygen-awesome-css
# {
set(DOXYGEN_HTML_COLORSTYLE_HUE 209)
set(DOXYGEN_HTML_COLORSTYLE_SAT 255)
set(DOXYGEN_HTML_COLORSTYLE_GAMMA 113)
set(DOXYGEN_GENERATE_TREEVIEW YES)
set(DOXYGEN_DISABLE_INDEX NO)
set(DOXYGEN_FULL_SIDEBAR NO)
set(DOXYGEN_HTML_HEADER
"${CMAKE_CURRENT_SOURCE_DIR}/header.html")
set(DOXYGEN_HTML_EXTRA_STYLESHEET
"${CMAKE_SOURCE_DIR}/ext/doxygen-awesome/doxygen-awesome.css"
"${CMAKE_SOURCE_DIR}/ext/doxygen-awesome/doxygen-awesome-sidebar-only.css"
"${CMAKE_SOURCE_DIR}/ext/doxygen-awesome/doxygen-awesome-sidebar-only-darkmode-toggle.css"
"${CMAKE_CURRENT_SOURCE_DIR}/openvdb.css")
set(DOXYGEN_HTML_EXTRA_FILES
"${CMAKE_SOURCE_DIR}/ext/doxygen-awesome/doxygen-awesome-paragraph-link.js"
"${CMAKE_SOURCE_DIR}/ext/doxygen-awesome/doxygen-awesome-fragment-copy-button.js"
"${CMAKE_SOURCE_DIR}/ext/doxygen-awesome/doxygen-awesome-darkmode-toggle.js")
set(DOXYGEN_HTML_COPY_CLIPBOARD NO) # required with Doxygen >= 1.10.0
set(DOXYGEN_HTML_COLORSTYLE LIGHT) # required with Doxygen >= 1.9.5
# }
# Allow for root directory paths to be listed (e.g. openvdb/io/File.h)
# Rather than just the file names (e.g. File.h). This makes it far
# easier to navigate the docs
@@ -182,13 +109,12 @@ set(DOXYGEN_HIDE_SCOPE_NAMES YES)
set(DOXYGEN_INLINE_INHERITED_MEMB YES)
set(DOXYGEN_MACRO_EXPANSION YES)
# @todo use dot with class diagrams for relevant classes
set(DOXYGEN_HAVE_DOT NO)
set(DOXYGEN_CLASS_GRAPH NO)
set(DOXYGEN_CLASS_DIAGRAMS NO)
set(DOXYGEN_ALIASES
[[ijk="(<i>i</i>,&nbsp\;<i>j</i>,&nbsp\;<i>k</i>)"]]
[[xyz="(<i>x</i>,&nbsp\;<i>y</i>,&nbsp\;<i>z</i>)"]]
[[ijk="(<i>i</i>,&nbsp;<i>j</i>,&nbsp;<i>k</i>)"]]
[[xyz="(<i>x</i>,&nbsp;<i>y</i>,&nbsp;<i>z</i>)"]]
[[const="<tt>const</tt>"]]
"\"vdbnamespace=openvdb::v${OpenVDB_MAJOR_VERSION}_${OpenVDB_MINOR_VERSION}\""
[["hunamespace=houdini_utils"]]
@@ -216,18 +142,12 @@ set(DOXYGEN_PREDEFINED
"OPENVDB_VERSION_NAME=v${OpenVDB_MAJOR_VERSION}_${OpenVDB_MINOR_VERSION}"
"OPENVDB_ABI_VERSION_NUMBER=${OpenVDB_MAJOR_VERSION}"
[[__declspec(x):= __attribute__(x):=]]
# Strip the symbol-visibility/export macro so Doxygen doesn't fold it into a
# declaration's name. Doxygen tolerates `class OPENVDB_API X` but mis-parses
# `enum OPENVDB_API X` (e.g. half::FromBitsTag in ext/imath/.../Half.h),
# reporting the enum as a documented-but-undeclared symbol.
"OPENVDB_API="
# Replace the deprecated macros with doxygen deprecated comments. This ensures
# that every bit of deprecated C++ is listed in the doxygen deprecated list,
# even if it was not properly tagged
[["OPENVDB_DEPRECATED=/** \deprecated */"]]
[["OPENVDB_DEPRECATED_MESSAGE(x)=/** \deprecated x */"]]
"OPENVDB_USE_LOG4CPLUS="
"OPENVDB_UBSAN_SUPPRESS=")
"OPENVDB_USE_LOG4CPLUS=")
set(DOXYGEN_ENABLED_SECTIONS "")
@@ -269,9 +189,9 @@ if(OPENVDB_DOXYGEN_HOUDINI)
list(APPEND DOXY_FILES
doc/houdini.txt
openvdb_houdini/openvdb_houdini/AttributeTransferUtil.h
openvdb_houdini/openvdb_houdini/reference/GEO_PrimVDB.h
openvdb_houdini/openvdb_houdini/reference/GU_PrimVDB.h
openvdb_houdini/openvdb_houdini/GEO_PrimVDB.h
openvdb_houdini/openvdb_houdini/GT_GEOPrimCollectVDB.h
openvdb_houdini/openvdb_houdini/GU_PrimVDB.h
openvdb_houdini/openvdb_houdini/GU_VDBPointTools.h
openvdb_houdini/openvdb_houdini/GeometryUtil.h
openvdb_houdini/openvdb_houdini/ParmFactory.h
@@ -284,9 +204,7 @@ if(OPENVDB_DOXYGEN_HOUDINI)
endif()
if(OPENVDB_DOXYGEN_AX)
# AX docs use @f$ inline and @f[ block math. Formula font size also applies
# under MathJax (set above). The amsmath package the AX docs assume is
# bundled by default in MathJax v3, so no extra extensions are required.
set(DOXYGEN_EXTRA_PACKAGES amsmath) # for math formatting
set(DOXYGEN_FORMULA_FONTSIZE 14)
list(APPEND DOXYGEN_ENABLED_SECTIONS "OPENVDB_AX")
@@ -302,7 +220,8 @@ if(OPENVDB_DOXYGEN_AX)
openvdb_ax/openvdb_ax/compiler
openvdb_ax/openvdb_ax/grammar
openvdb_ax/openvdb_ax/grammar/generated
openvdb_ax/openvdb_ax/math)
openvdb_ax/openvdb_ax/math
openvdb_ax/openvdb_ax/test)
endif()
if(OPENVDB_DOXYGEN_NANOVDB)
@@ -316,6 +235,7 @@ if(OPENVDB_DOXYGEN_NANOVDB)
doc/nanovdb/HelloWorld.md
nanovdb/nanovdb
nanovdb/nanovdb/util
nanovdb/nanovdb/examples/benchmark
nanovdb/nanovdb/examples/ex_bump_pool_buffer
nanovdb/nanovdb/examples/ex_collide_level_set
nanovdb/nanovdb/examples/ex_make_custom_nanovdb
@@ -334,7 +254,8 @@ if(OPENVDB_DOXYGEN_NANOVDB)
nanovdb/nanovdb/examples/ex_read_nanovdb_sphere_accessor_cuda
nanovdb/nanovdb/examples/ex_util
nanovdb/nanovdb/examples/ex_vox_to_nanovdb
nanovdb/nanovdb/examples/ex_write_nanovdb_grids)
nanovdb/nanovdb/examples/ex_write_nanovdb_grids
nanovdb/nanovdb/unittest)
endif()
set(DOXYGEN_VERBATIM_VARS DOXYGEN_ALIASES DOXYGEN_PREDEFINED)
+287 -225
View File
@@ -1,13 +1,14 @@
/**
<div style="width:800px;text-align:justify;">
@page ax AX Language Documentation
@page ax AX
@section axlanguage Intro
@section axlanguage AX Language Documentation
@par
Welcome to the AX Language documentation. These docs provide detailed
information on the AX language including syntax, data types, available
functionality (including OpenVDB specific methods) execution structure and
control flow. See the @ref axcplusplus documentation for the C++ developer
control flow. See the @subpage axcplusplus documentation for the C++ developer
documentation.
@note
Some sections of this document are still to be completed. Please get in touch
@@ -107,8 +108,8 @@ function (see @ref axprogramexample) and whilst there are ways to achieve
reductions, it is an example which would be better suited to a custom C++
implementation.
@par
For details of extending AX for custom geometry, see the @ref axcplusplus
developer documentation. Note that custom geometry support requires `C++` extension.
For details of extending AX for custom geometry, see the @subpage axcplusplus
developer documentation. Note that custom geometry support requires C++ extension.
@subsection axprogramexample A Program Example
@@ -132,20 +133,20 @@ The following explains the above example in relation to OpenVDB data; OpenVDB
points and OpenVDB volumes. The example demonstrates reading from a value on
some input, either a point attribute or a voxel value, and storing the
result in a @ref axdecls "local variable". Importantly, the attribute being
accessed has the name `myattribute` and the type `float`. The first statement:
accessed has the name @b `myattribute` and the type @b `float`. The first statement:
<!-- A -->@code{.c}
float temp = float@myattribute;
@endcode
Invokes a @b read from this attribute (see @ref axattribaccess), retrieving the
value from the geometry and storing it in the variable `temp` to be used in
value from the geometry and storing it in the variable @b `temp` to be used in
the AX program. The second statement:
@code{.c}
if (temp > 0.0f) float@myattribute = 0.0f;
@endcode
Performs a comparison of this value with `0.0f` and, if the value is greater
than `0.0f`, performs a @b write to the geometry in the form of
`float@myattribute = 0.0f;` which sets the value of this attribute on the
geometry to `0.0f`.
Performs a comparison of this value with @b `0.0f` and, if the value is greater
than @b `0.0f`, performs a @b write to the geometry in the form of
<b>`float@myattribute = 0.0f;`</b> which sets the value of this attribute on the
geometry to @b `0.0f`.
@par
For OpenVDB Points, this kernel is run over every point in an OpenVDB Points
Grid. In simple pseudo code:
@@ -154,7 +155,7 @@ foreach(point in pointgrid)
run_ax_kernel(point)
done()
@endcode
Where `pointgrid` is a single Point Data Grid. For OpenVDB volumes the kernel
Where @b `pointgrid` is a single Point Data Grid. For OpenVDB volumes the kernel
is run over each voxel in a provided grid:
@code{.unparsed}
foreach(grid in grids)
@@ -164,8 +165,8 @@ foreach(grid in grids)
done()
@endcode
@par
Where `grids` can comprise of any number of OpenVDB volumes. In this program,
only a floating point grid with the name `myattribute` will be updated. Each
Where @b `grids` can comprise of any number of OpenVDB volumes. In this program,
only a floating point grid with the name @b `myattribute` will be updated. Each
voxel in this grid will have it's value compared in the same way as the points
example given above.
@@ -281,9 +282,9 @@ missing types from OpenVDB.
@subsection axscalars Scalars
@par
AX Supports boolean, integer and floating point scalar types. `int` and
`int32` represent 32-bit integer values and `int64` represents a 64-bit
value. `float` and `double` represent 32-bit and 64-bit floating point
AX Supports boolean, integer and floating point scalar types. @b `int` and
@b `int32` represent 32-bit integer values and @b `int64` represents a 64-bit
value. @b `float` and @b `double` represent 32-bit and 64-bit floating point
values respectively. All scalars, excluding bools, are signed; there are no
other unsigned scalar types in AX.
@par Integer Overflow and Floating Point Truncation
@@ -308,10 +309,10 @@ int64 a = 2147483648l; // one more than can be held in an int (note the last let
int b = a; // implicit conversion. "b" is set to -2147483648
@endcode
@par Infinite and NaN values
Floating point values have two additional intrinsic states; `inf` and `nan`.
Floating point values have two additional intrinsic states; @b `inf` and @b `nan`.
These states can occur during invalid floating point arithmetic. AX performs no
checks on arithmetic to catch these values. A typical example of both `inf`
and `nan` values are division by zero expressions:
checks on arithmetic to catch these values. A typical example of both @b `inf`
and @b `nan` values are division by zero expressions:
@code
float a = 1.0f/0.0f;
print(a); // prints "inf"
@@ -336,16 +337,16 @@ There is currently support for vectors of sizes 2, 3 and 4 elements. The suffix
letter on the vector types denotes the contained elements precision, with the
number corresponding to the vector size. For example, @b `vec2i` denotes a vector
of two 32-bit integer elements. There are no native types for vectors with
`bool`, `int16` or `int64` elements, so these are not supported.
@b `bool`, @b `int16` or @b `int64` elements, so these are not supported.
@par Matrices
Matrices are stored in row major layout (lexographical access order) which
matches the representation of a matrix in OpenVDB. Matrix support consists of
`float` and `double` precision elements with dimensions either `3x3` or
`4x4` (total size of 9 and 16 elements respectively). There are no integer or
@b `float` and @b `double` precision elements with dimensions either @b `3x3` or
@b `4x4` (total size of 9 and 16 elements respectively). There are no integer or
boolean matrix types. Similiar to vectors, the suffix letter on the type denotes
the contained elements precision, with the number corresponding to the matrix
dimension. A matrix of type `mat3d` therefor corresponds to a `3x3` matrix
(9 elements) with `double` precision elements.
dimension. A matrix of type @b `mat3d` therefor corresponds to a @b `3x3` matrix
(9 elements) with @b `double` precision elements.
@par Element Access
As elements of all matrix and vector types are stored contiguously, they can be
accessed by the @ref axvecaccessop "[]&nbsp;operator". Vector elements can also be
@@ -369,10 +370,10 @@ performing matrix projections (transformations) on vector arguments.
Strings are an array of characters stored in a unique AX type which is
incompatible with @ref axopaccess "container accesses". As such, string support
is currently fairly limited. Characters themselves (users may know this as a
`char` type) have no frontend type, so a `string` type must be used for
@b `char` type) have no frontend type, so a @b `string` type must be used for
any number of characters (including the empty string). String literals are
represented by enclosing any number of @ref axtokens "supported AX characters"
by quotes&nbsp;`" "`.
by quotes <b>\"&nbsp;\"</b>.
@subsection axtypeprecedence Implicit conversion / type precedence
@par
@@ -440,9 +441,9 @@ depending on the operand types.
<th colspan="9"> Operators
</th></tr>
<tr style="text-align:center">
<td style="border-right-width: thick" colspan="4"> @ref axopbinary </td>
<td style="border-right-width: thick" colspan="3"> @ref axopunary </td>
<td colspan="2"> Other </td></tr>
<td bgcolor="#ffc4c4" style="border-right-width: thick" colspan="4"> @ref axopbinary </td>
<td bgcolor="#ffc4c4" style="border-right-width: thick" colspan="3"> @ref axopunary </td>
<td bgcolor="#ffc4c4" colspan="2"> Other </td></tr>
<tr style="text-align:center">
<td> @ref axopassignment </td>
<td> @ref axopbinarithmetic </td>
@@ -455,33 +456,50 @@ depending on the operand types.
<td> @ref axopother </td></tr>
<tr style="text-align:center">
<td><p> <!-- *********************** COLUMN ASSIGNMENT *********************** -->
`a = b`<br/>`a += b`<br/>`a -= b`<br/>`a *= b`<br/>`a /= b`<br/>`a %= b`<br/>
`a &= b`<br/>`a |= b`<br/>`a ^= b`<br/>`a <<= b`<br/>`a >>= b`
<code>
a = b<br/>a += b<br/>a -= b<br/>a *= b<br/>a /= b<br/>a %= b<br/>
a &amp;= b<br/>a |= b<br/>a ^= b<br/>a &lt;&lt;= b<br/>a &gt;&gt;= b
</code>
</p></td>
<td><p> <!-- *********************** COLUMN ARITH *********************** -->
`a + b`<br/>`a - b`<br/>`a * b`<br/>`a / b`<br/>`a % b`<br/>`a & b`<br/>`a | b`<br/>
`a ^ b`<br/>`a << b`<br/>`a >> b`
</p></td>
<code>
a + b<br/>a - b<br/>a * b<br/>a / b<br/>a % b<br/>a &amp; b<br/>a | b<br/>
a ^ b<br/>a &lt;&lt; b<br/>a &gt;&gt; b
</code></p></td>
<td><p> <!-- *********************** COLUMN COMP *********************** -->
`a == b`<br/>`a != b`<br/>`a < b`<br/>`a > b`<br/>`a <= b`<br/>`a >= b`
<code>
a == b<br/>a != b<br/>a &lt; b<br/>a &gt; b<br/>a &lt;= b<br/>a &gt;= b
</code>
</p></td>
<td style="border-right-width: thick"><p> <!-- *********************** COLUMN LOGICAL *********************** -->
`a && b`<br/>`a || b`
<code>
a&nbsp;&amp;&amp;&nbsp;b<br/>a&nbsp;||&nbsp;b
</code>
</p></td>
<td><p> <!-- *********************** COLUMN ARITH *********************** -->
`+a`<br/>`-a`<br/>`~a`
<code>
+a<br/>-a<br/>~a
</code>
</p></td>
<td><p> <!-- *********************** COLUMN LOGICAL *********************** -->
`!a`
<code>
!a
</code>
</p></td>
<td style="border-right-width: thick"><p> <!-- *********************** COLUMN INC/DEC *********************** -->
`++a`<br/>`--a`<br/>`a++`<br/>`a--`
<code>
++a<br/>\-\-a<br/>a++<br/>a\-\-
</code>
</p></td>
<td><p> <!-- *********************** COLUMN OTHER *********************** -->
`a[]`<br/>`a[,]`<br/>`a.b`
<code>
a[]<br/>a[,]<br/>a.b
</code>
</p></td>
<td><p> <!-- *********************** COLUMN OTHER *********************** -->
`a(...)`<br/>`a, b`<br/>`a ? b : c`<br/>`a ?: c`<br/>`{ a,b ... }`
<code>
a(...)<br/>a, b<br/>a ? b : c<br/>{&nbsp;a,b&nbsp;...&nbsp;}
</code>
</p></td>
</tr>
</table>
@@ -504,34 +522,34 @@ assignment operators have the following forms:
@par
<table>
<tr><th>Operator Name</th><th>Operator Syntax</th><th>Returns</th></tr>
<tr><td>Simple assignment</td><td> @a lhs <b>`=`</b> @a rhs </td>
<td rowspan="11">Reference to @a lhs</td></tr>
<tr><td>Addition assignment</td><td> @a lhs <b>`+=`</b> @a rhs </td></tr>
<tr><td>Subtraction assignment</td><td> @a lhs <b>`-=`</b> @a rhs </td></tr>
<tr><td>Multiplication assignment</td><td> @a lhs <b>`*=`</b> @a rhs </td></tr>
<tr><td>Division assignment</td><td> @a lhs <b>`/=`</b> @a rhs </td></tr>
<tr><td>Modulo assignment</td><td> @a lhs <b>`%=`</b> @a rhs </td></tr>
<tr><td>Bitwise AND assignment</td><td> @a lhs <b>`&=`</b> @a rhs </td></tr>
<tr><td>Bitwise OR assignment</td><td> @a lhs <b>`|=`</b> @a rhs </td></tr>
<tr><td>Bitwise XOR assignment</td><td> @a lhs <b>`^=`</b> @a rhs </td></tr>
<tr><td>Bitwise shift left assignment</td><td> @a lhs <b>`<<=`</b> @a rhs </td></tr>
<tr><td>Bitwise shift right assignment</td><td> @a lhs <b>`>>=`</b> @a rhs </td></tr>
<tr><td>Simple assignment</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`=`</b> @a `rhs` </td><td>Reference to @a `lhs`</td></tr>
<tr><td>Addition assignment</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`+=`</b> @a `rhs` </td><td>Reference to @a `lhs`</td></tr>
<tr><td>Subtraction assignment</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`-=`</b> @a `rhs` </td><td>Reference to @a `lhs`</td></tr>
<tr><td>Multiplication assignment</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`*=`</b> @a `rhs` </td><td>Reference to @a `lhs`</td></tr>
<tr><td>Division assignment</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`/=`</b> @a `rhs` </td><td>Reference to @a `lhs`</td></tr>
<tr><td>Modulo assignment</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`%=`</b> @a `rhs` </td><td>Reference to @a `lhs`</td></tr>
<tr><td>Bitwise AND assignment</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`&amp;=`</b> @a `rhs` </td><td>Reference to @a `lhs`</td></tr>
<tr><td>Bitwise OR assignment</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`|=`</b> @a `rhs` </td><td>Reference to @a `lhs`</td></tr>
<tr><td>Bitwise XOR assignment</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`^=`</b> @a `rhs` </td><td>Reference to @a `lhs`</td></tr>
<tr><td>Bitwise shift left assignment</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`&lt;&lt;=`</b> @a `rhs` </td><td>Reference to @a `lhs`</td></tr>
<tr><td>Bitwise shift right assignment</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`&gt;&gt;=`</b> @a `rhs` </td><td>Reference to @a `lhs`</td></tr>
</table>
@par
These can be further categorised into two types; direct assignment, which is
comprised only of the <b>simple assignment</b> operator, and compound assignments,
which is the set of all other assignment operators.
@par Direct Assignment
Direct assignments replace the contents of the `lhs` with a copy of the `rhs`:
Direct assignments replace the contents of the @b `lhs` with a copy of the @b
`rhs`:
@par
<table><tr>
<td> @a lhs <b>=</b> @a rhs </td>
<td bgcolor="#ffc4c4"> @a `lhs` <b>= </b> @a `rhs` </td>
</tr></table>
@par
The `rhs` side is not modified and the `lhs` is not read - only written
to. If the `rhs` type does not match the `lhs` type, the `rhs` is first
implicitly converted into a new temporary with the `lhs` type before being
copied into the `lhs`. The following combination of AX type categories are
The @b `rhs` side is not modified and the @b `lhs` is not read - only written
to. If the @b `rhs` type does not match the @b `lhs` type, the @b `rhs` is first
implicitly converted into a new temporary with the @b `lhs` type before being
copied into the @b `lhs`. The following combination of AX type categories are
supported for direct assignment (if an operation is not listed, it is not
supported):
@par
@@ -551,14 +569,15 @@ supported):
<td style="border-top-width: thick">@ref axscalars "scalar"</td>
<td style="border-top-width:thick;text-align:left">
Each element of the vector is set to the right hand side scalar. i.e.
`a[0] = b; ... a[n-1] = b;` where `n` is the size of the vector. If the
scalar type does not match element type of vector, the scalar is copied and
@ref axtypeprecedence "implicitly cast" to that type.</td>
<br/> `a[0]&nbsp;=&nbsp;b;&nbsp;...&nbsp;a[n-1]&nbsp;=&nbsp;b;` <br/>
where `n` is the size of the vector. If the scalar type does not match
element type of vector, the scalar is copied and @ref axtypeprecedence
"implicitly cast" to that type.</td>
</tr>
<tr style="text-align:center"><td>@ref axvecmats "vector"</td>
<td style="text-align:left">
Component wise assignment i.e. `a[0] = b; ... a[n-1] = b;` where `n` is the size
of the vector.
<td style="text-align:left">Component wise assignment i.e.
<br/> `a[0]&nbsp;=&nbsp;b;&nbsp;...&nbsp;a[n-1]&nbsp;=&nbsp;b;` <br/>
where `n` is the size of the vector.
<!-- A -->@code{.c}
vec3f a = 0, b = 1;
a = b;
@@ -593,7 +612,7 @@ of matrix, the scalar is copied and @ref axtypeprecedence "implicitly cast" to
that type.</td>
<tr style="text-align:center"><td>@ref axvecmats "matrix"</td>
<td style="text-align:left">Component wise assignment i.e.
<br/> `a[0] = b[0]; ... a[n-1] = b[n-1];` <br/>
<br/> `a[0]&nbsp;=&nbsp;b[0];&nbsp;...&nbsp;a[n-1]&nbsp;=&nbsp;b[n-1];` <br/>
where `n` is the @b total size of the matrix.
<!-- A -->@code{.c}
mat4f a = 0, b = 1;
@@ -626,27 +645,25 @@ int a = 1; // assign a from an integer literal of value 1
c = a; // assign components of c (x/y/z) to the result of float(a)
@endcode
@par Compound Assignment
Compound assignments replace the the contents of the `lhs` with the result of
a @ref axopbinarithmetic "binary arithmetic" operation of the `lhs` with the
`rhs`:
Compound assignments replace the the contents of the @b `lhs` with the result of
a @ref axopbinarithmetic "binary arithmetic" operation of the @b `lhs` with the
@b `rhs`:
@par
<table>
<tr><td> @a lhs @b op @a rhs </td></tr>
<tr><td bgcolor="#ffc4c4"> @a `lhs` @b op @a `rhs` </td></tr>
</table>
Where @b op is one of:
Where @b op is one of :
<table><tr>
<td> <b>`+=`</b></td>
<td> <b>`-=`</b></td>
<td> <b>`*=`</b></td>
<td> <b>`/=`</b></td>
<td> <b>`%=`</b></td>
<td> <b>`&=`</b></td>
<td> <b>`|=`</b></td>
<td> <b>`^=`</b></td>
<td> <b>`<<=`</b></td>
<td> <b>`>>= `</b></td>
<td bgcolor="#ffc4c4"> <b>`+=`</b></td>
<td bgcolor="#ffc4c4"> <b>`-=`</b></td>
<td bgcolor="#ffc4c4"> <b>`*=`</b></td>
<td bgcolor="#ffc4c4"> <b>`/=`</b></td>
<td bgcolor="#ffc4c4"> <b>`%=`</b></td>
<td bgcolor="#ffc4c4"> <b>`&amp;=`</b></td>
<td bgcolor="#ffc4c4"> <b>`|=`</b></td>
<td bgcolor="#ffc4c4"> <b>`^=`</b></td>
<td bgcolor="#ffc4c4"> <b>`&lt;&lt;=`</b></td>
<td bgcolor="#ffc4c4"> <b>`&gt;&gt;= `</b></td>
</tr></table>
@par
The behaviour of a given compound assignment (for example `a += b`) is similar
@@ -663,8 +680,8 @@ int a = 1;
++a += 1; // equal to a = ++a + 1 which is equal to 3
@endcode
@par
The `rhs` side is not modified, however the `lhs` is both read from and
written to. Note that the arithmetic operation may cast either `lhs` or
The @b `rhs` side is not modified, however the @b `lhs` is both read from and
written to. Note that the arithmetic operation may cast either @b `lhs` or @b
`rhs` following the rules of AX's @ref axopbinarithmetic
"arithmetic type precedence". See the @ref axopbinarithmetic
"arithmetic operations" section for more information on arithmetic type
@@ -703,7 +720,7 @@ b = c; // b becomes 4
a = b; // a becomes float(4)
@endcode
@par
Importantly, `a` receives the result of any previous implicit casts to the
Importantly, @b `a` receives the result of any previous implicit casts to the
right hand side of its binary assignment.
@@ -720,20 +737,20 @@ container types). Binary arithmetic operations have the following forms:
@par
<table>
<tr><th>Operator&nbsp;Name</th><th>Operator&nbsp;Syntax</th><th>Returns</th></tr>
<tr><td>Addition</td><td> @a lhs <b>`+`</b> @a rhs </td><td>The sum of both operands</td></tr>
<tr><td>Subtraction</td><td> @a lhs <b>`-`</b> @a rhs </td><td>The first operand minus the second operand</td></tr>
<tr><td>Multiplication</td><td> @a lhs <b>`*`</b> @a rhs </td><td>The product of both operands</td></tr>
<tr><td>Division</td><td> @a lhs <b>`/`</b> @a rhs </td><td>The first operand divided by the second operand</td></tr>
<tr><td>Modulo</td><td> @a lhs <b>`%`</b> @a rhs </td><td>The @b floored modulo operator. See @ref axbinmultop "Multiplicative operands"</td></tr>
<tr><td>Bitwise AND</td><td> @a lhs <b>`&`</b> @a rhs </td>
<tr><td>Addition</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`+`</b> @a `rhs` </td><td>The sum of both operands</td></tr>
<tr><td>Subtraction</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`-`</b> @a `rhs` </td><td>The first operand minus the second operand</td></tr>
<tr><td>Multiplication</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`*`</b> @a `rhs` </td><td>The product of both operands</td></tr>
<tr><td>Division</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`/`</b> @a `rhs` </td><td>The first operand divided by the second operand</td></tr>
<tr><td>Modulo</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`%`</b> @a `rhs` </td><td>The @b floored modulo operator. See @ref axbinmultop "Multiplicative operands"</td></tr>
<tr><td>Bitwise AND</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`&amp;`</b> @a `rhs` </td>
<td>The @b integral bitwise AND result of each bit in the first operand applied to the bit at the same location in the second operand</td></tr>
<tr><td>Bitwise OR</td><td> @a lhs <b>`|`</b> @a rhs </td>
<tr><td>Bitwise OR</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`|`</b> @a `rhs` </td>
<td>The @b integral bitwise OR result of each bit in the first operand applied to the bit at the same location in the second operand</td></tr>
<tr><td>Bitwise XOR</td><td> @a lhs <b>`^`</b> @a rhs </td>
<tr><td>Bitwise XOR</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`^`</b> @a `rhs` </td>
<td>The @b integral bitwise XOR result of each bit in the first operand applied to the bit at the same location in the second operand</td></tr>
<tr><td>Bitwise shift left</td><td> @a lhs <b>`<<`</b> @a rhs </td>
<tr><td>Bitwise shift left</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`&lt;&lt;`</b> @a `rhs` </td>
<td>The @b integral bitwise left shift of the first operand by the second operand</td></tr>
<tr><td>Bitwise shift right</td><td> @a lhs <b>`>>`</b> @a rhs </td>
<tr><td>Bitwise shift right</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`&gt;&gt;`</b> @a `rhs` </td>
<td>The @b integral bitwise right shift of the first operand by the second operand</td></tr>
</table>
@anchor axbinadditiveop
@@ -742,13 +759,13 @@ Binary additive operations perform summations on the input arguments. They have
the following forms:
@par
<table>
<tr><td> @a lhs @b + @a rhs </td></tr>
<tr><td> @a lhs @b - @a rhs </td></tr>
<tr><td bgcolor="#ffc4c4"> @a `lhs` @b `+` @a `rhs` </td></tr>
<tr><td bgcolor="#ffc4c4"> @a `lhs` @b `-` @a `rhs` </td></tr>
</table>
@par
After @ref axtypeprecedence "implicit conversion", the result of the binary
operation with the arithmetic `+` (@ref axtokens "plus token") is the sum of
the operands, and the result of the binary operation with the arithmetic `-`
operation with the arithmetic @b `+` (@ref axtokens "plus token") is the sum of
the operands, and the result of the binary operation with the arithmetic @b `-`
(@ref axtokens "minus token") token is the second operand subtracted from the
first operand. The following combination of AX type categories are supported for
additive operations (if an operation is not listed, it is not supported):
@@ -853,19 +870,19 @@ c - b; // valid vec - scalar
The binary multiplicative operands have the following forms:
@par
<table>
<tr><td> @a lhs `*` @a rhs </td></tr>
<tr><td> @a lhs `/` @a rhs </td></tr>
<tr><td> @a lhs `%` @a rhs </td></tr>
<tr><td bgcolor="#ffc4c4"> @a `lhs` @b `*` @a `rhs` </td></tr>
<tr><td bgcolor="#ffc4c4"> @a `lhs` @b `/` @a `rhs` </td></tr>
<tr><td bgcolor="#ffc4c4"> @a `lhs` @b `%` @a `rhs` </td></tr>
</table>
@par
After @ref axtypeprecedence "implicit conversion", the result of the binary
operation:
- with the arithmetic `*` (@ref axtokens "asterisk token") is:
- with the arithmetic @b `*` (@ref axtokens "asterisk token") is:
- the product of the operands
- @b OR performs matrix multiplication for vector and matrix types.
- with the arithmetic `/` (@ref axtokens "forward slash token") is the first
- with the arithmetic @b `/` (@ref axtokens "forward slash token") is the first
operand divided by the second operand.
- with the arithmetic `%` (@ref axtokens "percentage token") is the
- with the arithmetic @b `%` (@ref axtokens "percentage token") is the
@b floored modulo operations .i.e. the expression `d % D` returns the result
`D - d * floor(D/d)`. This is in contrast to truncated modulo operations
`D - d * (D/d)` where the division is truncated.
@@ -877,7 +894,7 @@ mean that the relationship properties between `%` and `/` differ when either
@b `d` or @b `D` is negative. i.e.:
`(d/D)*D + (d%D) != d`
@note
The multiplicative operation `*` has important behaviour for vectors and
The multiplicative operation @b `*` has important behaviour for vectors and
matrix types.
@par
The following combination of AX type categories are supported for multiplicative
@@ -890,7 +907,7 @@ operations (if an operation is not listed, it is not supported):
<tr style="text-align:center"><td rowspan="3">@ref axscalars "scalar"</td><td rowspan="2">`* / %`</td><td rowspan="1">@ref axscalars "scalar"</td>
<td style="text-align:left">Returns the result of the scalar multiplication, division or remainder of the division respectively. </td>
</tr>
<tr style="text-align:center"><td>@ref axvecmats "vector"</td>
<tr style="text-align:center"><td>@ref axvecmats "vector"</td></td>
<td style="text-align:left" rowspan="1">
Performs per component binary operations (after
@ref axtypeprecedence "implicit conversion") with the left hand side scalar to
@@ -1079,27 +1096,27 @@ Floating point multiplication is communicative (`a * b = b * a`) but is not
Binary bitwise operations have the following forms:
@par
<table>
<tr><td> @a lhs <b> `&` </b> @a rhs </td></tr>
<tr><td> @a lhs <b> `|` </b> @a rhs </td></tr>
<tr><td> @a lhs <b> `^` </b> @a rhs </td></tr>
<tr><td> @a lhs <b> `<<` </b> @a rhs </td></tr>
<tr><td> @a lhs <b> `>>` </b> @a rhs </td></tr>
<tr><td bgcolor="#ffc4c4"> @a `lhs` @b `&` @a `rhs` </td></tr>
<tr><td bgcolor="#ffc4c4"> @a `lhs` <b> `|` </b> @a `rhs` </td></tr>
<tr><td bgcolor="#ffc4c4"> @a `lhs` @b `^` @a `rhs` </td></tr>
<tr><td bgcolor="#ffc4c4"> @a `lhs` @b `<<` @a `rhs` </td></tr>
<tr><td bgcolor="#ffc4c4"> @a `lhs` @b `>>` @a `rhs` </td></tr>
</table>
@par
These operations only run on @b integral operands. After @ref axtypeprecedence
"implicit conversion", the result of the binary operation:
- with the @b & (@ref axtokens "ampersand token") is the result of the
- with the @b `&` (@ref axtokens "ampersand token") is the result of the
logical AND operation on each pair of the corresponding bits of the input
operands.
- with the <b> | </b> (@ref axtokens "pipe token") is the result of the
- with the <b> `|` </b> (@ref axtokens "pipe token") is the result of the
logical OR operation on each pair of the corresponding bits of the input
operands.
- with the @b ^ (@ref axtokens "hat token") is the result of the
- with the @b `^` (@ref axtokens "hat token") is the result of the
logical XOR operation on each pair of the corresponding bits of the input
operands.
- with the @b << (@ref axtokens "less than tokens") is the value shifted left
- with the @b `<<` (@ref axtokens "less than tokens") is the value shifted left
with zeros shifted in on the right.
- with the @b >> (@ref axtokens "greater than tokens") is the value shifted
- with the @b `>>` (@ref axtokens "greater than tokens") is the value shifted
right with zeros shifted in on the left.
@par
<table>
@@ -1127,17 +1144,17 @@ is of type @b `bool`. Binary comparison operations have the following forms:
@par
<table>
<tr><th>Operator&nbsp;Name</th><th>Operator&nbsp;Syntax</th><th>Returns</th></tr>
<tr><td>Equal to</td><td> @a lhs <b>`==`</b> @a rhs </td>
<tr><td>Equal to</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`==`</b> @a `rhs` </td>
<td>Returns `true` if both operands are equal</td></tr>
<tr><td>Not equal to</td><td> @a lhs <b>`!=`</b> @a rhs </td>
<tr><td>Not equal to</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`!=`</b> @a `rhs` </td>
<td>Returns `true` if operands are not equal</td></tr>
<tr><td>Less than</td><td> @a lhs <b>`<`</b> @a rhs </td>
<tr><td>Less than</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`<`</b> @a `rhs` </td>
<td>Returns `true` the left hand side value is less than the right hand side</td></tr>
<tr><td>Greater than</td><td> @a lhs <b>`>`</b> @a rhs </td>
<tr><td>Greater than</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`>`</b> @a `rhs` </td>
<td>Returns `true` the left hand side value is greater than the right hand side</td></tr>
<tr><td>Less than or equal to</td><td> @a lhs <b>`<=`</b> @a rhs </td>
<tr><td>Less than or equal to</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`<=`</b> @a `rhs` </td>
<td>Returns `true` the left hand side value is less than or equal to the right hand side</td></tr>
<tr><td>Greater than or equal to</td><td> @a lhs <b>`>=`</b> @a rhs </td>
<tr><td>Greater than or equal to</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`>=`</b> @a `rhs` </td>
<td>Returns `true` the left hand side value is greater than or equal to the right hand side</td></tr>
</table>
@par
@@ -1247,10 +1264,10 @@ They have the following forms:
@par
<table>
<tr><th>Operator&nbsp;Name</th><th>Operator&nbsp;Syntax</th><th>Returns</th></tr>
<tr><td>AND</td><td> @a lhs <b>`&&`</b> @a rhs </td>
<tr><td>AND</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`&&`</b> @a `rhs` </td>
<td>Returns true if both operands are true. Otherwise, the result is false. This
operator is short-circuiting.</td></tr>
<tr><td>Inclusive OR</td><td> @a lhs <b>`||`</b> @a rhs </td>
<tr><td>Inclusive OR</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`||`</b> @a `rhs` </td>
<td>Returns true if either the first or the second operand is true. This operator
is short-circuiting.</td></tr>
</table>
@@ -1283,14 +1300,14 @@ Arithmetic unary operators are comprised of arithemtic and bitwise operators.
@par
<table>
<tr><th>Operator Name</th><th>Operator Syntax</th><th>Returns</th></tr>
<tr><td>Unary plus</td><td> `+a` </td>
<td>Returns the value of its operand, `a`</td>
<tr><td>Unary plus</td><td bgcolor="#ffc4c4"> <b>`+`</b>@a `a` </td>
<td>Returns the value of its operand, @b `a`</td>
</tr>
<tr><td>Unary minus</td><td> `-a` </td>
<td>Returns the negative representation of `a`</td>
<tr><td>Unary minus</td><td bgcolor="#ffc4c4"> <b>`-`</b>@a `a` </td>
<td>Returns the negative representation of @b `a`</td>
</tr>
<tr><td>Bitwise NOT</td><td> `~a` </td>
<td>Returns the bitwise NOT (one's complement) value of `a`. This operator
<tr><td>Bitwise NOT</td><td bgcolor="#ffc4c4"> <b>`~`</b>@a `a` </td>
<td>Returns the bitwise NOT (one's complement) value of @b `a`. This operator
is only valid on integral element types.</td>
</tr>
</table>
@@ -1348,7 +1365,7 @@ Logical unary operators consist of a single operand.
@par
<table>
<tr><th>Operator Name</th><th>Operator Syntax</th><th>Returns</th></tr>
<tr><td>Logical NOT</td><td> `!a` </td>
<tr><td>Logical NOT</td><td bgcolor="#ffc4c4"> <b>`!`</b>@a `a` </td>
<td>Returns true if the operand is false. Otherwise, returns false.</td>
</tr>
</table>
@@ -1392,10 +1409,10 @@ each component of a vector or matrix. They have the following forms:
@par
<table>
<tr><th>Operator Name</th><th>Operator Syntax</th><th>Returns</th></tr>
<tr><td>Pre-increment</td><td> `++a` </td><td>Returns a reference to the incremented result.</td>
<tr><td>Post-increment</td><td> `a++` </td><td>Returns a copy of the incremented result.</td>
<tr><td>Pre-decrement</td><td> `--a` </td><td>Returns a reference to the decremented result.</td>
<tr><td>Post-decrement</td><td> `a--` </td><td>Returns a copy of the decremented result.</td>
<tr><td>Pre-increment</td><td bgcolor="#ffc4c4"> <b>`++`</b>@a `a` </td><td>Returns a reference to the incremented result.</td>
<tr><td>Post-increment</td><td bgcolor="#ffc4c4">@a `a`<b>`++`</b> </td><td>Returns a copy of the incremented result.</td>
<tr><td>Pre-decrement</td><td bgcolor="#ffc4c4"> <b>`--`</b>@a `a` </td><td>Returns a reference to the decremented result.</td>
<tr><td>Post-decrement</td><td bgcolor="#ffc4c4"> @a `a`<b>`--`</b> </td><td>Returns a copy of the decremented result.</td>
</tr>
</table>
@par
@@ -1427,20 +1444,20 @@ the following forms:
<tr><th>Operator Name</th><th>Operator Syntax</th><th>Returns</th></tr>
<tr style="text-align:left">
<td>Dot&nbsp;Component&nbsp;Access</td>
<td> <em>`vector`</em>&nbsp;<b>.</b>&nbsp;`component` </td>
<td>Reference to component `component` of `vector`</td>
<td bgcolor="#ffc4c4"> <em>`vector`</em>&nbsp;<b>.</b>&nbsp;@a `component` </td>
<td>Reference to component @a `component` of @a `vector`</td>
</tr>
<tr style="text-align:left">
<td>Container&nbsp;Component&nbsp;Access</td>
<td> <em>`container`</em>&nbsp;<b>[</b>&nbsp;`exp` <b>]</b> </td>
<td>Reference to component at index `exp` of `container`</td>
<td bgcolor="#ffc4c4"> <em>`container`</em>&nbsp;<b>[</b>&nbsp;@a `exp` <b>]</b> </td>
<td>Reference to component at index @a `exp` of @a `container`</td>
</tr>
<tr style="text-align:left">
<td>Matrix&nbsp;Component&nbsp;Access</td>
<td> <em>`matrix`</em>&nbsp;<b>[</b>&nbsp;`exp1`,&nbsp;<em>`exp2`</em>&nbsp;<b>]</b> </td>
<td bgcolor="#ffc4c4"> <em>`matrix`</em>&nbsp;<b>[</b>&nbsp;@a `exp1`,&nbsp;<em>`exp2`</em>&nbsp;<b>]</b> </td>
<td>Reference to component in row <b><em>`exp1`</em></b>, column <b><em>`exp2`</em></b>.
Also equal to returning a reference to component at index: <b><em> `[exp1 * dimension + exp2]` </em></b>
of `matrix` where `dimension` is the the size of the matrix</td>
Also equal to returning a reference to component at index: <b><em> `[exp1&nbsp;*&nbsp;dimension&nbsp;+&nbsp;exp2]` </em></b>
of @a `matrix` where @a `dimension` is the the size of the matrix</td>
</tr>
</table>
@par
@@ -1454,11 +1471,11 @@ container.
The dot operator <b>.</b> is only valid for vector types. It has the form:
@par
<table><tr>
<td> `vector` <b>.</b> `component` </td>
<td bgcolor="#ffc4c4"> @a `vector` <b>.</b> @a `component` </td>
</tr></table>
@par
Where component is one of the below supported component letters. It only provides
access for the first three elements of any vector (for `vec2` types, only the
access for the first three elements of any vector (for @b `vec2` types, only the
first 2 components are accessible). Accessing a vector using the dot operator is
fundamentally the same as using the <b>`[]`</b> operator with the corresponding
integer index.
@@ -1475,12 +1492,12 @@ a_{0}\quad a_{1}\quad a_{2}
@f]
| Component | Access Index | Result |
|:-----------:|:--------------:|:-------------:|
| `A.x` | 0 | @f$ a_{0} @f$ |
| `A.r` | 0 | @f$ a_{0} @f$ |
| `A.y` | 1 | @f$ a_{1} @f$ |
| `A.g` | 1 | @f$ a_{1} @f$ |
| `A.z` | 2 | @f$ a_{2} @f$ |
| `A.b` | 2 | @f$ a_{2} @f$ |
| @b `A.x` | 0 | @f$ a_{0} @f$ |
| @b `A.r` | 0 | @f$ a_{0} @f$ |
| @b `A.y` | 1 | @f$ a_{1} @f$ |
| @b `A.g` | 1 | @f$ a_{1} @f$ |
| @b `A.z` | 2 | @f$ a_{2} @f$ |
| @b `A.b` | 2 | @f$ a_{2} @f$ |
</center>
@par
This operator can provide more immediately readability when working with
@@ -1490,12 +1507,12 @@ expressions that focus on colour or Cartesian coordinate systems.
The <b>`[]`</b> operator is valid for both vectors and matrices. It has the form:
@par
<table><tr>
<td> `container` <b>[</b><em>`exp`</em><b>]</b> </td>
<td bgcolor="#ffc4c4"> @a `container` <b>[</b><em>`exp`</em><b>]</b> </td>
</tr></table>
@par
`exp` is expected to evaluate to a value which is castable to an integer
@a `exp` is expected to evaluate to a value which is castable to an integer
following the @ref axopassignment "assignment casting" rules and falls within
the valid size of the `container`. <b>No bounds checking is performed</b>.
the valid size of the @a `container`. <b>No bounds checking is performed</b>.
@par
As matrices are also an array of contigous values, they can be accessed in the
same way. This can make some operations much simplier; a typical example being
@@ -1516,16 +1533,16 @@ for (int i = 0; i < 16; ++i) b[i] = i;
The <b>`[,]`</b> operator is only valid for matrices. It has the form:
@par
<table><tr>
<td> `matrix` <b>[</b><em>`exp1`</em>, <em>`exp2`</em><b>]</b> </td>
<td bgcolor="#ffc4c4"> @a `matrix` <b>[</b><em>`exp1`</em>, <em>`exp2`</em><b>]</b> </td>
</tr></table>
@par
`exp1` and `exp2` are expected to evaluate to a value which is castable to
@a `exp1` and @a `exp2` are expected to evaluate to a value which is castable to
an integer following the @ref axopassignment "assignment casting" rules and
falls within the valid size of the `matrix` dimensions. <b>No bounds checking
falls within the valid size of the @a `matrix` dimensions. <b>No bounds checking
is performed</b>. In general it is more readable to use this operator when
accessing specific elements, where `exp1` is the row index and `exp2` is
accessing specific elements, where @b `exp1` is the row index and @b `exp2` is
the column index. The tables below show the different access patterns for
`3x3` and `4x4` matrices.
@b `3x3` and @b `4x4` matrices.
@par
<!-- A -->@code{.c}
mat3f a;
@@ -1538,26 +1555,22 @@ for (int i = 0; i < 3; ++i)
<tr style="text-align:center">
<td style="border:none" colspan=3>
@f[
{
A=\begin{bmatrix}
a_{00}\quad a_{01}\quad a_{02}\\
a_{10}\quad a_{11}\quad a_{12}\\
a_{20}\quad a_{21}\quad a_{22}\\
\end{bmatrix}
}
@f]
</td>
<td style="border:none"></td>
<td style="border:none" colspan=3>
@f[
{
A=\begin{bmatrix}
a_{00}\quad a_{01}\quad a_{02}\quad a_{03}\\
a_{10}\quad a_{11}\quad a_{12}\quad a_{13}\\
a_{20}\quad a_{21}\quad a_{22}\quad a_{23}\\
a_{30}\quad a_{31}\quad a_{32}\quad a_{33}\\
\end{bmatrix}
}
@f]
</td>
</tr>
@@ -1571,62 +1584,112 @@ a_{30}\quad a_{31}\quad a_{32}\quad a_{33}\\
<th>Result</th>
</tr>
<tr style="text-align:center">
<td>`A[0]`</td><td>`A[0,0]`</td><td>@f$ a_{00} @f$</td>
<td>`A[0]`</td><td>`A[0,0]`</td><td>@f$ a_{00} @f$</td>
<td><code>A[0]</code></td>
<td><code>A[0,0]</code></td>
<td>@f$ a_{00} @f$</td>
<td><code>A[0]</code></td>
<td><code>A[0,0]</code></td>
<td>@f$ a_{00} @f$</td>
</tr>
<tr style="text-align:center">
<td>`A[1]`</td><td>`A[0,1]`</td><td>@f$ a_{01} @f$</td>
<td>`A[1]`</td><td>`A[0,1]`</td><td>@f$ a_{01} @f$</td>
<td><code>A[1]</code></td>
<td><code>A[0,1]</code></td>
<td>@f$ a_{01} @f$</td>
<td><code>A[1]</code></td>
<td><code>A[0,1]</code></td>
<td>@f$ a_{01} @f$</td>
</tr>
<tr style="text-align:center">
<td>`A[2]`</td><td>`A[0,2]`</td><td>@f$ a_{02} @f$</td>
<td>`A[2]`</td><td>`A[0,2]`</td><td>@f$ a_{02} @f$</td>
<td><code>A[2]</code></td>
<td><code>A[0,2]</code></td>
<td>@f$ a_{02} @f$</td>
<td><code>A[2]</code></td>
<td><code>A[0,2]</code></td>
<td>@f$ a_{02} @f$</td>
</tr>
<tr style="text-align:center">
<td>`A[3]`</td><td>`A[1,0]`</td><td>@f$ a_{10} @f$</td>
<td>`A[3]`</td><td>`A[0,3]`</td><td>@f$ a_{03} @f$</td>
<td><code>A[3]</code></td>
<td><code>A[1,0]</code></td>
<td>@f$ a_{10} @f$</td>
<td><code>A[3]</code></td>
<td><code>A[0,3]</code></td>
<td>@f$ a_{03} @f$</td>
</tr>
<tr style="text-align:center">
<td>`A[4]`</td><td>`A[1,1]`</td><td>@f$ a_{10} @f$</td>
<td>`A[4]`</td><td>`A[1,0]`</td><td>@f$ a_{10} @f$</td>
<td><code>A[4]</code></td>
<td><code>A[1,1]</code></td>
<td>@f$ a_{10} @f$</td>
<td><code>A[4]</code></td>
<td><code>A[1,0]</code></td>
<td>@f$ a_{10} @f$</td>
</tr>
<tr style="text-align:center">
<td>`A[5]`</td><td>`A[1,2]`</td><td>@f$ a_{12} @f$</td>
<td>`A[5]`</td><td>`A[1,1]`</td><td>@f$ a_{11} @f$</td>
<td><code>A[5]</code></td>
<td><code>A[1,2]</code></td>
<td>@f$ a_{12} @f$</td>
<td><code>A[5]</code></td>
<td><code>A[1,1]</code></td>
<td>@f$ a_{11} @f$</td>
</tr>
<tr style="text-align:center">
<td>`A[6]`</td><td>`A[2,0]`</td><td>@f$ a_{20} @f$</td>
<td>`A[6]`</td><td>`A[1,2]`</td><td>@f$ a_{12} @f$</td>
<td><code>A[6]</code></td>
<td><code>A[2,0]</code></td>
<td>@f$ a_{20} @f$</td>
<td><code>A[6]</code></td>
<td><code>A[1,2]</code></td>
<td>@f$ a_{12} @f$</td>
</tr>
<tr style="text-align:center">
<td>`A[7]`</td><td>`A[2,1]`</td><td>@f$ a_{21} @f$</td>
<td>`A[7]`</td><td>`A[1,3]`</td><td>@f$ a_{13} @f$</td>
<td><code>A[7]</code></td>
<td><code>A[2,1]</code></td>
<td>@f$ a_{21} @f$</td>
<td><code>A[7]</code></td>
<td><code>A[1,3]</code></td>
<td>@f$ a_{13} @f$</td>
</tr>
<tr style="text-align:center">
<td>`A[8]`</td><td>`A[2,2]`</td><td>@f$ a_{22} @f$</td>
<td>`A[8]`</td><td>`A[2,0]`</td><td>@f$ a_{20} @f$</td>
<td><code>A[8]</code></td>
<td><code>A[2,2]</code></td>
<td>@f$ a_{22} @f$</td>
<td><code>A[8]</code></td>
<td><code>A[2,0]</code></td>
<td>@f$ a_{20} @f$</td>
</tr> <!-- ******************** MAT4 DATA ONLY ******************** -->
<tr style="text-align:center">
<td style="border:right;" colspan="4" rowspan="7"></td>
<td>`A[9]`</td><td>`A[2,1]`</td><td>@f$ a_{21} @f$</td>
<td style="border:none;" colspan="3" rowspan="7"></td>
<td><code>A[9]</code></td>
<td><code>A[2,1]</code></td>
<td>@f$ a_{21} @f$</td>
</tr>
<tr style="text-align:center">
<td>`A[10]`</td><td>`A[2,2]`</td><td>@f$ a_{22} @f$</td>
<td><code>A[10]</code></td>
<td><code>A[2,2]</code></td>
<td>@f$ a_{22} @f$</td>
</tr>
<tr style="text-align:center">
<td>`A[11]`</td><td>`A[2,3]`</td><td>@f$ a_{23} @f$</td>
<td><code>A[11]</code></td>
<td><code>A[2,3]</code></td>
<td>@f$ a_{23} @f$</td>
</tr>
<tr style="text-align:center">
<td>`A[12]`</td><td>`A[3,0]`</td><td>@f$ a_{30} @f$</td>
<td><code>A[12]</code></td>
<td><code>A[3,0]</code></td>
<td>@f$ a_{30} @f$</td>
</tr>
<tr style="text-align:center">
<td>`A[13]`</td><td>`A[3,1]`</td><td>@f$ a_{31} @f$</td>
<td><code>A[13]</code></td>
<td><code>A[3,1]</code></td>
<td>@f$ a_{31} @f$</td>
</tr>
<tr style="text-align:center">
<td>`A[14]`</td><td>`A[3,2]`</td><td>@f$ a_{32} @f$</td>
<td><code>A[14]</code></td>
<td><code>A[3,2]</code></td>
<td>@f$ a_{32} @f$</td>
</tr>
<tr style="text-align:center">
<td>`A[15]`</td><td>`A[3,3]`</td><td>@f$ a_{33} @f$</td>
<td><code>A[15]</code></td>
<td><code>A[3,3]</code></td>
<td>@f$ a_{33} @f$</td>
</tr>
</table>
@@ -1640,27 +1703,22 @@ section. They have the following forms:
<tr><th>Operator Name</th><th>Operator Syntax</th><th>Returns</th></tr>
<tr style="text-align:left">
<td>Call / Explicit Cast</td>
<td> `a(...)` </td>
<td bgcolor="#ffc4c4"> <em>`a`</em><b>`(...)`</b></td>
<td>Returns the result of a function call or inbuilt explicit cast</td>
</tr>
<tr style="text-align:left">
<td>Comma</td>
<td> `a, b, ...` </td>
<td>Returns the value of the last expression after chained evaluation</td>
<td bgcolor="#ffc4c4"> <em>`a`</em><b>,</b>&nbsp; <em>`b`</em></td>
<td>Returns the value of @b `b` after chained evaluation</td>
</tr>
<tr style="text-align:left">
<td>Ternary Conditional</td>
<td> `a ? b : c` </td>
<td> `b` if `a` is true, `c` otherwise.</td>
</tr>
<tr style="text-align:left">
<td>Ternary Conditional</td>
<td> `a ? : c` </td>
<td> `a` if `a` is true, `c` otherwise.</td>
<td bgcolor="#ffc4c4"> <em>`a`</em>&nbsp;<b>`?`</b>&nbsp;<em>`b`</em>&nbsp;<b>`:`</b><em>`c`</em></td>
<td>@b `b` if @b `a` is @b true, @b `c` otherwise.</td>
</tr>
<tr>
<td>Vector/Matrix Initializer</td>
<td>`{ a, b, ... }`</td>
<td bgcolor="#ffc4c4"> <b>`{`</b>&nbsp;<em> `a,&nbsp; `</em> `b&nbsp; `<b>`...&nbsp;}`</b> </td>
<td>Returns a temporary vector or matrix</td>
</tr>
</table>
@@ -1670,10 +1728,10 @@ The function call operator provides the ability to invoke functions @b or invoke
a supported explicit cast. It has the form:
@par
<table><tr>
<td> `func(a, b, c, ...)` </td>
<td bgcolor="#ffc4c4"> <em> `func(a, b, c, ...)` </em></td>
</tr></table>
@par
Where `func` is a function name @b or a valid explicit cast typename. Explicit
Where @b `func` is a function name @b or a valid explicit cast typename. Explicit
casts are only supported for @ref axscalars "scalar types". For example:
<!-- A -->@code{.c}
int a = int(1.1f);
@@ -1682,7 +1740,7 @@ a = int(b.x);
@endcode
@par
Whilst explicit casts take only a single argument, the operator itself supports
multiple or empty arguments for function calls. When multiple arguments are
multiple or empty arguments for function calls. Whe multiple arguments are
provided, they are parsed from first to last and processed in reverse order.
@b However, the order of runtime evaluation is @b unspecified i.e. they may
evaluate in any order. Each function parameter is initialized with its
@@ -1695,10 +1753,10 @@ functions.
The Comma operator has the form:
@par
<table><tr>
<td>`a, b, ...`</td>
<td bgcolor="#ffc4c4"><em>`a`</em><b>`,` </b><em>`b`</em></td>
</tr></table>
@par
Where `a` and `b` are expressions. Chained expressions evaluate each
Where @b `a` and @b `b` are expressions. Chained expressions evaluate each
expression in syntactical order (first to last), discarding any return value
except for the last expression, which is returned from the entire list. Note that
although return values for any expression but the last are discarded, their side
@@ -1722,33 +1780,32 @@ The ternary conditional operator can be thought of as an in-line @ref axbranchin
a single expression that will be returned. It has the form:
@par
<table><tr>
<td>`a ? b : c`</td>
<td bgcolor="#ffc4c4"><em>`a`</em>&nbsp;<b>`?`</b>&nbsp;<em>`b`</em>&nbsp;<b>`:`</b><em>`c`</em></td>
</tr></table>
Where @b `a` is the condition, evaluated and converted to @b bool, and @b `b` and @b
`c` are expressions of the same or implicit-castable types. @b `b` is evaluated and
returned if the condition is @b true, @b `c` is evaluated and returned if the
condition is @b false. Only the expression out of @b `b` and @b `c` that is
returned will be evaluated. Expressions with no return value (a.k.a @b `void`)
are supported as long as @b `b` and @b `c` are both of this type.
@par
Where `a` is the condition, evaluated and converted to @b bool, and `b` and
`c` are expressions of the same or implicit-castable types. `b` is evaluated and
returned if the condition is @b true, `c` is evaluated and returned if the
condition is @b false. Only the expression out of `b` and `c` that is
returned will be evaluated. Expressions with no return value (a.k.a `void`)
are supported as long as `b` and `c` are both of this type.
@par
Also supported is the 'Elvis' operator, `a ? : c` (or `?:`).
Here, `a` is evaluated once, and if when converted to @b bool is @b true, `a` is
returned, otherwise `c` is evaluated and returned. In this case, `a` and
Also supported is the 'Elvis' operator, <b>`a` `?` `:` `c`</b> (or `?:`).
Here, @b `a` is evaluated once, and if when converted to @b bool is @b true, @b `a` is
returned, otherwise @b `c` is evaluated and returned. In this case, @b `a` and @b
`c` must be the same or implicit-castable types, and both implicit-castable to @b bool.
@anchor axvecmatinit
@par Vector/Matrix Initializer
@ref axvecmats "Vectors and matrices" can be represented as local variables (e.g.
`vec3f`), external attributes or parameters (e.g. `vec3f@attrib`) or as
@b `vec3f`), external attributes or parameters (e.g. @b `vec3f\@attrib`) or as
temporary values using the vector/matrix initializer syntax. This operator has
the form:
@par
<table><tr>
<td> `{ a, b, ... }`</td>
<td bgcolor="#ffc4c4"> <b>`{`</b>&nbsp; <em>`a,&nbsp; b&nbsp; `</em><b>`...&nbsp;}`</b> </td>
</tr></table>
@par
Where `a` and `b` are expressions returning a scalar value. When this
Where @b `a` and @b `b` are expressions returning a scalar value. When this
operator is invoked with a specific number of arguments, a vector or matrix is
implicitly created with a copy of those arguments which can be assigned to an
existing container of matching size. Expression in the operator are evaluated
@@ -1776,7 +1833,7 @@ The temporary container evaluates all expressions and uses the @b highest rankin
type (as defined by @ref axtypeprecedence "arithmetic type precedence") to infer
the element type of the container, implicitly casting all other types to that
type where necessary. In the above example, the temporary created forms a
`mat3d`, before being implicitly cast to a `mat3f` due to the assignment.
@b `mat3d`, before being implicitly cast to a @b `mat3f` due to the assignment.
@subsection axopprecedence Operator Precedence
@@ -1947,10 +2004,10 @@ can be used to assign any scalar a value.
@par
<table>
<tr><th>Type</th><th>Literal Tokens</th></tr>
<tr><td>`bool`</td><td>Tokens `true` and `false`</td></tr>
<tr><td>`bool`</td><td>Tokens @b `true` and @b `false`</td></tr>
<tr><td>`int32`</td><td>No suffix, automatically infered from integral literals</td></tr>
<tr><td>`int64`</td><td>The letter `l` e.g. @code int64 a = 10l; @endcode</td></tr>
<tr><td>`float`</td><td>The letter `f` e.g. @code float a = 0.0f; @endcode</td></tr>
<tr><td>`int64`</td><td>The letter @b `l` e.g. @code int64 a = 10l; @endcode</td></tr>
<tr><td>`float`</td><td>The letter @b `f` e.g. @code float a = 0.0f; @endcode</td></tr>
<tr><td>`double`</td><td>No suffix, automatically infered from floating point literals.</td></tr>
<tr><td>`string`</td><td>Character strings wrapped in double quotes @b \" @b \"</td></tr>
</table>
@@ -1968,6 +2025,7 @@ can be used to assign any scalar a value.
@subsection axattribaccess Attribute Access
<!-- codecs not supported, how are points and volumes sampled (point vs volume) -->
<!--
Further, the active states of
OpenVDB voxels change which voxels AX will process. The defined behavior for all
cases is shown below.
@@ -2006,6 +2064,8 @@ foreach(ActiveVoxel in surface)
DensityIndexSpaceCoord = density.transformToIndex(SurfaceWorldSpaceCoord);
ActiveVoxel = density.getValue(DensityIndexSpaceCoord);
@endcode
done()
-->
@subsection axexternalaccess External Parameter Access
@@ -2048,4 +2108,6 @@ AX Roadmap as a near future feature.
@section axvexsupport AX VEX Support
</div>
*/
+12 -9
View File
@@ -1,8 +1,9 @@
/**
<div style="width:800px;text-align:justify;">
@page axcplusplus AX C++ Documentation
@page axcplusplus OpenVDB AX
@section axcdocs Intro
@section axcdocs AX C++ Documentation
@par
The following documentation focuses on the C++ design and API of OpenVDB AX,
@b not the front end AX language. For the latter, see the
@@ -26,6 +27,7 @@ API doxygen comments or contact us for more information.
- @ref vdbaxcompiler
- @ref vdbaxbinary
- @ref vdbaxtoaxtypes
- @ref vdbaxextend
<hr>
@@ -116,7 +118,7 @@ parser is accessed through the @b ast module.
@par
The @b ast module provides:
- The complete implemenation of an @ref AST.h "AX abstract syntax tree"
- The @vdblink::ax::ast::parse ax::ast::parse()@endlink method
- The openvdb::ax::ast::parse() method
- The @vdblink::ax::ast::Visitor AST Visitor@endlink
- AST scanners and tools
@par
@@ -126,7 +128,7 @@ The complete AST hierarchy is visualized by the @vdblink::ax::ast::Node doxygen
class graph for an openvdb::ax::ast::Node@endlink, which represents the top most
node in the AST. The AST API exists in a nested namespace (`openvdb::ax::ast`)
and can be used by clients for more granular control and modifications to an AST.
Importantly, the AST API contains the `openvdb::ax::ast::parse()` method, which
Importantly, the AST API contains the openvdb::ax::ast::parse() method, which
invokes the C/C++ functions built by the grammar to iteratively construct an
AST from a provided character string.
@par
@@ -137,7 +139,7 @@ branches. All these methods use the @vdblink::ax::ast::Visitor AX visitor
framework@endlink, a visitor pattern traversal class strongly influenced by
<A HREF="https://clang.llvm.org/doxygen/classclang_1_1RecursiveASTVisitor.html">
Clang's RecursiveVisitor</A>. Clients can use the AX visitor to implement their
own AST analysis or modifications.
own AST analysis or modifications (see @ref vdbaxextend).
@subsubsection vdbaxastscanners Scanners
@par
@@ -283,11 +285,11 @@ AX ASTs to verify access patterns of your data.
@subsubsection vdbaxcompilercustomdata Custom Data
@par
The AX language provides two main tokens to access memory which has not been
allocated by AX itself. The first token, `@` (the "at" symbol), is designed to
allocated by AX itself. The first token, @b \@ (the "at" symbol), is designed to
provide read/write access to geometry attributes. The second token is the dollar
character `$`. This allows <b>read only</b> access to custom data that can be
character @b $. This allows <b>read only</b> access to custom data that can be
modified in C++ i.e. outside the scope of an AX program. In the same way as the
`@attribute` syntax, the value of this data can change without the need for AX
@b \@attribute syntax, the value of this data can change without the need for AX
to re-compile the program. It is, however, solely on the C++ clients of AX to
make sure that this data is setup correctly when integrating AX into their
applications.
@@ -485,9 +487,10 @@ Vec4IGrid::registerGrid();
@endcode
<hr>
<!--@section vdbaxextend Extending OpenVDB AX-->
@section vdbaxextend Extending OpenVDB AX
<!--@subsection vdbaxcustomtraversal Custom AST Traversal-->
<!--@subsection vdbaxcustomtraversal Designing an Executable-->
<!--@subsection vdbaxcustomtraversal Geometry Callbacks-->
<!--@subsection vdbaxcustomtraversal Custom Code Generation-->
</div>
*/
+16 -14
View File
@@ -1,4 +1,5 @@
/**
<div style="width:800px;text-align:justify;">
@page axexamples AX Code Examples
@@ -29,12 +30,12 @@ These examples demonstrate how to use AX on OpenVDB points grids.
@subsection axexamplepointbasic Basic point attributes
@par
Below is a small example which demonstrates working with a few point attributes.
The `@` symbol is the identifier for an AX attribute. The type of each attribute
is specified before the `@` symbol and the name is specified afterwards. For
example: `int@count` would imply an @b integer attribute called @b count.
The @ symbol is the identifier for an AX attribute. The type of each attribute
is specified before the @ symbol and the name is specified afterwards. For
example: @b `int\@count` would imply an @b integer attribute called @b count.
@par
In this example there are three point attributes: a @b float attribute @b speed,
a `vec3f` float attribute @b velocity and a `vec3f` float attribute @b colour.
a @b vec3f float attribute @b velocity and a @b vec3f float attribute @b colour.
@par
This snippet uses the functions @ref axlength "length" and @ref axfit "fit" to
give points a colour between black and white based on their speed.
@@ -67,8 +68,8 @@ special attribute.
@subsection axexamplepointdelete Deleting Points
@par
This example demonstrates a simple way of removing points from a VDB points grid.
It uses a combination of @ref axrand "rand()" and @ref axdeletepoint "deletepoint()"
to randomly delete roughly half of the points in the input VDB points grid.
It uses a combination of @ref axrand and @ref axdeletepoint to randomly delete
roughly half of the points in the input VDB points grid.
@par
<!-- P -->@code{.c}
float threshold = 0.5f;
@@ -82,7 +83,7 @@ if (rand(int64@id) > threshold) {
@endcode
@par
The @b id attribute in this example is assumed to be a unique @b integer for
each point in the VDB points grid such that @ref axrand "rand()" will receive a
each point in the VDB points grid such that @ref axrand will receive a
different seed value per point producing a good distribution of random values.
@subsection axexamplepointdrag Applying Drag
@@ -113,7 +114,7 @@ v@P += v@v * dt;
@endcode
@par
The final AX command, `v@P += v@v * dt;` writes to the position attribute of
the points `v@P`. Whenever position is written to in this way, the AX
the points @b `v\@P`. Whenever position is written to in this way, the AX
`PointExecutable` will move (re-bucket) points in PointDataGrids.
@subsection axexamplepointcurlnoise Curl Noise
@@ -197,12 +198,12 @@ These examples demonstrate how to use AX on VDB volume grids.
@subsection axexamplevolumeclamp Volume Clamping
@par
Below is a small example of reading adn writing to voxels within a VDB volume.
As with points, the `@` symbol specifies an access to a named volume, with the
As with points, the @ symbol specifies an access to a named volume, with the
type of each volume preceding it and the name appearing as a suffix. For
example: `float@density` would imply a @b float volume called @b density.
@par
This snippet uses @ref axclamp "clamp()" function to constrain the @b density
attribute between zero and one.
This snippet uses @ref axclamp function to constrain the @b density attribute
between zero and one.
@par
<!-- V -->@code{.c}
float@density = clamp(float@density, 0.f, 1.f);
@@ -233,10 +234,10 @@ vec3f@vel += dt * massInverse * vec3f@force;
@par
Here we demonstrate how AX can be used to blend two volumes together. Note that
only the volumes which are written to are executed over. In the below code,
only `@surface_a` is written to. This means that the final blended result,
only @b `\@surface_a` is written to. This means that the final blended result,
stored in `surface_a`, will only be updated in `surface_a`'s topology. Should
we want a combined blend of @b non @b overlapping areas of both surface `a` and
`b`, we would need to activate `a`'s topology with respect to `b` first.
we want a combined blend of @b non @b overlapping areas of both surface a and b,
we would need to activate a's topology with respect to b first.
@par
<!-- V -->@code{.c}
// time constants for each run.
@@ -262,4 +263,5 @@ mask = clamp(mask, 0.0f, 1.0f);
@surface_a = a + (b-a) * mask;
@endcode
</div>
*/
+4 -1
View File
@@ -1,4 +1,5 @@
/**
<div style="width:800px;text-align:justify;">
@page axfunctionlist AX Supported Functions
@@ -720,7 +721,7 @@ double(int64 seed);
@anchor axrand32
@par rand32
Creates a random number based on the provided 32 bit seed. The number will be in the range of 0 to
1\. The same number is produced for the same seed. NOTE: This function does not share the same
1. The same number is produced for the same seed. NOTE: This function does not share the same
random number generator as rand(). rand32() may provide a higher throughput on some
architectures, but will produce different results to rand(). NOTE: If rand32 is called without
a seed the previous state of the random number generator is advanced for the currently
@@ -880,4 +881,6 @@ int64(int64 dividend; int64 divisor);
int32(int32 dividend; int32 divisor);
@endcode
</div>
*/
+3 -1
View File
@@ -1,4 +1,5 @@
/**
<div style="width:800px;text-align:justify;">
@page openvdbax OpenVDB AX
@@ -40,6 +41,7 @@ provided:
@par
- @subpage axexamples "Code Examples" for examples of OpenVDB AX in action.
- @subpage axfunctionlist "AX Functions" for a list of all available AX functions.
- @ref build "Building OpenVDB" and @ref dependencies "OpenVDB Dependencies" for information on building OpenVDB and <b>OpenVDB AX</b>.
- @subpage build "Building OpenVDB" and @subpage dependencies "OpenVDB Dependencies" for information on building OpenVDB and <b>OpenVDB AX</b>.
</div>
*/
+32 -20
View File
@@ -238,8 +238,10 @@ it's a good idea to read the above section on
DCC | Supported Version | OpenVDB ABI |
-------- | ----------------- | ----------- |
Houdini | 20.5 | 11 |
Houdini | 21.0 | 12 |
Houdini | 19.5 | 9 |
Houdini | 20.0 | 10 |
Maya | 2018 | Any |
Maya | 2019 | Any |
@subsection buildBuildHou Building Against Houdini
@@ -257,13 +259,15 @@ CMake | Cross-platform family of tools designed to help build software
C++17 Compiler | Matching Houdini compiler and version | All |
Boost | Components: iostreams | All |
GoogleTest | A unit testing framework module for C++ | Unit Tests |
CppUnit | A unit testing framework module for C++ | Unit Tests (AX) |
GLFW | Simple API for OpenGL development | OpenVDB View |
Doxygen | Documentation generation from C++ | Documentation |
Log4cplus | An optional dependency for improved OpenVDB Logging | Optional (All) |
nanobind | C++/python bindings | Optional (Python) |
PyBind11 | C++/python bindings | Optional (Python) |
NumPy | Scientific computing with Python | Optional (Python) |
LLVM | Target-independent code generation | OpenVDB AX |
At a minimum a matching C++17 compiler and CMake will be required. See
At a minimum, boost, a matching C++17 compiler and CMake will be required. See
the full [dependency list](@ref dependencies) for help with downloading and
installing the above software. Note that as Blosc and ZLib are provided as part
of the Houdini installation `USE_BLOSC` and `USE_ZLIB` should be left `ON`.
@@ -288,7 +292,7 @@ Required:
Optional:
- [CMAKE_INSTALL_PREFIX](https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html)
- @b [CMAKE_INSTALL_PREFIX](https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html)
=`/path/to/install/dir` # The location you wish to install OpenVDB to. See
the link for default values.
- @b OPENVDB_HOUDINI_INSTALL_PREFIX =`/path/to/install/dir` # The location to
@@ -347,12 +351,14 @@ Boost | Components: iostreams
ZLIB | Compression library for disk serialization compression | All |
Blosc | Recommended dependency for improved disk compression | All* |
GoogleTest | A unit testing framework module for C++ | Unit Tests |
CppUnit | A unit testing framework module for C++ | Unit Tests (AX) |
GLFW | Simple API for OpenGL development | OpenVDB View |
Doxygen | Documentation generation from C++ | Documentation |
OpenEXR | EXR serialization support | OpenVDB Render |
Imath | Used half precision floating points and EXR serialization support | Optional (All) |
Log4cplus | An optional dependency for improved OpenVDB Logging | Optional (All) |
nanobind | C++/python bindings | Optional (Python) |
PyBind11 | C++/python bindings | Optional (Python) |
NumPy | Scientific computing with Python | Optional (Python) |
LLVM | Target-independent code generation | OpenVDB AX |
@@ -381,7 +387,7 @@ Required:
Optional:
- [CMAKE_INSTALL_PREFIX](https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html)
- @b [CMAKE_INSTALL_PREFIX](https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html)
=`/path/to/install/dir` # The location you wish to install OpenVDB to. See
the link for default values.
- @b OPENVDB_MAYA_INSTALL_PREFIX =`/path/to/install/dir` # The location to
@@ -449,7 +455,7 @@ Now you can call CMake by providing the absolute or relative path to the root
of the OpenVDB source tree. Below are some common options you may want to
provide:
- [CMAKE_INSTALL_PREFIX](https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html)
- @b [CMAKE_INSTALL_PREFIX](https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html)
=`/path/to/install/dir` # The location you wish to install OpenVDB to. See
the link for default values.
- @b Xxx_ROOT =`/path/to/Xxx/` # Give CMake a path to where a package has been
@@ -508,7 +514,7 @@ You can add the below CMake snippet to your main `CMakeLists.txt` to bring in
OpenVDB as a dependency:
@code{.cmake}
cmake_minimum_required(VERSION 3.24)
cmake_minimum_required(VERSION 3.18)
list(APPEND CMAKE_MODULE_PATH "/location/of/openvdb/install/lib/cmake/OpenVDB")
find_package(OpenVDB REQUIRED)
target_link_libraries(myapp OpenVDB::openvdb)
@@ -579,7 +585,8 @@ bypass these checks with `-D DISABLE_DEPENDENCY_VERSION_CHECKS=ON` if necessary.
Note that using older or untested dependencies may produce undesired behavior.
Older versions in particular are not supported by OpenVDB.
@b Note: Boost will produce a version error in the format: `Detected version of Boost is too old.`
@b Note: Boost will produce a version error in the format `Detected version of
Boost is too old.`
@subsection troubleshoot3 CMake warnings/errors in FindBoost.cmake
@@ -600,12 +607,17 @@ OpenVDB uses [imported targets](https://cmake.org/cmake/help/latest/command/add_
for all its dependencies. For imported Boost compatibility, the following
versions of CMake are required:
- Boost 1.73 requires CMake 3.17.2 or newer.
- Boost 1.74 requires CMake 3.19 or newer.
- Boost 1.75 requires CMake 3.19.5 or newer.
- Boost 1.76 requires CMake 3.20.3 or newer.
- Boost 1.77 requires CMake 3.21.3 or newer.
- Boost 1.78 requires CMake 3.22.2 or newer.
- Boost 1.79 requires CMake 3.23.2 or newer.
- Boost 1.80 requires CMake 3.24.2 or newer.
- Boost 1.81 requires CMake 3.25.2 or newer.
- Boost 1.82 requires CMake 3.27.0 or newer.
- Boost 1.83 requires CMake 3.27.4 or newer.
- Boost 1.84 requires CMake 3.28.2 or newer.
- Boost 1.85 requires CMake 3.29.3 or newer.
- Boost 1.86 requires CMake 3.30.6, 3.31.1, or newer.
- Boost 1.87 requires CMake 3.31.4 or newer.
Use the above list to identify the version of CMake you require for your version
of Boost. Note that this may be implemented into the OpenVDB CMake in the future.
@@ -631,9 +643,9 @@ Note that you can provide a value for `CMAKE_MSVC_RUNTIME_LIBRARY` which is a
native CMake variable to override any CRT selection done by OpenVDB.
For more information, see the following articles:
- Description of CRT selection: https://docs.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library
- In depth descriptopn of the CRT on Windows: https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features
- Related errors: https://docs.microsoft.com/en-us/cpp/error-messages/tool-errors/linker-tools-error-lnk2038
Description of CRT selection: https://docs.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library
In depth descriptopn of the CRT on Windows: https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features
Related errors: https://docs.microsoft.com/en-us/cpp/error-messages/tool-errors/linker-tools-error-lnk2038
`CMAKE_MSVC_RUNTIME_LIBRARY` docs: https://cmake.org/cmake/help/latest/variable/CMAKE_MSVC_RUNTIME_LIBRARY.html
@subsection troubleshoot5 Unexpected value for the Windows CRT with target build artifacts.
@@ -655,9 +667,9 @@ usage, it is strongly encouraged to match the selection against your desired
build type.
For more information, see the following articles:
- Description of CRT selection: https://docs.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library
- In depth descriptopn of the CRT on Windows: https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features
- Related errors: https://docs.microsoft.com/en-us/cpp/error-messages/tool-errors/linker-tools-error-lnk2038
Description of CRT selection: https://docs.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library
In depth descriptopn of the CRT on Windows: https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features
Related errors: https://docs.microsoft.com/en-us/cpp/error-messages/tool-errors/linker-tools-error-lnk2038
`CMAKE_MSVC_RUNTIME_LIBRARY` docs: https://cmake.org/cmake/help/latest/variable/CMAKE_MSVC_RUNTIME_LIBRARY.html
@subsection troubleshoot6 error LNK2038: mismatch detected for 'RuntimeLibrary'
+41 -609
View File
@@ -2,576 +2,6 @@
@page changes Release Notes
@htmlonly <a name="v13_0_1_changes"></a>@endhtmlonly
@par
<B>Version 13.0.1</B> - <I>In Development</I>
@htmlonly <a name="v13_0_0_changes"></a>@endhtmlonly
@par
<B>Version 13.0.0</B> - <I>November 3, 2025</I>
@par
<BLOCKQUOTE>
This version introduces ABI changes relative to older major releases, so to
preserve ABI compatibility it might be necessary to define the macro
<TT>OPENVDB_ABI_VERSION_NUMBER=</TT><I>N</I>, where, for example,
<I>N</I> is 11 for Houdini&nbsp;20.5 and 12 for Houdini&nbsp;21.0.
</BLOCKQUOTE>
@par
<BLOCKQUOTE>
Support for reading <TT>.vdb</TT> files written prior to VDB&nbsp;1.0 has been
removed. To read older <TT>.vdb</TT> files, please use VDB&nbsp;12.x or older
and re-write them, so that they use the newer file format and can be read in
VDB&nbsp;13+.
</BLOCKQUOTE>
@par
Highlights:
- OpenVDB now includes in-memory support for Half Grids and the file format
has been extended to add I/O serialization for half grids. More work is
planned on adapting algorithms when using Half Grids for better performance
and improved precision.
- NanoVDB is no longer limited to static applications, such as rendering, but
can increasingly be applied to problems that involve dynamic topology, such
as level set tracking, grid building, morphology operations and merging of
grids. This is due to the fact that we keep adding more and more tools to
NanoVDB that facilitates tree modification. However, unlike OpenVDB, these
operations generate new NanoVDB grids (as oppose to in-palace modifications
in OpenVDB), yet are typically much faster since they are performed on the
GPU. Many of these exciting new features are the foundation of fVDB.
@par
OpenVDB:
- New features:
- Added native registration of HalfGrid type.
- Added customization of the output transformation attribute for
@vdblink::points::pca points::pca@endlink. Can be output as a quaternion
or as a combined affine transform with the scale/stretch ommitted.
- Added support for input quaternions attributes and affine transformations
(that include scale) in
@vdblink::points::rasterizeSdf points::rasterizeSdf@endlink for
ellipsoidal rasterizations.
- API Changes:
- Added @c openvdb::tree::LeafBuffer::storage()
for direct const access to the raw data buffer when using the bool LeafNode.
- Removed Grid::evalMinMax(), use
@vdblink::tools::minMax tools::minMax@endlink for superior threaded
performance.
- Removed points::rasterize() that took a custom filter and interrupter.
- Removed LeafNodeBool TopologyCopy constructor in favor of using explicit
mask/buffer constructors.
- Removed @vdblink::tree::ValueAccessor ValueAccessor@endlink NodeT0,
NodeT1, NodeT2 aliases, use NodeTypeAtLevel instead.
- Add @vdblink::tree::InternalNode::setValueMaskUnsafe() InternalNode::setValueMaskUnsafe()@endlink
to write a value mask directly.
- LegacyFrustum and RootNodeMask have been removed. These classes were
only used for reading old .vdb files, which is no longer supported.
- @vdblink::io::writeCompressedValues() io::writeCompressedValues()@endlink
now takes a const ValueT* source buffer for improved const-correctness.
- Bug Fixes:
- Fix a bug in the
@vdblink::tools::LevelSetRayIntersector LevelSetRayIntersector@endlink class
where two of the methods were incorrectly adjusting the time even when an
intersection was not found.
- Fixed an assertion in @vdblink::math::Quat math::Quat@endlink where a
vector length check was using too small a tolerance.
- Fixed a bug in the unit tests where detecting if assertions were enabled
was using @c NDEBUG rather than OpenVDB assertions.
- Build:
- Removed the unnecessary @c USE_NUMPY build option for the OpenVDB Python
module. All functions which take numpy arrays are now always generated
(numpy is not required at compile time for this support).
- Bumped minimum supported CMake version to 3.24, and new future minimum to
4.0.0.
- Bumped minimum supported OpenEXR and Imath versions to 3.2, and new
future minimum to 3.3.
- Bumped minimum supported Boost version to 1.82, and new future minimum to
1.85.
- Bumped minimum supported Python version to 3.11
- Bumped minimum supported Log4cplus version to 2.0
- Bumped minimum supported Houdini version to 20.5
- Bumped minimum supported GLFW version to 3.3
- Bumped future minimum for TBB to 2021 (oneapi).
- Bumped future minimum for nanobind to 2.5.0.
@par
OpenVDB AX:
- New:
- Added support for LLVM 21.
@par
NanoVDB:
- Highlights:
- NanoVDB is no longer limited to static applications, such as rendering,
but can increasingly be applied to problems that involve dynamic topology,
such as level set tracking, grid building, morphology operations and
merging of grids. This is due to the fact that we keep adding more and
more tools to NanoVDB that facilitates tree modification. However, unlike
OpenVDB, these operations generate new NanoVDB grids (as oppose to
in-palace modifications in OpenVDB), yet are typically much faster since
they are performed on the GPU. Many of these exciting new features are the
foundation of fVDB.
- New features:
- Added <TT>nanovdb/tools/cuda/DilateGrid.cuh</TT>, which performs topology
dilation on the GPU.
- Added <TT>nanovdb/tools/cuda/MergeGrids.cuh</TT>, which merges the topology
of two grids on the GPU.
- Added <TT>nanovdb/tools/cuda/CoarsenGrid.cuh</TT>, which performs topological
coarsening of grids on the GPU.
- Added <TT>nanovdb/tools/cuda/RefineGrid.cuh</TT>, which performs topological
refinement of grids on the GPU.
- Added <TT>nanovdb/tools/cuda/PruneGrid.cuh</TT>, which prunes the topology of
a grid using a sidecar mask on the GPU.
- Added <TT>nanovdb/util/cuda/Injection.cuh</TT>, which facilitates sidecar
data copying - on the GPU - in the overlap of two grids with different
topology.
- Added Mat classes and other math types to NanoVDB.
- Major rewrite of nanovdb::NanoToOpenVDB, which now allows
nanovdb::IndexGrids and blind (or sidecar) data to be converted into
an openvdb grid.
- Added support for LevelSet, FogVolume, and Staggered grid semantics.
Added toGridClass and toSemantic to map Grid Blind data semantic to
Grid class and vice versa.
- Improvements:
- Improvements to mGPU grid building and introduction of a separate test
executable for mGPU tests
- Added stand-alone function nanovdb::writeUncompressedGrid that allows
nanovdb::IndexGrids and blind (or sidecar) data to be written directly
to a stream.
- @c nanovdb_print now (optionally) prints the blind data count per grid.
- Extended nanovdb::GridBlindDataSemantic with nanovdb::GridClass types
to support conversion between IndexGrid and regular grids.
- Improvements and bugfixes to PNanoVDB.
- API Changes:
- Removed nanovdb::ValueIndexMask and nanovdb::ValueOnIndexMask since
they are no longer used by fVDB (or elsewhere).
- NanoVDB version is now 32.9.0, so the ABI of the grid is preserved
but not the API. However, the API changes are very minor!
- Bug Fixes:
- Several fixes for compiler warnings.
- Fixed error in <TT>nanovdb/io/IO.h</TT> related to missing throws.
@par
Houdini:
- Remove support for openvdb_houdini::Interrupter, use
openvdb_houdini::HoudiniInterrupter instead.
- Remove input-stealing via duplicateSourceStealable(), SideFX have since
introduced verbification and compiled SOPs to provide zero-copy node
evaluation.
@htmlonly <a name="v12_1_1_changes"></a>@endhtmlonly
@par
<B>Version 12.1.1</B> - <I>September 30, 2025</I>
@par
OpenVDB AX:
- Fixes:
- Fixed an issue which was causing host specific optimization passes to be
omitted when using LLVM 16 and higher.
@par
Houdini:
- Fixed a compilation issue with the OpenVDB Activate SOP with Houdini 21
[Reported by \@callen128]
@htmlonly <a name="v12_1_0_changes"></a>@endhtmlonly
@par
<B>Version 12.1.0</B> - <I>August 8, 2025</I>
@par
OpenVDB:
- New features:
- New level set constructor tools::createLevelSetCapsule creates a grid
containing a narrow-band level set representation of a capsule (tube
with constant radius and sphere caps).
- New level set constructor tools::createLevelSetTaperedCapsule creates a
grid containing a narrow-band level set representation of a tapered
capsule (tube with sphere caps and different radii at both ends, or
equivalently the convex hull of two spheres with possibly different
centers and radii).
- New level set constructor tools::createLevelSetTubeComplex creates a grid
containing a narrow-band level set representation of a tube complex (a
collection of capsules or tapered capsules defined by endpoint coordinates
and segment indices).
- New level set constructor tools::createLevelSetDilatedMesh creates a grid
containing a narrow-band level set representation of a dilated surface
mesh (dilated by a radius in all directions).
- New class tools::ConvexVoxelizer, used by the above methods, which can be
inherited to implement a convex level set constructor.
- Introduced anisotropic surfacing tools in points/PointRasterizeSDF.h and
principal component analysis (PCA) methods in points/PrincipalComponentAnalysis.h.
The latter tool analyses point neighborhoods and computes affine
transformations representing elliptical distributions. The prior tool
takes rotational and stretch point attributes (optionally computed from
the prior PCA methods) and generates anisotropic surfaces.
- Improvements:
- Significantly improved the performance of all LeafNode ValueIterators,
up to 5x on some platforms and up to 10x when delay loading is enabled.
Construction of a ValueIterator from a leaf node now requests the leaf
buffers ahead of iteration to avoid potentially expensive API calls.
- Improved the performance of PointRasterizeSDF.h tools with larger radii
with better bound computation approximations.
- Significant performance improvement to delay loaded files - the warning
logic which checks the underlying mapped file for the last modified time
has been removed, resulting in performance gains upwards of 10x when
loading in node data buffers. Note that the check that was removed is
entirely redundant on Windows and would only print a warning on other
system.
[Contributed by jjtParadox]
- Added OPENVDB_HAS_INVOKABLE_MEMBER_FUNCTION and OPENVDB_HAS_MEMBER_FUNCTION
macros to help determine the presence and compatibility of interface
member functions at compile time.
- Added OPENVDB_ASSUME macros to mimic builtin assume and C++23 assume
attributes.
- Improved read and write of PLY files with vdb_tool so they support Vec3d
and 64 bit attributes. Changed vdb_tool version number from 10.6.1 to
10.7.0.
- API Changes:
- Mat3 and Mat4 functions have been marked [[nodiscard]] where it may be
confusing if they are operating in place or returning a result, in
particular tranpose, invert, adjoint, and timesDiagonal.
- Re-worked the API in PointRasterizeSDF.h with the addition of anisotropic
surfacing kernels. The new API exposes more concise free functions which
take structs of parameters. The old API remains supported but is
deprecated.
- Deprecated providing a filter or interrupter as arguments to
points::rasterize. These can instead be implemented on user transfer
schemes.
- Transfer schemes provided to points::rasterize can now optionally
implement a rasterizePoints callback that takes a range of points per
voxel.
- Fixes:
- Fixed a bug in points::rasterizeSpheres and points::rasterizeSmoothSpheres
which could cause sections of the generated surface to incorrectly be
marked as negative interior values.
- Fixed a bug in points::rasterizeSmoothSpheres which could result in
incomplete surface reconstruction with significantly larger search
distances.
- Fixed some precision issues in various Matrix methods.
- Fixed bugs in vdb_tool that prevented build with newer namespaces in
nanovdb.
@par
OpenVDB AX:
- Improvements:
- Added support for LLVM versions greater than 15. Upgraded CI to test with
LLVM versions 16, 17, 18, 19 and 20.
- As of this release, LLVM 15 is the minimum required version for OpenVDB
AX. Note that there is an issue with LLVM 17 symbols which makes it
incompatible with the OpenVDB Python plugin. AS such, LLVM version 18 and
greater are the recommended LLVM versions to use, with LLVM 18 being the
new future minimum version.
- Significant performance improvement to the compilation of AX kernels when
using LLVM 18 and greater.
- Significant backend refactoring to AX IR generation to support newer
versions of LLVM. In particular, parts of the codegen::Function and
codegen::FunctionBuilder API require new usage from LLVM 16 due to
the LLVM opaque pointer changes. If you're not using the OpenVDB AX
Function codegen API then no client changes should be necessary.
- Migrated OpenVDB AX unit tests from cppunit to gtest
[Contributed by Tim Straubinger]
- Fixes:
- Fixed a case of undefined behaviour when explicitly casting variables to
the same type as their storage type e.g:
double a; double b = double(a);
- Fixed an AX compiler error which would produce invalid IR when using 64bit
integer variables for matrix array offsetting e.g:
int64 a = 0; mat4f b = 1; float c = b[a,a];
@par
NanoVDB:
- Added nanovdb::openToIndexVDB, which can convert an OpenVDB grid into a
NanoVDB IndexGrid.
- Added new options "--index" and "--onIndex" to the command-line tool
nanovdb_convert so it can produce IndexGrids.
- Fixed memory leak in DeviceBuffer.
- Added constructor for DeviceBuffer from an existing HostBuffer.
- Added VoxelBlockManager, an acceleration structure for sequential access
and stencil ops over active voxels.
- Added helper functions for kernel launches with shared memory.
- Added support for CUDA 13.0.
- Fix warnings and compilation errors for GCC and Clang.
- Fixed inconsistent usage of util::cuda::mallocAsync/freeAsync that
affected vGPUs.
- Added support for custom memory resources in PointsToGrid.
- Fixed race condition in split/mergeGridHandles.
- Fixed offset bug in nanovdb::tools::cuda::IndexToGrid related to non-POD
build types.
[Contributed by Andreas Henne]
@par
Houdini:
- Define OP_InputIdx and OP_OutputIdx for Houdini 21.0 compatibility
- Add Houdini 21 style camera interface to support LOP cameras
- Include env flag for avoiding stream writing (was backported to 19.5)
@htmlonly <a name="v12_0_1_changes"></a>@endhtmlonly
@par
<B>Version 12.0.1</B> - <I>April 3, 2025</I>
@par
OpenVDB:
- New features:
- Added read and write support for OFF (Object File Format) files to vdb_tool
- Build:
- Fixed a build issue with vdb_render on Windows with newer versions of glew not including glu.h by default
- Fixed issues with newer versions of clang refusing to accept older ::template syntax
@par
NanoVDB:
- New features:
- Added support for multiple GPUs to DeviceBuffer
- Added a UnifiedBuffer class that wraps CUDA unified memory
- Added example for multiGPU sparse convolution
- Added CUDA utility functions for device queries
- Added functions to independently stop and compute the elapsed time for timer classes
- Improvements:
- Replaced CUB's CachingDeviceAllocator with the default asynchronous stream ordered allocator in PointsToGrid for improved performance
- Bug fix:
- Map is now properly transposed when converting NanoVDB to OpenVDB.
- Fixed ostream specializations being hidden within the nanovdb namespace
- Fixed a call to a non-existent method in GridBuild.h
@htmlonly <a name="v12_0_0_changes"></a>@endhtmlonly
@par
<B>Version 12.0.0</B> - <I>October 31, 2024</I>
@par
<BLOCKQUOTE>
OpenVDB is now licensed under the Apache&nbsp;2.0 license, instead of the MPL&nbsp;2.0 license.
</BLOCKQUOTE>
@par
<BLOCKQUOTE>
This version introduces ABI changes relative to older major releases, so to
preserve ABI compatibility it might be necessary to define the macro
<TT>OPENVDB_ABI_VERSION_NUMBER=</TT><I>N</I>, where, for example,
<I>N</I> is 10 for Houdini&nbsp;20.0 and 11 for Houdini&nbsp;20.5.
</BLOCKQUOTE>
@par
<BLOCKQUOTE>
GCC 9 is no longer supported.
</BLOCKQUOTE>
@par
OpenVDB:
- New features:
- Added tools::LevelSetFilter::fillet() method to round off concave edges
to create smoother transition between surfaces.
- Improvements:
- Added openvdb::assertAbort to replace cassert and a
@c OPENVDB_ENABLE_ASSERTS cmake argument/compile define to toggle
assertions in OpenVDB code, independantly of NDEBUG. Asserts are
no longer enabled by default in when NDEBUG is absent (e.g.
Debug builds).
- Removed last traces of Boost when @c OPENVDB_USE_DELAYED_LOADING is OFF
<I>[Reported&nbsp;by&nbsp;Brian&nbsp;McKinnon]</I>
- RootNode code cleanup to eliminate redundant key conversion and
to create map values in-place.
- Add RootNode::deleteChildOrTile() to delete a child or tile of
the root node.
- ValueAccessors are now defined and created in the Tree class
instead of in the Grid class so that custom Tree implementations
may define and create their own ValueAccessors if desired.
- Added support for PDAL to vdb_tool [Contributed by Tom Matterson]
- LeafManager and NodeManager now use Index64 for leaf counts internally.
- Added RootNode::probeChild() const.
- Added RootNode::probeChild() and RootNode::probeConstChild().
- Added RootNode::probe() and RootNode::probeConst() to query key presence,
child node, value and active state.
- Added InternalNode::probeChild() const.
- Added InternalNode::probeChild() and probeChildConst() with coord access
and optionally value and active state.
- Added InternalNode::probeChild() and probeChildConst() with index access
and optionally value and active state.
- Added InternalNode::isValueOff(), LeafNode::isValueOff(),
LeafNodeBool::isValueOff(), LeafNodeMask::isValueOff().
- Added LeafNodeMask::probeValue(Index,val), LeafNodeBool::probeValue(Index,val).
- Added RootNode::getValueUnsafe(), RootNode::getChildUnsafe(),
RootNode::getConstChildUnsafe().
- Added InternalNode::getValueUnsafe(), InternalNode::getChildUnsafe(),
InternalNode::getConstChildUnsafe().
- Added InternalNode::setActiveStateUnsafe(), InternalNode::setValueOnlyUnsafe(),
InternalNode::setValueOnUnsafe(), InternalNode::setValueOffUnsafe().
- Added InternalNode::setChildUnsafe(), InternalNode::resetChildUnsafe(),
InternalNode::stealChildUnsafe(), InternalNode::deleteChildUnsafe().
- For LeafNode, LeafNodeBool and LeafNodeMask - added
LeafNode::getValueUnsafe(), LeafNode::setActiveStateunsafe(),
LeafNode::setValueOnlyUnsafe(), LeafNode::setValueOnUnsafe(),
LeafNode::setValueOffUnsafe().
- ABI changes:
- Tree::leafCount(), Tree::unallocatedLeafCount(),
Tree::nonLeafCount() and Tree::nodeCount() now use Index64 in their
return types instead of Index32.
- API Changes:
- RootNode::tileCount(), RootNode::activeTileCount() and
RootNode::inactiveTileCount() are now public.
- RootNode::hasKey() and RootNode::coordToKey() are now public.
- RootNode::leafCount(), RootNode::nonLeafCount() and RootNode::nodeCount()
now use Index64 instead of Index32. The Index32 variant is deprecated.
- InternalNode::leafCount(), InternalNode::nonLeafCount() and
InternalNode::nodeCount() now use Index64 instead of Index32. The Index32
variant is deprecated.
- LeafNode::leafCount() and LeafNode::nonLeafCount() now use Index64 instead
of Index32. The Index32 variant is deprecated.
- Bug Fixes:
- Fix potential crash reading corrupt .vdb files with invalid
blosc or zip chunks.
<I>[Reported&nbsp;by&nbsp;Matthias&nbsp;Ueberheide]</I>
- Fix a bug in RootNode::setOrigin() where the origin was updated
before the error was thrown potentially leaving the root in an
invalid state.
- Fixed a thread sanitizer issue which could cause undefined
behaviour in VolumeToSpheres::fillWithSpheres
<I>[Reported&nbsp;by&nbsp;Jérémie&nbsp;Dumas]</I>
- Fixed an occurance of undefined behaviour in tools::activate
(though this would typically not have manifested with any
unintended behaviour)
@par
NanoVDB:
- Bug fix:
- nanovdb::readGrids works with raw grid buffer.
- Improvements:
- Restructure files location and namespace to be more align with
OpenVDB. The namespaces touched by the restructuring are: io,
cuda, util, tools, and math.
- Add two scripts updateFiles.sh and updateFiles.py to update the
files using NanoVDB. The script updateFiles.py works on both
Windows and Linux. For a more complete list of changes, see API
Changes (details).
- cuda::PointsToGrid supports target density.
- Add support for NanoVDB Grid of type UInt8.
- Add ability to use externally managed CUDA buffer.
- Add create methods for CudaDeviceBuffer and exceptions.
- Improve GridValidator logic, e.g. include check for grid count.
- Add operator > and >= for class Coord according to lexicographical order.
- Add toCodec to convert string to Codec enumeration type.
- Add nanovdb::strlen<GridType>().
- Add strncpy util.
- Add @c NANOVDB_DISABLE_SYNC_CUDA_MALLOC that maps cudaMallocAsync
and cudaFreeAsync to cudaMalloc and cudaFree respectively.
- Add guard to @c UINT64_C.
- Remove use of cudaMallocAsync in PointsToGrid.cuh.
- Align PNanoVDB blind metadata to NanoVDB.
- API Changes:
- Change mapToGridType to toGridType.
- Change mapToMagic to toMagic.
- Change <TT>CpuTimer.h</TT> to <TT>Timer.h</TT>.
- API Changes (details):
- These APIs are now under the math namespace: Ray, DDA, HDDA,
Vec3, Vec4, BBox, ZeroCrossing, TreeMarcher, PointTreeMarcher,
BoxStencil, CurvatureStencil, GradStencil, WenoStencil, AlignUp,
Min, Max, Abs, Clamp, Sqrt, Sign, Maximum, Delta, RoundDown, pi,
isApproxZero, Round, createSampler, SampleFromVoxels.
- These APIs are now under the tools namespace: createNanoGrid,
StatsMode, createLevelSetSphere, createFogVolumeSphere,
createFogVolumeSphere, createFogVolumeSphere,
createFogVolumeTorus, createLevelSetBox, CreateNanoGrid,
updateGridStats, evalChecksum, validateChecksum, checkGrid,
Extrema.
- These APIs are now under the util namespace: is_floating_point,
findLowestOn, findHighestOn, Range, streq, strcpy, strcat,
empty, Split, invoke, forEach, reduce, prefixSum, is_same,
is_specialization, PtrAdd, PtrDiff.
- Move nanovdb::build to nanovdb::tools::build.
- Rename nanovdb::BBoxR to nanovdb::Vec3dBBox.
- Rename nanovdb::BBox<nanovdb::Vec3d> to nanovdb::Vec3dBbox.
- Move nanovdb::cudaCreateNodeManager to nanovdb::cuda::createNodeManager.
- Move and rename nanovdb::cudaVoxelsToGrid to nanovdb::cuda::voxelsToGrid.
- Move and rename nanovdb::cudaPointsToGrid to nanovdb::cuda::pointsToGrid.
- Move nanovdb::DitherLUT to nanovdb::math::DitherLUT.
- Move and rename nanovdb::PackedRGBA8 to nanovdb::math::Rgba8.
- Move nanovdb::Rgba8 to nanovdb::math::Rgba8.
- Move and rename nanovdb::CpuTimer to nanovdb::util::Timer.
- Move nanovdb::GpuTimer to nanovdb::util::cuda::Timer.
- Move and rename nanovdb::CountOn to nanovdb::util::countOn.
- Move <TT>util/GridHandle.h</TT> to <TT>GridHandle.h</TT>.
- Move <TT>util/BuildGrid.h</TT> to <TT>tools/GridBuilder.h</TT>.
- Move <TT>util/GridBuilder.h</TT> to <TT>tools/GridBuilder.h</TT>.
- Move <TT>util/IO.h</TT> to <TT>io/IO.h</TT>.
- Move <TT>util/CSampleFromVoxels.h</TT> to <TT>math/CSampleFromVoxels.h</TT>.
- Move <TT>util/DitherLUT.h</TT> to <TT>math/DitherLUT.h</TT>.
- Move <TT>util/HDDA.h</TT> to <TT>math/HDDA.h</TT>.
- Move <TT>util/Ray.h</TT> to <TT>math/Ray.h</TT>.
- Move <TT>util/SampleFromVoxels.h</TT> to <TT>math/SampleFromVoxels.h</TT>.
- Move <TT>util/Stencils.h</TT> to <TT>nanovdb/math/Stencils.h</TT>.
- Move <TT>util/CreateNanoGrid.h</TT> to <TT>tools/CreateNanoGrid.h</TT>.
- Move and rename <TT>util/Primitives.h</TT> to <TT>tools/CreatePrimitives.h</TT>.
- Move <TT>util/GridChecksum.h</TT> to <TT>tools/GridChecksum.h</TT>.
- Move <TT>util/GridStats.h</TT> to <TT>tools/GridStats.h</TT>.
- Move <TT>util/GridChecksum.h</TT> to <TT>tools/GridChecksum.h</TT>.
- Move <TT>util/GridValidator.h</TT> to <TT>tools/GridValidator.h</TT>.
- Move <TT>util/NanoToOpenVDB.h</TT> to <TT>tools/NanoToOpenVDB.h</TT>.
- Move <TT>util/cuda/CudaGridChecksum.cuh</TT> to <TT>tools/cuda/CudaGridChecksum.cuh</TT>.
- Move <TT>util/cuda/CudaGridStats.cuh</TT> to <TT>tools/cuda/CudaGridStats.cuh</TT>.
- Move <TT>util/cuda/CudaGridValidator.cuh</TT> to <TT>tools/cuda/CudaGridValidator.cuh</TT>.
- Move <TT>util/cuda/CudaIndexToGrid.cuh</TT> to <TT>tools/cuda/CudaIndexToGrid.cuh</TT>.
- Move and rename <TT>util/cuda/CudaPointsToGrid.cuh</TT> to <TT>tools/cuda/PointsToGrid.cuh</TT>.
- Move <TT>util/cuda/CudaSignedFloodFill.cuh</TT> to <TT>tools/cuda/CudaSignedFloodFill.cuh</TT>.
- Move and rename <TT>util/cuda/CudaDeviceBuffer.h</TT> to <TT>cuda/DeviceBuffer.h</TT>.
- Move and rename <TT>util/cuda/CudaGridHandle.cuh</TT> to <TT>cuda/GridHandle.cuh</TT>.
- Move and rename <TT>util/cuda/CudaUtils.h</TT> to <TT>util/cuda/Util.h</TT>.
- Move and consolidate <TT>util/cuda/GpuTimer.h</TT> to <TT>util/cuda/Timer.h</TT>.
@par
Python:
- OpenVDB Python bindings are now implemented using nanobind
instead of pybind11
- The OpenVDB Python module has been changed from pyopenvdb to openvdb
- Added Python bindings for NanoVDB
@par
Houdini:
- When @c OPENVDB_ENABLE_RPATH is @c ON, the location of
libopenvdb_houdini is now added to the rpath of all Houdini
dsos.
@par
Build:
- Fixed an issue with OpenVDB AX's CMake on Windows where the
static and shared library targets would have the same name
<I>[Reported&nbsp;by&nbsp;Nicholas&nbsp;Yue]</I>
- @c USE_EXPLICIT_INSTANTIATION is now disabled on Windows by default
due to OOM linker issues.
- Jemalloc is now the preferred allocator of choice on all
platforms when @c CONCURRENT_MALLOC is set to Auto.
- Fixed an issue with the Blosc CMake FindPackage for the OpenVDB
Windows static library.
@htmlonly <a name="v11_0_0_changes"></a>@endhtmlonly
@par
<B>Version 11.0.0</B> - <I>November 1, 2023</I>
@@ -740,10 +170,10 @@ OpenVDB:
- Fixed a bug with LeafManager which wouldn't correctly
initialize its LeafNode array for single level Tree configurations
i.e. RootNode<LeafNode> (bug introduced in 7.2.0).
[Reported by \@lanwatch]
[Reported by @lanwatch]
- Fixed a bug with LeafNodeBool Topology constructor with designated
on/off values which wouldn't apply them correctly.
[Reported by \@hozhaoea]
[Reported by @hozhaoea]
@par
OpenVDB AX:
@@ -2802,13 +2232,13 @@ Improvements:
util::PagedArray@endlink.
- Added an @c install_lib build target to the Makefile.
<I>[Contributed&nbsp;by&nbsp;Double&nbsp;Negative]</I>
- Added @ref points "documentation" and Cookbook
- Added @subpage points "documentation" and Cookbook
@ref openvdbPointsHelloWorld "examples" for OpenVDB&nbsp;Points.
<I>[Contributed&nbsp;by&nbsp;Double&nbsp;Negative]</I>
- Registration of OpenVDB&nbsp;Points grid and attribute types is now
handled in @vdblink::initialize() openvdb::initialize@endlink,
and @c openvdb::points::initialize()
and @c openvdb::points::uninitialize()
and @vdblink::points::initialize() points::initialize@endlink
and @vdblink::points::uninitialize() points::uninitialize@endlink
are therefore deprecated.
- Extended multi-pass I/O to handle a variable number of passes per leaf node.
<I>[Contributed&nbsp;by&nbsp;Double&nbsp;Negative]</I>
@@ -3526,10 +2956,11 @@ Houdini:
- @vdblink::tools::volumeToMesh() tools::volumeToMesh@endlink now compiles
for all grid types but throws an exception if the input grid does not
have a scalar value type.
- Added an <TT>openvdb::io::File::readGrid(const Name&, const BBoxd&)</TT>
overload and <TT>openvdb::GridBase::readBuffers(std::istream&, const CoordBBox&)</TT>
overloads to the grid, tree and node classes that allow one to specify a
bounding box against which to clip a grid while reading it.
- Added a
@vdblink::io::File::readGrid(const Name&, const BBoxd&) File::readGrid@endlink
overload and @vdblink::GridBase::readBuffers(std::istream&, const CoordBBox&)
readBuffers@endlink overloads to the grid, tree and node classes that allow
one to specify a bounding box against which to clip a grid while reading it.
For large grids, clipping while reading can result in significantly lower
memory usage than clipping after reading.
- Added @vdblink::GridBase::clipGrid() GridBase::clipGrid@endlink, which
@@ -3588,11 +3019,10 @@ Houdini:
- Added constructors and methods to both
@vdblink::math::RandInt RandInt@endlink and
@vdblink::math::Rand01 Rand01@endlink to set and reset the random seed value.
- Added convenience methods
<TT>openvdb::math::Transform::indexToWorld(const BBoxd&)</TT>,
<TT>openvdb::math::Transform::worldToIndex(const BBoxd&)</TT> and
<TT>openvdb::math::Transform::worldToIndexCellCentered(const BBoxd&)</TT>
for transforming bounding boxes
- Added convenience methods for
@vdblink::math::Transform::indexToWorld(const BBoxd&) const transforming@endlink
@vdblink::math::Transform::worldToIndex(const BBoxd&) const bounding@endlink
@vdblink::math::Transform::worldToIndexCellCentered(const BBoxd&) const boxes@endlink
to @vdblink::math::Transform math::Transform@endlink.
- @c vdb_view is now compatible with both GLFW&nbsp;2 and GLFW&nbsp;3.
- Made many small changes to address type conversion and other warnings
@@ -3612,9 +3042,9 @@ Houdini:
@par
API changes:
- The addition of an
<TT>openvdb::GridBase::readBuffers(std::istream&, const CoordBBox&)</TT>
virtual function overload and the
- The addition of a
@vdblink::GridBase::readBuffers(std::istream&, const CoordBBox&)
GridBase::readBuffers@endlink virtual function overload and the
@vdblink::GridBase::clip() GridBase::clip@endlink
@vdblink::GridBase::readNonresidentBuffers()
GridBase::readNonresidentBuffers@endlink and
@@ -3719,15 +3149,16 @@ Houdini:
extractSparseTreeWithMask@endlink, which copies data from the index-space
intersection of a sparse tree and a dense input grid.
- Added copy constructors to the
<TT>openvdb::Grid::Grid(const Grid&lt;OtherTreeType&gt;&)</TT>,
<TT>openvdb::tree::Tree::Tree(const Tree&lt;OtherRootType&gt;&)</TT>,
<TT>openvdb::tree::RootNode::RootNode(const RootNode&lt;OtherChildType&gt;&)</TT>,
<TT>openvdb::tree::InternalNode::InternalNode(const InternalNode&lt;OtherChildNodeType, Log2Dim&gt;&)</TT>
and
<TT>openvdb::tree::LeafNode::LeafNode(const LeafNode&lt;OtherValueType, Log2Dim&gt;&)</TT>
@vdblink::Grid::Grid(const Grid<OtherTreeType>&) Grid@endlink,
@vdblink::tree::Tree::Tree(const Tree<OtherRootType>&) Tree@endlink,
@vdblink::tree::RootNode::RootNode(const RootNode<OtherChildType>&)
RootNode@endlink,
@vdblink::tree::InternalNode::InternalNode(const InternalNode<OtherChildNodeType, Log2Dim>&)
InternalNode@endlink and
@vdblink::tree::LeafNode::LeafNode(const LeafNode<OtherValueType, Log2Dim>&) LeafNode@endlink
classes, and an assignment operator overload to
<TT>openvdb::tree::RootNode::operator=(const RootNode&lt;OtherChildType&gt;&)</TT>,
that allow the source and destination to have different
@vdblink::tree::RootNode::operator=(const RootNode<OtherChildType>&)
RootNode@endlink, that allow the source and destination to have different
value types.
- Modified @vdblink::tree::Tree::combine2() Tree::combine2@endlink to permit
combination of trees with different value types.
@@ -3779,7 +3210,7 @@ API changes:
LeafManager::LeafRange::Iterator@endlink,
@vdblink::util::BaseMaskIterator::operator=() BaseMaskIterator@endlink,
@vdblink::util::NodeMask::operator=() NodeMask@endlink and
@c openvdb::util::RootNodeMask::operator=()
@vdblink::util::RootNodeMask::operator=() RootNodeMask@endlink
now return references to the respective objects.
- Removed a number of methods that were deprecated in version&nbsp;2.0.0
or earlier.
@@ -4245,7 +3676,7 @@ API changes:
- @vdblink::tree::LeafManager tree::LeafManager@endlink can now be
instantiated with a @const tree, although buffer swapping with @const trees
is disabled.
- Added an @c openvdb::Grid::signedFloodFill()
- Added a @vdblink::Grid::signedFloodFill() Grid::signedFloodFill@endlink
overload that allows one to specify inside and outside values.
- Fixed a bug in Grid::setBackground() so that now only the values of
inactive voxels change.
@@ -4255,9 +3686,9 @@ API changes:
that relied on input and output grids having compatible tree topology.
- @vdblink::math::Transform math::Transform@endlink now includes an
@vdblink::math::Transform::isIdentity() isIdentity@endlink predicate
and methods <TT>openvdb::math::Transform::preMult(const Mat4d&)</TT> and
<TT>openvdb::math::Transform::postMult(const Mat4d&)</TT>
to pre- and postmultiply by a matrix.
and methods to @vdblink::math::Transform::preMult(const Mat4d&) pre-@endlink
and @vdblink::math::Transform::postMult(const Mat4d&) postmultiply@endlink
by a matrix.
- Modified the @link NodeMasks.h node mask@endlink classes to permit
octree-like tree configurations (i.e., with a branching factor of two)
and to use 64-bit operations instead of 32-bit operations.
@@ -4330,7 +3761,7 @@ API changes:
faster for high-resolution meshes where the polygon/voxel size ratio
is small.
- Added @vdblink::createLevelSet() createLevelSet@endlink and
@vdblink::tools::createLevelSetSphere() createLevelSetSphere@endlink
@vdblink::createLevelSetSphere() createLevelSetSphere@endlink
factory functions for level set grids.
- @vdblink::tree::ValueAccessor tree::ValueAccessor@endlink is now faster
for trees of height 2, 3 and 4 (the latter is the default), and it now
@@ -4443,7 +3874,7 @@ API changes:
- Added @vdblink::tools::compReplace() tools::compReplace@endlink,
which copies the active values of one grid into another, and added
a "Replace A With Active B" mode to the Combine SOP.
- @c openvdb::Grid::signedFloodFill()
- @vdblink::Grid::signedFloodFill() Grid::signedFloodFill@endlink
no longer enters an infinite loop when filling an empty grid.
- Fixed a bug in the particle to level set converter that sometimes
produced level sets with holes, and fixed a bug in the SOP that
@@ -4706,8 +4137,8 @@ API changes:
math library and a method to return the
@vdblink::math::Mat3::trace trace@endlink of a @c Mat3.
- Fixed a bug in the
<TT>openvdb::tree::ValueAccessor::ValueAccessor(const ValueAccessor&)</TT>
copy constructor that caused the copy to reference
@vdblink::tree::ValueAccessor::ValueAccessor(const ValueAccessor&)
ValueAccessor@endlink copy constructor that caused the copy to reference
the original.
- Fixed a bug in @vdblink::tree::RootNode::setActiveState()
RootNode::setActiveState@endlink that caused a crash
@@ -4715,7 +4146,7 @@ API changes:
- Added a @c Tree::pruneLevelSet method that is similar to but faster than
Tree::pruneInactive() for level set grids.
- Added fast leaf node voxel access
<TT>openvdb::tree::LeafNode::getValue(Index)</TT> methods
@vdblink::tree::LeafNode::getValue(Index) const methods@endlink
that index by linear offset (as returned by
@vdblink::tree::LeafNode::ValueOnIter::pos() ValueIter::pos@endlink)
instead of by @ijk coordinates.
@@ -4768,7 +4199,7 @@ API changes:
just the active states of voxels from one grid with those of
another grid of a possibly different type.
- Fixed an incorrect scale factor in the Laplacian diffusion
@c openvdb::tools::Filter::laplacian() filter.
@vdblink::tools::Filter::laplacian() filter@endlink.
- Fixed a bug in @vdblink::tree::Tree::merge() Tree::merge@endlink
that could leave a tree with invalid value accessors.
- Added @vdblink::tree::TreeValueIteratorBase::setActiveState()
@@ -4803,7 +4234,7 @@ API changes:
@par
<B>Version 0.92.0</B> - <I>August 23 2012</I>
- Added a Laplacian diffusion
@c openvdb::tools::Filter::laplacian() filter.
@vdblink::tools::Filter::laplacian() filter@endlink.
- Fixed a bug in the initialization of the sparse contour tracer
that caused mesh-to-volume conversion to fail in certain cases.
- Fixed a bug in the curvature stencil that caused mean curvature
@@ -4831,8 +4262,9 @@ API changes:
method that replaces a grid&rsquo;s tree with a new, empty tree of the
correct type.
- Fixed a crash in
<TT>openvdb::tree::Tree::setValueOff(const Coord& xyz, const ValueType& value)</TT>
when the new value was equal to the background value.
@vdblink::tree::Tree::setValueOff(const Coord& xyz, const ValueType& value)
Tree::setValueOff@endlink when the new value was equal to the
background value.
- Fixed bugs in Tree::prune() that could result in output tiles with
incorrect active states.
- Added @c librt to the link dependencies to address build failures
+1 -1
View File
@@ -7,7 +7,7 @@
This document details the coding practices that are used in the OpenVDB
codebase. Contributed code should conform to these guidelines to maintain
consistency and maintainability. If there is a rule that you would like
clarified, changed, or added, please send a note to openvdb-dev@lists.aswf.io.
clarified, changed, or added, please send a note to openvdb@gmail.com.
@section sStyleContents Contents
+53 -60
View File
@@ -36,69 +36,61 @@ Reference Platform, but for those that do, their specified versions are
Component | Requirements | Optional
----------------------- | ----------------------------------------------- | --------
OpenVDB Core Library | CMake, C++17 compiler, TBB::tbb | Blosc, ZLib, Log4cplus, Imath::Imath (included), Boost::iostream, VCL (included)
OpenVDB Core Library | CMake, C++17 compiler, TBB::tbb, Boost::headers | Blosc, ZLib, Log4cplus, Imath::Imath, Boost::iostream
OpenVDB Print | Core Library dependencies | -
OpenVDB LOD | Core Library dependencies | -
OpenVDB Render | Core Library dependencies | OpenEXR, Imath::Imath, libpng
OpenVDB View | Core Library dependencies, OpenGL, GLFW3, GLEW* | -
OpenVDB Python | Core Library dependencies, Python, nanobind | -
OpenVDB Python | Core Library dependencies, Python, PyBind11 | NumPy
OpenVDB AX | Core Library dependencies, LLVM | Bison, Flex
NanoVDB | - | Core Library, CUDA, TBB, Blosc, ZLib
OpenVDB UnitTests | Core Library dependencies, GoogleTest, numpy* | -
OpenVDB Documentation | Doxygen, Doxygen Awesome (included) | -
OpenVDB UnitTests | Core Library dependencies, GoogleTest | CppUnit**
OpenVDB Documentation | Doxygen | -
- @b * GLEW is only required for building the vdb_view binary on Windows.
- @b * numpy only required for python binding unit tests
- @b ** CppUnit is only required for building the AX unit tests.
- @b Note - Bison and Flex are only required for re-generation of the AX
grammar which is not typically necessary for the majority of users.
Note that OpenVDB comes bundled with the following dependencies. Please see
their respective license documentation in `ext/THIRD-PARTY.md` for license
information.
- Doxygen Awesome
- Imath::Imath
- VCL
@subsection depDependencyTable Dependency Table
Package | Minimum | Recommended | Description | apt-get | Homebrew | Source
--------------- | ------- | ----------- | ----------------------------------------------------------------- | ------- | -------- | ------
CMake | 3.24 | Latest | Cross-platform family of tools designed to help build software | Y | Y | https://cmake.org
GCC | 11.2.1 | 11.2.1 | C++ 17 Compiler: The GNU Compiler Collection | Y | Y | https://www.gnu.org/software/gcc
Clang | 5.0 | Latest | C++ 17 Compiler: A C language family frontend for LLVM | Y | Y | https://clang.llvm.org
Intel ICC | 19 | Latest | C++ 17 Compiler: Intels C++ Compiler | Y | Y | https://software.intel.com/en-us/c-compilers
MSVC | 19.30 | 19.30 | C++ 17 Compiler: Microsoft Visual C++ Compiler | Y | Y | https://visualstudio.microsoft.com/vs
Imath | 3.2 | >= 3.3 | Half precision floating points | Y | Y | http://www.openexr.com
OpenEXR | 3.2 | >= 3.3 | EXR serialization support | Y | Y | http://www.openexr.com
TBB | 2020.3 | >= 2021 | Threading Building Blocks - template library for task parallelism | Y | Y | https://www.threadingbuildingblocks.org
ZLIB | 1.2.7 | Latest | Compression library for disk serialization compression | Y | Y | https://www.zlib.net
Boost | 1.82 | >= 1.85 | Components: iostreams | Y | Y | https://www.boost.org
VCL | 2.02.0 | >= 2.02.0 | x86 intrinsics and SIMD class wrappers and | Y | Y | https://github.com/vectorclass/version2
LLVM | 15.0.0* | 18.0.0 | Target-independent code generation | Y | Y | https://llvm.org/
Bison | 3.7.0 | 3.7.0 | General-purpose parser generator | Y | Y | https://www.gnu.org/software/gcc
Flex | 2.6.4 | 2.6.4 | Fast lexical analyzer generator | Y | Y | https://github.com/westes/flex
Python | 3.10 | 3.11 | The python interpreter and libraries | Y | Y | https://www.python.org
nanobind** | 2.0.0 | >= 2.5.0 | C++/python bindings | Y | Y | https://nanobind.readthedocs.io
GoogleTest | 1.10 | Latest | A unit testing framework module for C++ | Y | Y | https://github.com/google/googletest
Blosc | 1.17.0* | Latest | Recommended dependency for improved disk compression | Y | Y | https://github.com/Blosc/c-blosc/releases
Log4cplus | 1.1.2 | Latest | An optional dependency for improved OpenVDB Logging | Y | Y | https://github.com/log4cplus/log4cplus
libpng | - | Latest | Library for manipulating PNG images | Y | Y | http://www.libpng.org/pub/png/libpng.html
GLFW | 3.3 | Latest | Simple API for OpenGL development | Y | Y | https://www.glfw.org
OpenGL | 3.2 | Latest | Environment for developing portable graphics applications | Y | Y | https://www.opengl.org
GLEW | 1.0.0 | Latest | A cross-platform OpenGL extension loading library. | Y | Y | http://glew.sourceforge.net
CUDA | - | Latest | Parallel computing platform for graphical processing units. | Y | N | https://developer.nvidia.com/cuda-downloads
Doxygen | 1.8.8 | <= 1.14.0 | Documentation generation from C++ | Y | Y | http://www.doxygen.nl
Doxygen Awesome | 2.0.0 | >= 2.0.0 | Documentation generation from C++ | Y | Y | https://github.com/jothepro/doxygen-awesome-css
Package | Minimum | Recommended | Description | apt-get | Homebrew | Source
-------------- | ------- | ----------- | ----------------------------------------------------------------- | ------- | -------- | ------
CMake | 3.18 | Latest | Cross-platform family of tools designed to help build software | Y | Y | https://cmake.org
GCC | 9.3.1 | 11.2.1 | C++ 17 Compiler: The GNU Compiler Collection | Y | Y | https://www.gnu.org/software/gcc
Clang | 5.0 | Latest | C++ 17 Compiler: A C language family frontend for LLVM | Y | Y | https://clang.llvm.org
Intel ICC | 19 | Latest | C++ 17 Compiler: Intels C++ Compiler | Y | Y | https://software.intel.com/en-us/c-compilers
MSVC | 19.28 | 19.30 | C++ 17 Compiler: Microsoft Visual C++ Compiler | Y | Y | https://visualstudio.microsoft.com/vs
Imath | 3.1 | Latest | Half precision floating points | Y | Y | http://www.openexr.com
OpenEXR | 3.1 | Latest | EXR serialization support | Y | Y | http://www.openexr.com
TBB | 2020.2 | 2020.3 | Threading Building Blocks - template library for task parallelism | Y | Y | https://www.threadingbuildingblocks.org
ZLIB | 1.2.7 | Latest | Compression library for disk serialization compression | Y | Y | https://www.zlib.net
Boost | 1.73 | 1.80 | Components: headers, iostreams | Y | Y | https://www.boost.org
LLVM | 10.0.0 | 13.0.0* | Target-independent code generation | Y | Y | https://llvm.org/
Bison | 3.0.0 | 3.7.0 | General-purpose parser generator | Y | Y | https://www.gnu.org/software/gcc
Flex | 2.6.0 | 2.6.4 | Fast lexical analyzer generator | Y | Y | https://github.com/westes/flex
Python | 3.9.1 | 3.10 | The python interpreter and libraries | Y | Y | https://www.python.org
PyBind11 | 2.9.1 | Latest | C++/python bindings | Y | Y | https://pybind11.readthedocs.io
NumPy | 1.20.0 | 1.23.0 | Scientific computing with Python | Y | Y | http://www.numpy.org
GoogleTest | 1.10 | Latest | A unit testing framework module for C++ | Y | Y | https://github.com/google/googletest
CppUnit | 1.10 | Latest | A unit testing framework module for C++ | N | Y | https://freedesktop.org/wiki/Software/cppunit
Blosc | 1.17.0* | 1.17.0 | Recommended dependency for improved disk compression | Y | Y | https://github.com/Blosc/c-blosc/releases
Log4cplus | 1.1.2 | Latest | An optional dependency for improved OpenVDB Logging | Y | Y | https://github.com/log4cplus/log4cplus
libpng | - | Latest | Library for manipulating PNG images | Y | Y | http://www.libpng.org/pub/png/libpng.html
GLFW | 3.1 | > 3.3 | Simple API for OpenGL development | Y | Y | https://www.glfw.org
OpenGL | 3.2 | Latest | Environment for developing portable graphics applications | Y | Y | https://www.opengl.org
GLEW | 1.0.0 | Latest | A cross-platform OpenGL extension loading library. | Y | Y | http://glew.sourceforge.net
CUDA | - | Latest | Parallel computing platform for graphical processing units. | Y | N | https://developer.nvidia.com/cuda-downloads
Doxygen | 1.8.8 | 1.8.11 | Documentation generation from C++ | Y | Y | http://www.doxygen.nl
- @b * See the note in [known issues](@ref depKnownIssues) regarding supported blosc/llvm versions.
- @b ** See the note in [known issues](@ref depKnownIssues) regarding supported nanobind build issues.
- @b * See the note in [known issues](@ref depKnownIssues) regarding supported blosc/llvm versions.
@subsection depKnownIssues Known Issues
- @b On Linux, LLVM == 17 has symbol issues which makes it incompatible when
used with the OpenVDB Python plugin. LLVM versions greater than 18 should be
preferred.
- @b LLVM >= 15. LLVM has recently changed their IR pointer data types to be
completely opaque. Some support is provided in LLVM 15 but tests with AX show
that this is extremely unstable. AX currently only supports LLVM versions up
until 14.X.X. See https://llvm.org/docs/OpaquePointers.html for more details.
- @b GLFW: Crash with GLFW 3.2.1 when used with EGL on Linux. OpenVDB View may
segfault on closure. Fixed in GLFW 3.3
@@ -110,18 +102,15 @@ Doxygen Awesome | 2.0.0 | >= 2.0.0 | Documentation generation from C++
Additionally these versions of blosc may generally not be compatible with OpenVDB
itself. Avoid using these versions and upgrade to the new minimum of 1.17.0 where
possible.
- All versions from 1.11.0 through to, but excluding, 1.14.0.
- Versions 1.16.0 and 1.16.1.
.
For more information see:
- https://www.blosc.org/posts/new-forward-compat-policy/
- https://github.com/Blosc/c-blosc/issues/260
- https://github.com/Blosc/c-blosc/issues/261
- @b nanobind: Nanobind requires a fast-hash-map implementation library called
tsl-robin-map. If you're installing nanobind through homebrew, this library
may not be installed correctly and OpenVDB's CMake will only produce a warning.
Make sure to also: `brew install robin-map`.
- All versions from 1.11.0 through to, but excluding, 1.14.0.
- Versions 1.16.0 and 1.16.1.
For more information see:
- https://www.blosc.org/posts/new-forward-compat-policy/
- https://github.com/Blosc/c-blosc/issues/260
- https://github.com/Blosc/c-blosc/issues/261
@section depInstallingDependencies Installing Dependencies
@@ -156,15 +145,17 @@ apt-get install zlibc # zlib
apt-get install libboost-iostreams-dev # Boost::iostream
apt-get install libblosc-dev # Blosc
# AX
apt-get install llvm-15-dev # LLVM
apt-get install llvm-10-dev # LLVM
# Python
apt-get install pybind11-dev # Python
apt-get install python-dev # Python
pip install nanobind # nanobind
apt-get install python-numpy # NumPy
# Optional
apt-get install libpng-dev # libpng
apt-get install libopenexr-dev # OpenEXR
apt-get install liblog4cplus-dev # Log4cplus
apt-get install googletest # GoogleTest
apt-get install libcppunit-dev # CppUnit
# vdb_view
apt-get install libglfw3-dev # GLFW
# Documentation
@@ -189,10 +180,12 @@ brew install c-blosc # blosc
# AX
brew install llvm # LLVM
# Python
brew install pybind11 # PyBind11
brew install python # Python
brew install nanobind robin-map # nanobind
brew install numpy # NumPy
# Unit Tests
brew install gtest # GoogleTest
brew install cppunit # CppUnit
# vdb_view
brew install glfw # GLFW
# vdb_render
+29 -18
View File
@@ -22,30 +22,44 @@ primarily by
- Mihai Ald&eacute;n
- David Hill
@par Quick Links
- @subpage changes "Release Notes"
- @subpage dependencies "Dependencies"
- @subpage build "Building OpenVDB"
- @subpage overview "Overview"
- @ref transformsAndMaps "Transforms and Maps"
- @ref codeExamples "Cookbook"
- @ref faq "FAQ"
- @subpage python "OpenVDB Python"
- @subpage points "OpenVDB Points"
See the @subpage changes "Release Notes" for what&rsquo;s new in this version
of @b OpenVDB.
See the @subpage dependencies "Dependencies" page for @b OpenVDB requirements.
See @subpage build "Building OpenVDB" for information on building @b OpenVDB.
See the @subpage overview "Overview" for an introduction to the library.
See @subpage transformsAndMaps "Transforms and Maps" for more
discussion of the transforms used in @b OpenVDB.
See the @subpage faq "FAQ" for frequently asked questions about @b OpenVDB.
See the @subpage codeExamples "Cookbook" to get started using @b OpenVDB.
See @subpage points "OpenVDB Points" to store point data using @b OpenVDB.
See @subpage python "Using OpenVDB in Python" to get started with the
@b OpenVDB Python module.
@if OPENVDB_AX
- @subpage openvdbax "OpenVDB AX"
See @subpage openvdbax "OpenVDB AX" for the AX documentation.
@endif
@if OPENVDB_HOUDINI
- @subpage houdini "Houdini Cookbook"
See the @subpage houdini "Houdini Cookbook" for help on implementing Houdini nodes.
@endif
@if NANOVDB
- @subpage NanoVDB_MainPage "NanoVDB"
See @subpage NanoVDB_MainPage "NanoVDB" for the NanoVDB documentation.
@endif
- <a href="../code_coverage/index.html">Code Coverage</a>
Contributors, please familiarize yourselves with our
@subpage codingStyle "coding standards".
<a href="../code_coverage/index.html">Code Coverage</a>
@page overview OpenVDB Overview
@@ -67,9 +81,6 @@ Contributors, please familiarize yourselves with our
- @ref subsecNodeIter
- @ref subsecValueAccessor
- @ref subsecTraversal
- @subpage transformsAndMaps "Transforms and Maps"
<!-- - @ref secRegistry -->
@@ -309,7 +320,7 @@ as level sets.
(The lower-level @vdblink::tools::GridResampler GridResampler@endlink does not,
but it is optimized for level set grids in that it transforms only voxels
in the narrow band and relies on
@vdblink::tools::signedFloodFill() signed flood fill@endlink to reconstruct
@vdblink::Grid::signedFloodFill() signed flood fill@endlink to reconstruct
the inside and outside regions.)
Other tools whose behavior is affected by the grid class include the
@vdblink::tools::divergence() divergence@endlink operator (which has an
+5 -5
View File
@@ -40,10 +40,10 @@ details of VDB are described in the paper
<a href="http://www.museth.org/Ken/Publications.html" target="_blank">"VDB: High-Resolution Sparse Volumes with Dynamic Topology"</a>.
@section sWhatLicense What license is OpenVDB distributed under?
OpenVDB is released under the Apache License Version 2.0, which is a
free, open source software license developed and maintained by the Apache Software
Foundation. For more information about this license, see
<a href="https://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License, Version 2</a>.
OpenVDB is released under the Mozilla Public License Version 2.0, which is a
free, open source software license developed and maintained by the Mozilla
Foundation. For more information about this license, see the
<a href="https://www.mozilla.org/en-US/MPL/" target="_blank">Mozilla FAQ</a>.
@section sWhatCLA Is there a Contributor License Agreement for OpenVDB?
Yes, developers who wish to contribute code to be considered for inclusion
@@ -196,7 +196,7 @@ For multithreaded insertion operations we typically assign a separate grid
to each thread and then merge the grids as threads terminate.
This technique works remarkably well: because OpenVDB
is sparse and hierarchical, merging is very efficient.
For more details, please consult the @ref codeExamples and
For more details, please consult the @subpage codeExamples and
Appendix&nbsp;B in the <i>Transactions on Graphics</i> paper.
@section sMaxRes Is OpenVDB unbounded?
-88
View File
@@ -1,88 +0,0 @@
<!-- HTML header for doxygen 1.15.0-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="$langISO">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen $doxygenversion"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
<!--BEGIN PROJECT_ICON-->
<link rel="icon" href="$relpath^$projecticon" type="image/x-icon" />
<!--END PROJECT_ICON-->
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
<!--BEGIN FULL_SIDEBAR-->
<script type="text/javascript">var page_layout=1;</script>
<!--END FULL_SIDEBAR-->
<script type="text/javascript" src="$relpath^jquery.js"></script>
<script type="text/javascript" src="$relpath^dynsections.js"></script>
<!--BEGIN COPY_CLIPBOARD-->
<script type="text/javascript" src="$relpath^clipboard.js"></script>
<!--END COPY_CLIPBOARD-->
$treeview
$search
$mathjax
$darkmode
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
$extrastylesheet
<script type="text/javascript" src="$relpath^doxygen-awesome-darkmode-toggle.js"></script>
<script type="text/javascript">
DoxygenAwesomeDarkModeToggle.init()
</script>
<script type="text/javascript" src="$relpath^doxygen-awesome-fragment-copy-button.js"></script>
<script type="text/javascript">
DoxygenAwesomeFragmentCopyButton.init()
</script>
<script type="text/javascript" src="$relpath^doxygen-awesome-paragraph-link.js"></script>
<script type="text/javascript">
DoxygenAwesomeParagraphLink.init()
</script>
</head>
<body>
<!--BEGIN FULL_SIDEBAR-->
<div id="side-nav" class="ui-resizable side-nav-resizable"><!-- do not remove this div, it is closed by doxygen! -->
<!--END FULL_SIDEBAR-->
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<!--BEGIN TITLEAREA-->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<!--BEGIN PROJECT_LOGO-->
<td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"$logosize/></td>
<!--END PROJECT_LOGO-->
<!--BEGIN PROJECT_NAME-->
<td id="projectalign">
<div id="projectname">$projectname<!--BEGIN PROJECT_NUMBER--><span id="projectnumber">&#160;$projectnumber</span><!--END PROJECT_NUMBER-->
</div>
<!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
</td>
<!--END PROJECT_NAME-->
<!--BEGIN !PROJECT_NAME-->
<!--BEGIN PROJECT_BRIEF-->
<td>
<div id="projectbrief">$projectbrief</div>
</td>
<!--END PROJECT_BRIEF-->
<!--END !PROJECT_NAME-->
<!--BEGIN DISABLE_INDEX-->
<!--BEGIN SEARCHENGINE-->
<!--BEGIN !FULL_SIDEBAR-->
<td>$searchbox</td>
<!--END !FULL_SIDEBAR-->
<!--END SEARCHENGINE-->
<!--END DISABLE_INDEX-->
</tr>
<!--BEGIN SEARCHENGINE-->
<!--BEGIN FULL_SIDEBAR-->
<tr><td colspan="2">$searchbox</td></tr>
<!--END FULL_SIDEBAR-->
<!--END SEARCHENGINE-->
</tbody>
</table>
</div>
<!--END TITLEAREA-->
<!-- end header part -->
Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

+1 -1
View File
@@ -26,7 +26,7 @@
* **Does NanoVDB depend on and require CUDA?**
No, NanoVDB is by design agnostic and works with most graphics APIs, e.g. OpenGL, OpenCL, OptiX, CUDA, HLSL, GLSL, DirectX, and even the CPU! The data structure itself (defined in [NanoVDB.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/NanoVDB.h) and [PNanoVDB.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/PNanoVDB.h)) only depends on C++11 or C99. However, some of the auxiliary math classes are optionally optimized with intrinsic CUDA calls (e.g. fma in Vec3) and the [DeviceBuffer](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/cuda/DeviceBuffer.h) allocator uses CUDA for explicit memory management. It should be straightforward to replace (or remove) these CUDA dependencies if you so desire.
No, NanoVDB is by design agnostic and works with most graphics APIs, e.g. OpenGL, OpenCL, OptiX, CUDA, HLSL, GLSL, DirectX, and even the CPU! The data structure itself (defined in [NanoVDB.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/NanoVDB.h) and [PNanoVDB.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/PNanoVDB.h)) only depends on C++11 or C99. However, some of the auxiliary math classes are optionally optimized with intrinsic CUDA calls (e.g. fma in Vec3) and some of the [Allocator](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/CudaDeviceBuffer.h) uses CUDA for explicit memory management. It should be straightforward to replace (or remove) these CUDA dependencies if you so desire.
* **How does the data structure of NanoVDB compare to that of OpenVDB?**
+141 -25
View File
@@ -1,38 +1,154 @@
# NanoVDB Hello World Examples {#NanoVDB_HelloWorld}
The example snippets below are pulled directly from compiled example source
files via Doxygen's `\snippet` mechanism, so the code shown here is always
in sync with what is built and tested in CI. Enable
`-DNANOVDB_BUILD_EXAMPLES=ON` to build them locally.
[The first example](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/examples/ex_openvdb_to_nanovdb_accessor/openvdb_to_nanovdb_accessor.cc) shows how to convert an OpenVDB level set sphere into a NanoVDB level set, use accessors to print out multiple values from both grids, and save the NanoVDB grid to file. Note that **this example depends on both OpenVDB and NanoVDB**.
## Convert an OpenVDB grid to NanoVDB and use accessors
```cpp
#include <openvdb/tools/LevelSetSphere.h> // replace with your own dependencies for generating the OpenVDB grid
#include <nanovdb/util/CreateNanoGrid.h> // converter from OpenVDB to NanoVDB (includes NanoVDB.h and GridManager.h)
#include <nanovdb/util/IO.h>
[The first example](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/examples/ex_openvdb_to_nanovdb_accessor/openvdb_to_nanovdb_accessor.cc)
shows how to convert an OpenVDB level set sphere into a NanoVDB level set, use
accessors to print out multiple values from both grids, and save the NanoVDB
grid to file. Note that **this example depends on both OpenVDB and NanoVDB**.
// Convert an openvdb level set sphere into a nanovdb, use accessors to print out multiple values from both
// grids and save the NanoVDB grid to file.
// Note, main depends on BOTH OpenVDB and NanoVDB.
int main()
{
try {
// Create an OpenVDB grid (here a level set surface but replace this with your own code)
auto srcGrid = openvdb::tools::createLevelSetSphere<openvdb::FloatGrid>(100.0f, openvdb::Vec3f(0.0f), 1.0f);
\snippet nanovdb/nanovdb/examples/ex_openvdb_to_nanovdb_accessor/openvdb_to_nanovdb_accessor.cc openvdb_to_nanovdb_accessor
// Convert the OpenVDB grid, srcGrid, into a NanoVDB grid handle.
auto handle = nanovdb::createNanoGrid(*srcGrid);
## Read a NanoVDB grid from a file (host only)
// Define a (raw) pointer to the NanoVDB grid on the host. Note we match the value type of the srcGrid!
auto* dstGrid = handle.grid<float>();
[The second example](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/examples/ex_read_nanovdb_sphere_accessor/read_nanovdb_sphere_accessor.cc)
reads a NanoVDB grid from a file (the one saved in the previous example) and
prints out multiple values. Note that **this example does not depend on
OpenVDB (nor CUDA), only NanoVDB**.
if (!dstGrid)
throw std::runtime_error("GridHandle does not contain a grid with value type float");
\snippet nanovdb/nanovdb/examples/ex_read_nanovdb_sphere_accessor/read_nanovdb_sphere_accessor.cc read_nanovdb_sphere_accessor
// Get accessors for the two grids. Note that accessors only accelerate repeated access!
auto dstAcc = dstGrid->getAccessor();
auto srcAcc = srcGrid->getAccessor();
## Read a NanoVDB grid and access it on the CPU and GPU
// Access and print out a cross-section of the narrow-band level set from the two grids
for (int i = 97; i < 104; ++i) {
printf("(%3i,0,0) OpenVDB cpu: % -4.2f, NanoVDB cpu: % -4.2f\n", i, srcAcc.getValue(openvdb::Coord(i, 0, 0)), dstAcc.getValue(nanovdb::Coord(i, 0, 0)));
}
[The third example](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/examples/ex_read_nanovdb_sphere_accessor_cuda/read_nanovdb_sphere_accessor_cuda.cu)
reads a NanoVDB grid from a file (the one saved in the first example) and
prints out multiple values on both the CPU and GPU. Note that **this example
does NOT depend on OpenVDB, only NanoVDB and CUDA**.
nanovdb::io::writeGrid("data/sphere.nvdb", handle); // Write the NanoVDB grid to file and throw if writing fails
}
catch (const std::exception& e) {
std::cerr << "An exception occurred: \"" << e.what() << "\"" << std::endl;
}
return 0;
}
```
\snippet nanovdb/nanovdb/examples/ex_read_nanovdb_sphere_accessor_cuda/read_nanovdb_sphere_accessor_cuda.cu read_nanovdb_sphere_accessor_cuda
[The second example](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/examples/ex_read_nanovdb_sphere_accessor/read_nanovdb_sphere_accessor.cc) reads a NanoVDB grid from a file (the one saved in the previous example) and prints out multiple values. Note that **this example does not depend on OpenVDB (nor CUDA), only NanoVDB**.
NVCC requires the CUDA kernel to be defined in
[a separate .cu file](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/examples/ex_read_nanovdb_sphere_accessor_cuda/read_nanovdb_sphere_accessor_cuda_kernel.cu):
```cpp
#include <nanovdb/util/IO.h> // this is required to read (and write) NanoVDB files on the host
\snippet nanovdb/nanovdb/examples/ex_read_nanovdb_sphere_accessor_cuda/read_nanovdb_sphere_accessor_cuda_kernel.cu read_nanovdb_sphere_accessor_cuda_kernel
/// @brief Read a NanoVDB grid from a file and print out multiple values.
///
/// @note Note This example does NOT depend on OpenVDB (nor CUDA), only NanoVDB.
int main()
{
try {
auto handle = nanovdb::io::readGrid("data/sphere.nvdb"); // reads first grid from file
auto* grid = handle.grid<float>(); // get a (raw) pointer to a NanoVDB grid of value type float
if (!grid)
throw std::runtime_error("File did not contain a grid with value type float");
auto acc = grid->getAccessor(); // create an accessor for fast access to multiple values
for (int i = 97; i < 104; ++i) {
printf("(%3i,0,0) NanoVDB cpu: % -4.2f\n", i, acc.getValue(nanovdb::Coord(i, 0, 0)));
}
}
catch (const std::exception& e) {
std::cerr << "An exception occurred: \"" << e.what() << "\"" << std::endl;
}
return 0;
}
```
[The third example](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/examples/ex_read_nanovdb_sphere_accessor_cuda/read_nanovdb_sphere_accessor_cuda.cc) reads a NanoVDB grid from a file (the one saved in the first example) and prints out multiple values on both the CPU and GPU. Note that **this example does NOT depend on OpenVDB, only NanoVDB and CUDA**.
```cpp
#include <nanovdb/util/IO.h> // this is required to read (and write) NanoVDB files on the host
#include <nanovdb/util/cuda/CudaDeviceBuffer.h> // required for CUDA memory management
extern "C" void launch_kernels(const nanovdb::NanoGrid<float>*,
const nanovdb::NanoGrid<float>*,
cudaStream_t stream);
/// @brief Read a NanoVDB grid from a file and print out multiple values on both the cpu and gpu.
///
/// @note Note This example does NOT depend on OpenVDB, only NanoVDB and CUDA.
int main()
{
try {
// returns a GridHandle using CUDA for memory management.
auto handle = nanovdb::io::readGrid<nanovdb::CudaDeviceBuffer>("data/sphere.nvdb");
cudaStream_t stream; // Create a CUDA stream to allow for asynchronous copy of pinned CUDA memory.
cudaStreamCreate(&stream);
handle.deviceUpload(stream, false); // Copy the NanoVDB grid to the GPU asynchronously
auto* cpuGrid = handle.grid<float>(); // get a (raw) pointer to a NanoVDB grid of value type float on the CPU
auto* deviceGrid = handle.deviceGrid<float>(); // get a (raw) pointer to a NanoVDB grid of value type float on the GPU
if (!deviceGrid || !cpuGrid)
throw std::runtime_error("GridHandle did not contain a grid with value type float");
launch_kernels(deviceGrid, cpuGrid, stream); // Call a host method to print a grid values on both the CPU and GPU
cudaStreamDestroy(stream); // Destroy the CUDA stream
}
catch (const std::exception& e) {
std::cerr << "An exception occurred: \"" << e.what() << "\"" << std::endl;
}
return 0;
}
```
NVCC requires the CUDA kernel to be defined in [a separate .cu file](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/examples/ex_read_nanovdb_sphere_accessor_cuda/read_nanovdb_sphere_accessor_cuda.cu):
```cpp
#include <nanovdb/NanoVDB.h> // this defined the core tree data structure of NanoVDB accessible on both the host and device
#include <stdio.h> // for printf
// This is called by the host only
void cpu_kernel(const nanovdb::NanoGrid<float>* cpuGrid)
{
auto cpuAcc = cpuGrid->getAccessor();
for (int i = 97; i < 104; ++i) {
printf("(%3i,0,0) NanoVDB cpu: % -4.2f\n", i, cpuAcc.getValue(nanovdb::Coord(i, 0, 0)));
}
}
// This is called by the device only
__global__ void gpu_kernel(const nanovdb::NanoGrid<float>* deviceGrid)
{
if (threadIdx.x > 6)
return;
int i = 97 + threadIdx.x;
auto gpuAcc = deviceGrid->getAccessor();
printf("(%3i,0,0) NanoVDB gpu: % -4.2f\n", i, gpuAcc.getValue(nanovdb::Coord(i, 0, 0)));
}
// This is called by the client code on the host
extern "C" void launch_kernels(const nanovdb::NanoGrid<float>* deviceGrid,
const nanovdb::NanoGrid<float>* cpuGrid,
cudaStream_t stream)
{
// Launch the device kernel asynchronously
gpu_kernel<<<1, 64, 0, stream>>>(deviceGrid);
// Launch the host "kernel" (synchronously)
cpu_kernel(cpuGrid);
}
```
+24 -54
View File
@@ -5,15 +5,15 @@
* [NanoVDB.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/NanoVDB.h) C++11 implementation of the core data structure and its access methods.
* [CNanoVDB.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/CNanoVDB.h) Incomplete but useable C99 implementation of the core data structure and its access methods. Designed in particular for use in OpenCL kernels. Note that this relies on zero-sized arrays for the _reserved padding, so will not work on all compilers (with MSVC being a particular example)
* [PNanoVDB.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/PNanoVDB.h) C99 implementation of the core data structure and its access methods. More complete coverage than CNanoVDB. This version is pointer-less and supports virtually all graphics APIs.
* [GridHandle.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/GridHandle.h) defines a handler for the memory allocated to a NanoVDB grid.
* [io/IO.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/io/IO.h) implements I/O support.
* [tools/CreateNanoGrid.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/tools/CreateNanoGrid.h) defines the converter from OpenVDB to NanoVDB and obviously depends on the OpenVDB library (as the only header file).
* [math/Ray.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/math/Ray.h) Ray class.
* [math/HDDA.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/math/HDDA.h) HDDA related.
* [math/SampleFromVoxels.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/math/SampleFromVoxels.h) interpolation.
* [util/GridHandle.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/GridHandle.h) defines a handler for the memory allocated to a NanoVDB grid.
* [util/IO.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/IO.h) implements I/O support.
* [util/OpenToNanoVDB.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/OpenToNanoVDB.h) defines the converter from OpenVDB to NanoVDB and obviously depends on the OpenVDB library (as the only header file).
* [Ray.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/Ray.h) Ray class.
* [HDDA.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/HDDA.h) HDDA related.
* [SampleFromVoxels.h](https://github.com/AcademySoftwareFoundation/openvdb/blob/master/nanovdb/nanovdb/util/SampleFromVoxels.h) interpolation.
```
$ tree
```bash
foo@bar:~$ tree
.
├── CMakeLists.txt
├── cmd
@@ -22,19 +22,25 @@ $ tree
│ │ └── nanovdb_convert.cc
│ ├── print
│ │ └── nanovdb_print.cc
│ ├── updateFiles.sh
│ └── validate
│ └── nanovdb_validate.cc
├── CNanoVDB.h
├── cuda
│ ├── DeviceBuffer.h
│ ├── GridHandle.cuh
│ └── NodeManager.cuh
├── docs
│ ├── CMakeLists.txt
│ ├── codingstyle.txt
│ └── doxygen-config
├── examples
│ ├── benchmark
│ │ ├── BenchKernels_dense.cu
│ │ ├── BenchKernels_nano.cu
│ │ ├── Benchmark_dense.cu
│ │ ├── Benchmark_nano.cu
│ │ ├── Camera.h
│ │ ├── CMakeLists.txt
│ │ ├── DenseGrid.h
│ │ ├── Image.h
│ │ ├── TestBenchmark.cc
│ │ └── TestBenchmark.cu
│ ├── CMakeLists.txt
│ ├── ex_bump_pool_buffer
│ │ └── bump_pool_buffer.cc
@@ -44,7 +50,7 @@ $ tree
│ │ ├── nanovdb.cu
│ │ └── openvdb.cc
│ ├── ex_index_grid_cuda
│ │ ├── index_grid_cuda.cc
│ │ ├── index_grid_cuda.cu
│ │ └── index_grid_cuda_kernel.cu
│ ├── ex_make_custom_nanovdb
│ │ └── make_custom_nanovdb.cc
@@ -60,7 +66,6 @@ $ tree
│ ├── ex_map_pool_buffer
│ │ └── map_pool_buffer.cc
│ ├── ex_modify_nanovdb_thrust
│ │ ├── modify_nanovdb_thrust.cc
│ │ └── modify_nanovdb_thrust.cu
│ ├── ex_nodemanager_cuda
│ │ ├── nodemanager_cuda.cc
@@ -98,38 +103,9 @@ $ tree
│ │ └── VoxToNanoVDB.h
│ └── ex_write_nanovdb_grids
│ └── write_nanovdb_grids.cc
├── GridHandle.h
├── HostBuffer.h
├── io
│ └── IO.h
├── math
│ ├── CSampleFromVoxels.h
│ ├── DitherLUT.h
│ ├── HDDA.h
│ ├── Math.h
│ ├── Ray.h
│ ├── SampleFromVoxels.h
│ └── Stencils.h
├── NanoVDB.h
├── NodeManager.h
├── PNanoVDB.h
├── Readme.md
├── tools
│ ├── CreateNanoGrid.h
│ ├── CreatePrimitives.h
│ ├── cuda
│ │ ├── AddBlindData.cuh
│ │ ├── GridChecksum.cuh
│ │ ├── GridStats.cuh
│ │ ├── GridValidator.cuh
│ │ ├── IndexToGrid.cuh
│ │ ├── PointsToGrid.cuh
│ │ └── SignedFloodFill.cuh
│ ├── GridBuilder.h
│ ├── GridChecksum.h
│ ├── GridStats.h
│ ├── GridValidator.h
│ └── NanoToOpenVDB.h
├── unittest
│ ├── CMakeLists.txt
│ ├── pnanovdb_validate_strides.h
@@ -139,25 +115,21 @@ $ tree
└── util
├── CpuTimer.h
├── CreateNanoGrid.h
├── CSampleFromVoxels.h
├── cuda
│ ├── CudaAddBlindData.cuh
│ ├── CudaDeviceBuffer.h
│ ├── CudaGridChecksum.cuh
│ ├── CudaGridHandle.cuh
│ ├── CudaGridStats.cuh
│ ├── CudaGridValidator.cuh
│ ├── CudaIndexToGrid.cuh
│ ├── CudaNodeManager.cuh
│ ├── CudaPointsToGrid.cuh
│ ├── CudaSignedFloodFill.cuh
│ ├── CudaUtils.h
│ ├── GpuTimer.h
│ ├── Timer.h
│ └── Util.h
│ └── GpuTimer.cuh
├── DitherLUT.h
├── ForEach.h
├── GridBuilder.h
├── GridChecksum.h
├── GridHandle.h
├── GridStats.h
├── GridValidator.h
├── HDDA.h
@@ -173,7 +145,5 @@ $ tree
├── Ray.h
├── Reduce.h
├── SampleFromVoxels.h
├── Stencils.h
├── Timer.h
└── Util.h
└── Stencils.h
```
-67
View File
@@ -1,67 +0,0 @@
# TEACHME
This directory contains interactive lesson documents designed to be loaded by
an LLM coding agent (Claude Code, Cursor, or similar) to teach a user NanoVDB
interactively.
The lesson teaches how to *use* NanoVDB to read, build, transform, and render
sparse volumetric data on CPU and GPU. It is a single self-contained markdown
file the agent reads at the start of a session.
## Getting started
The easiest way to use this lesson is with [Claude Code](https://docs.anthropic.com/en/docs/claude-code)
(CLI or IDE extension) from the root of an OpenVDB checkout. The agent can
read the lesson files *and* the NanoVDB source code, so it can verify API
details and help you debug exercises in real time.
**Example prompts:**
To learn how to use NanoVDB:
```
Read doc/nanovdb/TEACHME/nanovdb_user_lesson.md and teach me how to use NanoVDB.
```
You can also give the agent context about your background so it can tailor
the lesson:
```
Read doc/nanovdb/TEACHME/nanovdb_user_lesson.md and teach me NanoVDB. I have
C++ and CUDA experience but I've never used OpenVDB or any sparse 3D data
structure before.
```
Keep the matching cheatsheet (`*_cheatsheet.md`) open in your editor while
working through exercises — it's a quick reference for the APIs and
invariants covered in the lesson.
## How it works
The lesson is a self-contained markdown file that serves as both a
curriculum and an instructor prompt. The LLM acts as an interactive
instructor: teaching concepts module by module, quizzing the student, and
adapting to their responses.
The lesson includes:
- Teacher instructions (persona, pacing, scope)
- Module-by-module curriculum with embedded concepts and code examples
- Quiz questions and an answer key
- Exercises with progressive difficulty
- A capstone project
- A reference table at the end
## Available lessons
| Lesson | Cheat sheet | Covers |
|---|---|---|
| [nanovdb_user_lesson.md](nanovdb_user_lesson.md) | [nanovdb_user_cheatsheet.md](nanovdb_user_cheatsheet.md) | Reading `.nvdb` files, `ReadAccessor`, `NodeManager`, math + sampling, HDDA ray-march, GPU kernels with `Grid`, GPU topology builders (`PointsToGrid`, `MeshToGrid`, `DilateGrid`, etc.), `IndexGrid` + `VoxelBlockManager`, OpenVDB ↔ NanoVDB conversion |
## Not covered
- The OpenVDB side (the dynamic, mutable tree used at film/sim time) — this
lesson treats OpenVDB only at the conversion boundary.
- Houdini / Maya integration — outside the scope.
- Gaussian splatting and fVDB-specific topics — see the fVDB repo's own
TEACHME at <https://github.com/openvdb/fvdb-core/tree/main/docs/TEACHME>.
-6
View File
@@ -1,6 +0,0 @@
# Build + editor + render artifacts (not source)
build/
compile_commands.json
.clangd
*.ppm
sphere.png
@@ -1,27 +0,0 @@
cmake_minimum_required(VERSION 3.20)
project(nanovdb_capstone LANGUAGES CXX CUDA)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CUDA_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # emit build/compile_commands.json
if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
set(CMAKE_CUDA_ARCHITECTURES 89) # RTX 6000 Ada; override with -DCMAKE_CUDA_ARCHITECTURES=...
endif()
# NanoVDB headers pull in CUDA lambdas / relaxed-constexpr paths.
string(APPEND CMAKE_CUDA_FLAGS " --extended-lambda --expt-relaxed-constexpr")
# This file is at doc/nanovdb/TEACHME/capstone/CMakeLists.txt; the NanoVDB
# include root (the dir containing the nanovdb/ header subdir) is the repo's
# `nanovdb/` subdir — repo root is four dirs up.
get_filename_component(_teachme "${CMAKE_CURRENT_SOURCE_DIR}" DIRECTORY) # TEACHME
get_filename_component(_docnv "${_teachme}" DIRECTORY) # doc/nanovdb
get_filename_component(_doc "${_docnv}" DIRECTORY) # doc
get_filename_component(REPO_ROOT "${_doc}" DIRECTORY) # repo root
set(NANOVDB_INCLUDE_ROOT "${REPO_ROOT}/nanovdb")
message(STATUS "NanoVDB include root: ${NANOVDB_INCLUDE_ROOT}")
add_executable(raymarch raymarch.cu)
target_include_directories(raymarch PRIVATE "${NANOVDB_INCLUDE_ROOT}")
# Binary lands in the build dir (conventional). raymarch writes sphere.ppm to
# the current working directory, so run it from wherever you want the output.
-39
View File
@@ -1,39 +0,0 @@
#!/usr/bin/env python3
"""Convert a binary P6 PPM to PNG using only the Python standard library
(the container has no ImageMagick / PIL). Usage: python3 ppm2png.py in.ppm out.png"""
import sys, struct, zlib, binascii
def main(src, dst):
data = open(src, "rb").read()
i = 0
def tok(i):
n = len(data)
while i < n and data[i] in b" \t\n\r": i += 1
s = i
while i < n and data[i] not in b" \t\n\r": i += 1
if s == i: raise ValueError("truncated or non-binary PPM")
return data[s:i], i
magic, i = tok(i)
assert magic == b"P6", "not a binary PPM"
w, i = tok(i); h, i = tok(i); mx, i = tok(i)
i += 1 # single whitespace after maxval
W, H = int(w), int(h)
px = data[i:i + W * H * 3]
def chunk(typ, payload):
return (struct.pack(">I", len(payload)) + typ + payload +
struct.pack(">I", binascii.crc32(typ + payload) & 0xffffffff))
raw = bytearray()
for y in range(H):
raw.append(0) # filter: none
raw += px[y * W * 3:(y + 1) * W * 3]
png = (b"\x89PNG\r\n\x1a\n"
+ chunk(b"IHDR", struct.pack(">IIBBBBB", W, H, 8, 2, 0, 0, 0))
+ chunk(b"IDAT", zlib.compress(bytes(raw), 9))
+ chunk(b"IEND", b""))
open(dst, "wb").write(png)
print(f"wrote {dst} ({W}x{H})")
if __name__ == "__main__":
main(sys.argv[1], sys.argv[2])
-111
View File
@@ -1,111 +0,0 @@
// Capstone scaffold: GPU level-set ray-march renderer.
//
// The host plumbing is DONE (build SDF, upload to device, launch, read back,
// write PPM) and the light direction + ambient level are handed to the kernel
// as parameters. Your job is the kernel body — the per-pixel ray-march + shade.
// As shipped it compiles and runs but only writes a placeholder gradient.
//
// Build: cmake -S . -B build && cmake --build build
// Run: ./build/raymarch [ambient] [lx ly lz] (writes sphere.ppm)
// View: python3 ppm2png.py sphere.ppm sphere.png (then open sphere.png)
#include <nanovdb/NanoVDB.h>
#include <nanovdb/tools/CreatePrimitives.h>
#include <nanovdb/cuda/DeviceBuffer.h>
#include <nanovdb/cuda/GridHandle.cuh>
#include <nanovdb/math/Ray.h>
#include <nanovdb/math/HDDA.h> // nanovdb::math::ZeroCrossing
#include <nanovdb/math/Stencils.h> // nanovdb::math::GradStencil
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
using GridT = nanovdb::NanoGrid<float>;
__global__ void render(const GridT* grid, unsigned char* img, int W, int H,
nanovdb::Vec3f lightDir, float ambient)
{
const int x = blockIdx.x * blockDim.x + threadIdx.x;
const int y = blockIdx.y * blockDim.y + threadIdx.y;
if (x >= W || y >= H) return;
const int pid = (y * W + x) * 3;
// ===================== YOUR WORK STARTS HERE =====================
// Placeholder so it compiles & runs: a horizontal grey gradient.
unsigned char shade = (unsigned char)(255.f * x / W);
// The aesthetic inputs are given to you as parameters: `lightDir` and
// `ambient` (set in main, overridable on the command line). You write the
// ray-march and the shading math. Signatures are in the cheat sheet.
//
// 1. Camera ray (WORLD space). Pinhole: an eye point and, per pixel, a
// direction through the image plane. You decide the math — remember
// aspect ratio and that image y grows downward. Wrap it in a Ray.
//
// 2. The SDF lives in INDEX space, so convert your world ray to index
// space before you trace it. (Ray has a method for this.)
//
// 3. Find where the ray first crosses the surface (the SDF sign change).
// Module 5 gave you a helper in math/HDDA.h that drives an HDDA and
// reports the hit voxel, the value, and the ray parameter.
//
// 4. On a hit, the surface normal is the (normalized) SDF gradient at the
// hit voxel. Module 5's gradient stencil computes it. (Watch its
// template parameter.)
//
// 5. Shade: a Lambertian intensity from the normal and the provided
// `lightDir`, lifted off the floor by `ambient`; write it as greyscale.
// On a MISS, leave the background.
// ====================== YOUR WORK ENDS HERE ======================
img[pid] = shade; img[pid + 1] = shade; img[pid + 2] = shade;
}
int main(int argc, char** argv)
{
// Shading parameters passed into the kernel. Defaults, overridable on the
// command line: ./raymarch [ambient] [lx ly lz]
float ambient = 0.15f;
nanovdb::Vec3f lightDir(-0.577f, 0.577f, -0.577f); // (-1,1,-1) normalized
if (argc >= 2) ambient = (float)std::atof(argv[1]);
if (argc >= 5) lightDir = nanovdb::Vec3f((float)std::atof(argv[2]),
(float)std::atof(argv[3]),
(float)std::atof(argv[4]));
lightDir.normalize();
// Build a level-set sphere SDF on the host (radius 100, voxel size 1).
auto handle = nanovdb::tools::createLevelSetSphere<float>(
/*radius=*/100.0, /*center=*/nanovdb::Vec3d(0.0),
/*voxelSize=*/1.0, /*halfWidth=*/3.0);
// Move to the device. copy<DeviceBuffer>() fills the HOST side of the dual
// buffer; deviceUpload() pushes it to the GPU — skip it and deviceGrid()
// returns nullptr.
auto devHandle = handle.copy<nanovdb::cuda::DeviceBuffer>();
devHandle.deviceUpload();
const GridT* dGrid = devHandle.deviceGrid<float>();
if (!dGrid) { std::printf("no device grid\n"); return 1; }
const int W = 512, H = 512;
unsigned char* dImg = nullptr;
cudaMalloc(&dImg, size_t(W) * H * 3);
const dim3 block(16, 16), gridDim((W + 15) / 16, (H + 15) / 16);
render<<<gridDim, block>>>(dGrid, dImg, W, H, lightDir, ambient);
cudaDeviceSynchronize();
if (auto e = cudaGetLastError(); e != cudaSuccess) {
std::printf("CUDA error: %s\n", cudaGetErrorString(e));
return 1;
}
std::vector<unsigned char> img(size_t(W) * H * 3);
cudaMemcpy(img.data(), dImg, img.size(), cudaMemcpyDeviceToHost);
cudaFree(dImg);
FILE* f = std::fopen("sphere.ppm", "wb");
std::fprintf(f, "P6\n%d %d\n255\n", W, H);
std::fwrite(img.data(), 1, img.size(), f);
std::fclose(f);
std::printf("wrote sphere.ppm (%dx%d)\n", W, H);
return 0;
}
@@ -1,105 +0,0 @@
// Capstone: GPU level-set ray-march renderer.
// Build an SDF sphere -> move to device -> one thread per pixel ->
// ZeroCrossing to find the surface -> Lambertian shade via SDF gradient
// normal -> write PPM.
#include <nanovdb/NanoVDB.h>
#include <nanovdb/tools/CreatePrimitives.h>
#include <nanovdb/cuda/DeviceBuffer.h>
#include <nanovdb/cuda/GridHandle.cuh>
#include <nanovdb/math/Ray.h>
#include <nanovdb/math/HDDA.h> // ZeroCrossing lives here
#include <nanovdb/math/Stencils.h> // GradStencil
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
using GridT = nanovdb::NanoGrid<float>;
__global__ void render(const GridT* grid, unsigned char* img, int W, int H,
nanovdb::Vec3f lightDir, float ambient)
{
const int x = blockIdx.x * blockDim.x + threadIdx.x;
const int y = blockIdx.y * blockDim.y + threadIdx.y;
if (x >= W || y >= H) return;
const int pid = (y * W + x) * 3;
// --- pinhole camera in WORLD space ---
const nanovdb::Vec3f eye(0.f, 0.f, -300.f);
const float aspect = float(W) / float(H);
const float tanHalfFov = tanf(0.5f * 45.f * 3.14159265f / 180.f);
const float u = (2.f * ((x + 0.5f) / W) - 1.f) * tanHalfFov * aspect;
const float v = (1.f - 2.f * ((y + 0.5f) / H)) * tanHalfFov; // flip y
nanovdb::Vec3f dir(u, v, 1.f);
dir.normalize();
nanovdb::math::Ray<float> wRay(eye, dir);
auto iRay = wRay.worldToIndexF(*grid); // ray in index space
auto acc = grid->getAccessor();
nanovdb::Coord ijk;
float t = 0.f, val = 0.f;
unsigned char shade = 0; // background (black)
if (nanovdb::math::ZeroCrossing(iRay, acc, ijk, val, t)) {
nanovdb::math::GradStencil<GridT> stencil(*grid);
stencil.moveTo(ijk);
nanovdb::Vec3f n = stencil.gradient(); // SDF gradient = outward normal
n.normalize();
const float diff = fmaxf(0.f, n.dot(lightDir));
const float I = fminf(1.f, ambient + (1.f - ambient) * diff);
shade = (unsigned char)(255.f * I); // greyscale
}
img[pid] = shade; img[pid + 1] = shade; img[pid + 2] = shade;
}
int main(int argc, char** argv)
{
// Shading parameters (passed into the kernel). Defaults, overridable on the
// command line: ./raymarch [ambient] [lx ly lz]
float ambient = 0.15f;
nanovdb::Vec3f lightDir(-0.577f, 0.577f, -0.577f); // (-1,1,-1) normalized
if (argc >= 2) ambient = (float)std::atof(argv[1]);
if (argc >= 5) lightDir = nanovdb::Vec3f((float)std::atof(argv[2]),
(float)std::atof(argv[3]),
(float)std::atof(argv[4]));
lightDir.normalize();
// 1. Build a level-set sphere SDF on the host (radius 100, voxel size 1).
auto handle = nanovdb::tools::createLevelSetSphere<float>(
/*radius=*/100.0, /*center=*/nanovdb::Vec3d(0.0),
/*voxelSize=*/1.0, /*halfWidth=*/3.0);
// 2. Move it to the device. copy<DeviceBuffer>() fills the HOST side of the
// dual buffer; deviceUpload() pushes the bytes to the device. Only then
// is deviceGrid() non-null.
auto devHandle = handle.copy<nanovdb::cuda::DeviceBuffer>();
devHandle.deviceUpload();
const GridT* dGrid = devHandle.deviceGrid<float>();
if (!dGrid) { std::printf("no device grid\n"); return 1; }
// 3. Render.
const int W = 512, H = 512;
unsigned char* dImg = nullptr;
cudaMalloc(&dImg, size_t(W) * H * 3);
const dim3 block(16, 16), grid((W + 15) / 16, (H + 15) / 16);
render<<<grid, block>>>(dGrid, dImg, W, H, lightDir, ambient);
cudaDeviceSynchronize();
if (auto e = cudaGetLastError(); e != cudaSuccess) {
std::printf("CUDA error: %s\n", cudaGetErrorString(e));
return 1;
}
// 4. Copy back and write PPM.
std::vector<unsigned char> img(size_t(W) * H * 3);
cudaMemcpy(img.data(), dImg, img.size(), cudaMemcpyDeviceToHost);
cudaFree(dImg);
FILE* f = std::fopen("sphere.ppm", "wb");
std::fprintf(f, "P6\n%d %d\n255\n", W, H);
std::fwrite(img.data(), 1, img.size(), f);
std::fclose(f);
std::printf("wrote sphere.ppm (%dx%d)\n", W, H);
return 0;
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

@@ -1,592 +0,0 @@
# NanoVDB User Cheat Sheet
A one-page reference for the APIs covered in `nanovdb_user_lesson.md`. Keep
this open while working through exercises.
---
## In one paragraph
NanoVDB is a single-header, read-only, GPU-friendly sparse 3D data
structure. The whole grid (one or more) lives in one contiguous,
32-byte-aligned byte buffer. `cudaMemcpy` it to the device and it works
as-is. Topology is *frozen* after construction; values can change, the set
of active voxels cannot. Every primitive is `__hostdev__` (callable from
both host and device with identical code).
---
## Includes & CMake
```cpp openvdb
#include <nanovdb/NanoVDB.h> // grid, accessor, math
#include <nanovdb/GridHandle.h> // owns the buffer
#include <nanovdb/HostBuffer.h> // CPU allocator
#include <nanovdb/NodeManager.h> // sequential iteration
#include <nanovdb/io/IO.h> // file IO
#include <nanovdb/math/HDDA.h> // ray-march
#include <nanovdb/math/SampleFromVoxels.h> // sampling
// GPU
#include <nanovdb/cuda/DeviceBuffer.h>
#include <nanovdb/cuda/GridHandle.cuh>
#include <nanovdb/cuda/NodeManager.cuh>
// Builders & operators (GPU)
#include <nanovdb/tools/cuda/PointsToGrid.cuh>
#include <nanovdb/tools/cuda/MeshToGrid.cuh>
#include <nanovdb/tools/cuda/DilateGrid.cuh>
#include <nanovdb/tools/cuda/CoarsenGrid.cuh>
#include <nanovdb/tools/cuda/RefineGrid.cuh>
#include <nanovdb/tools/cuda/PruneGrid.cuh>
#include <nanovdb/tools/cuda/MergeGrids.cuh>
#include <nanovdb/tools/cuda/SignedFloodFill.cuh>
// CPU builders & primitives
#include <nanovdb/tools/GridBuilder.h>
#include <nanovdb/tools/CreatePrimitives.h>
// IndexGrid / VBM
#include <nanovdb/tools/VoxelBlockManager.h>
#include <nanovdb/tools/cuda/VoxelBlockManager.cuh>
// Stats, validation, blind data
#include <nanovdb/tools/GridStats.h>
#include <nanovdb/tools/GridChecksum.h>
#include <nanovdb/tools/GridValidator.h>
#include <nanovdb/tools/cuda/AddBlindData.cuh>
// OpenVDB bridge (gated behind NANOVDB_USE_OPENVDB)
#include <nanovdb/tools/CreateNanoGrid.h>
#include <nanovdb/tools/NanoToOpenVDB.h>
```
```cmake
find_package(nanovdb CONFIG REQUIRED)
target_link_libraries(my_app PRIVATE nanovdb::nanovdb)
```
---
## Build types (`NanoGrid<T>`)
| `T` | Stored per voxel |
|-------------------|-------------------------------------------|
| `float`, `double` | Scalar (SDF, density) |
| `int32_t`, `int64_t` | Integer |
| `Vec3f`, `Vec3d` | 3-vector (velocity, color) |
| `bool` | Active state only |
| `ValueIndex` | Sequential index over all voxels |
| `ValueOnIndex` | Sequential index over **active** voxels |
| `ValueMask` | Topology only (no per-voxel values) |
| `Half` | 16-bit float |
| `Fp4`/`Fp8`/`Fp16`/`FpN` | Quantized float (4/8/16 bits) |
| `Point` | Point counts (for point grids) |
---
## File IO
```cpp
namespace io = nanovdb::io;
auto h = io::readGrid("file.nvdb"); // first grid
auto h2 = io::readGrid("file.nvdb", 2); // grid #2 (0-based)
auto hN = io::readGrid("file.nvdb", "density"); // by name
auto hAll = io::readGrid("file.nvdb", -1); // all → one handle
auto v = io::readGrids("file.nvdb"); // vector<handle>, one per segment
io::writeGrid("out.nvdb", h); // single
io::writeGrid("out.nvdb", h, io::Codec::BLOSC); // compressed
io::writeGrids("out.nvdb", handles); // many
```
---
## Inspecting a grid
```cpp
const auto* grid = handle.grid<float>(); // nullptr if T mismatch
if (!grid) throw std::runtime_error("type mismatch");
grid->gridName(); // const char*
grid->gridClass(); // GridClass enum (LevelSet, FogVolume, etc.)
grid->gridType(); // GridType enum (Float, Vec3f, OnIndex, ...)
grid->voxelSize(); // Vec3d
grid->activeVoxelCount(); // uint64_t
grid->indexBBox(); // CoordBBox
grid->worldBBox(); // BBox<Vec3d>
grid->tree().background(); // T
grid->worldToIndex(p); // Vec3<T>, p is world-space
grid->indexToWorld(p); // Vec3<T>, p is index-space (fractional)
```
---
## Random access (ReadAccessor)
```cpp
// One accessor per thread; not thread-safe; never copy between CPU & GPU
auto acc = grid->getAccessor();
float v = acc.getValue(nanovdb::Coord(1, 2, 3));
bool on = acc.isActive(nanovdb::Coord(1, 2, 3));
const auto* leaf = acc.getNode<nanovdb::NanoLeaf<float>>(); // cached leaf ptr, if needed
// probe* = value/state/leaf-existence in ONE descent (disambiguates the
// two "got background" cases: inactive-vs-no-node)
float pv;
bool active = acc.probeValue(nanovdb::Coord(1,2,3), pv); // pv set; ret = state
const nanovdb::NanoLeaf<float>* lf = acc.probeLeaf(nanovdb::Coord(1,2,3)); // nullptr if no leaf
```
---
## Sequential access (NodeManager)
```cpp
#include <nanovdb/NodeManager.h>
auto nmh = nanovdb::createNodeManager(*grid);
const auto* mgr = nmh.mgr<float>();
auto leafN = mgr->leafCount();
auto lowerN = mgr->lowerCount();
auto upperN = mgr->upperCount();
for (uint64_t i = 0; i < leafN; ++i) {
const auto& leaf = mgr->leaf(i);
for (auto it = leaf.beginValueOn(); it; ++it) {
float v = *it;
auto c = it.getCoord();
}
}
```
GPU. Pass the device-side `NodeManager*` to the kernel and index leaves by
block, voxels within a leaf by thread:
```cpp no-compile
#include <nanovdb/cuda/NodeManager.cuh>
auto dnmh = nanovdb::cuda::createNodeManager<float>(dGrid);
const auto* dmgr = dnmh.template deviceMgr<float>(); // device pointer
// One block per leaf; 64 threads cover the 512 voxels in each leaf.
perLeafKernel<<<dmgr->leafCount(), 64>>>(dmgr); // kernel defined just below
```
The kernel:
```cpp
__global__ void perLeafKernel(const nanovdb::NodeManager<float>* mgr)
{
using LeafT = nanovdb::NanoLeaf<float>;
const uint32_t leafIdx = blockIdx.x;
if (leafIdx >= mgr->leafCount()) return;
const LeafT& leaf = mgr->leaf(leafIdx);
// 512 voxels per leaf (LeafT::SIZE == 1<<3*LOG2DIM == 8^3).
for (uint32_t n = threadIdx.x; n < LeafT::SIZE; n += blockDim.x) {
if (!leaf.isActive(n)) continue;
float v = leaf.getValue(n);
nanovdb::Coord c = leaf.offsetToGlobalCoord(n);
// ... do something with (v, c)
}
}
```
Same methods exist on `lower(i)` and `upper(i)` (internal nodes) — you'll
mostly want `leaf(i)` since that's where actual voxel values live.
Indexed leaf-voxel API (callable from `__hostdev__` code):
| Call | Returns |
|-------------------------------|-------------------------------------------|
| `leaf.getValue(n)` | voxel value at offset `n` (0..511) |
| `leaf.isActive(n)` | active state at offset `n` |
| `leaf.offsetToGlobalCoord(n)` | the global `Coord` for offset `n` |
| `leaf.origin()` | the leaf's `(8,8,8)`-aligned origin Coord |
| `LeafT::SIZE` | `512`, voxels per leaf |
---
## Math primitives (all `__hostdev__`)
```cpp
nanovdb::Coord c(1, 2, 3);
auto c2 = nanovdb::Coord::Floor(nanovdb::Vec3f(1.7f, 2.1f, 3.9f)); // (1, 2, 3)
nanovdb::Vec3f v(1, 2, 3);
auto d = v.dot(v); // 14
auto n = v.length(); // sqrt(14)
auto u = v.normalize();
nanovdb::math::BBox<nanovdb::Vec3f> b(nanovdb::Vec3f(0,0,0),
nanovdb::Vec3f(10,10,10));
b.expand(nanovdb::Vec3f(5,5,5));
b.isInside(nanovdb::Vec3f(1,1,1));
```
---
## Sampling
```cpp
#include <nanovdb/math/SampleFromVoxels.h>
auto acc = grid->getAccessor();
auto sampler = nanovdb::math::createSampler<1>(acc); // 0=nearest, 1=trilinear, 2=triquadratic, 3=tricubic
auto idxPt = grid->worldToIndex(worldPt);
float v = sampler(idxPt);
```
---
## HDDA ray-march
```cpp
#include <nanovdb/math/Ray.h>
#include <nanovdb/math/HDDA.h>
auto acc = grid->getAccessor();
nanovdb::math::Ray<float> wRay({0,0,-5}, {0,0,1});
auto iRay = wRay.worldToIndexF(*grid);
// High-level: ZeroCrossing drives an HDDA and stops at the first sign change.
nanovdb::Coord ijk;
float v, t;
if (nanovdb::math::ZeroCrossing(iRay, acc, ijk, v, t)) { /* hit at ijk */ }
// Low-level: HDDA ctor takes the ray AND the start dimension from getDim.
nanovdb::Coord start(0, 0, 0);
nanovdb::math::HDDA<decltype(iRay), nanovdb::Coord> hdda(iRay, acc.getDim(start, iRay));
while (hdda.step()) {
if (acc.isActive(hdda.voxel())) break; // first active voxel
}
```
---
## GPU: transfer + kernel
```cpp
#include <nanovdb/cuda/DeviceBuffer.h>
#include <nanovdb/cuda/GridHandle.cuh>
auto devH = hostH.copy<nanovdb::cuda::DeviceBuffer>();
devH.deviceUpload(); // REQUIRED: push to device, else deviceGrid()==nullptr
const auto* dGrid = devH.deviceGrid<float>();
__global__ void k(const nanovdb::NanoGrid<float>* g,
const nanovdb::Coord* coords, float* out, int N) {
int tid = blockIdx.x * blockDim.x + threadIdx.x;
if (tid >= N) return;
auto acc = g->getAccessor();
out[tid] = acc.getValue(coords[tid]);
}
k<<<(N+127)/128, 128>>>(dGrid, dCoords, dOut, N);
```
---
## GPU builders
```cpp
// Points → grid (builder-pattern class, not a free function)
nanovdb::tools::cuda::PointsToGrid<nanovdb::Point> p2g(/*voxelSize=*/0.05);
auto ptsH = p2g.getHandle(dPoints, nPts);
const auto* ptsGrid = ptsH.deviceGrid<nanovdb::Point>();
// Mesh → OnIndexGrid (narrow-band). Verts are Vec3f, triangles Vec3i.
const nanovdb::Vec3f* dVerts; size_t vertN;
const nanovdb::Vec3i* dTris; size_t triN;
nanovdb::tools::cuda::MeshToGrid<nanovdb::ValueOnIndex> m2g(
dVerts, vertN, dTris, triN, nanovdb::Map(voxelSize));
m2g.setNarrowBandWidth(3.f);
auto meshH = m2g.getHandle();
const auto* meshGrid = meshH.deviceGrid<nanovdb::ValueOnIndex>();
// MeshToGrid + per-active-voxel UDF sidecar
auto [gridH, udfBuf] = m2g.getHandleAndUDF();
```
## CPU builder
```cpp
// Build a tree on the host, then bake into a packed NanoVDB grid.
nanovdb::tools::build::Grid<float> g(/*background=*/0.0f,
"my_grid", nanovdb::GridClass::FogVolume);
g.setTransform(/*scale=*/0.1); // voxel size
auto acc = g.getAccessor(); // not thread-safe
acc.setValue(nanovdb::Coord(0, 0, 0), 1.0f);
auto h = nanovdb::tools::createNanoGrid(g); // GridHandle<HostBuffer>
```
## Primitive helpers
```cpp
auto h = nanovdb::tools::createLevelSetSphere<float>(
/*radius=*/10.0, /*center=*/{0,0,0}, /*voxelSize=*/0.1);
// also: createLevelSetTorus, createLevelSetBox, createFogVolumeSphere, ...
```
---
## Topological operators (GPU)
```cpp
// Builder classes (NOT free functions); ValueOnIndex grids only. Construct
// from a device grid pointer, getHandle() returns a new GridHandle.
using OnIdx = nanovdb::ValueOnIndex;
auto* g = devH.deviceGrid<OnIdx>();
auto dilatedH = nanovdb::tools::cuda::DilateGrid<OnIdx>(g).getHandle();
auto coarseH = nanovdb::tools::cuda::CoarsenGrid<OnIdx>(g).getHandle();
auto fineH = nanovdb::tools::cuda::RefineGrid<OnIdx>(g).getHandle();
const nanovdb::Mask<3>* leafMask = nullptr; // PruneGrid needs a per-leaf mask
auto prunedH = nanovdb::tools::cuda::PruneGrid<OnIdx>(g, leafMask).getHandle();
auto mergedH = nanovdb::tools::cuda::MergeGrids<OnIdx>(g, g).getHandle();
// signedFloodFill is the exception: a free function, in place, on a scalar
// SDF grid (not OnIndex).
nanovdb::tools::cuda::signedFloodFill(devH.deviceGrid<float>());
```
CPU morphology equivalents live under `nanovdb/util/MorphologyHelpers.h`.
## Re-home sidecar data after a topology change (Injection.cuh)
A topology op renumbers the active-voxel indices, so the old sidecar no
longer matches. Move values across, and find the new voxels:
```cpp
#include <nanovdb/util/cuda/Injection.cuh>
#include <nanovdb/util/cuda/DeviceGridTraits.cuh>
#include <nanovdb/util/cuda/Util.h>
using OnIdx = nanovdb::ValueOnIndex;
const auto* srcGrid = devH.deviceGrid<OnIdx>(); // old grid
const auto* dstGrid = devHandle.deviceGrid<OnIdx>(); // new (e.g. dilated) grid
const float* oldSidecar = nullptr;
float* newSidecar = nullptr; // size = new activeVoxelCount(+1)
// Copy overlapping values (non-overlap dst voxels left untouched):
auto srcLeaves = nanovdb::util::cuda::DeviceGridTraits<OnIdx>::getTreeData(srcGrid).mNodeCount[0];
nanovdb::util::cuda::operatorKernel<
nanovdb::util::cuda::InjectGridDataFunctor<OnIdx, float>>
<<<srcLeaves, 256>>>(srcGrid, dstGrid, oldSidecar, newSidecar);
// Per-leaf overlap mask (new voxels = dstMask & ~overlap):
auto dstLeaves = nanovdb::util::cuda::DeviceGridTraits<OnIdx>::getTreeData(dstGrid).mNodeCount[0];
auto maskBuf = nanovdb::cuda::DeviceBuffer::create(dstLeaves*sizeof(nanovdb::Mask<3>), nullptr, false);
auto* overlap = static_cast<nanovdb::Mask<3>*>(maskBuf.deviceData());
unsigned nt = 128, nb = (dstLeaves + nt - 1) / nt;
nanovdb::util::cuda::lambdaKernel<<<nb, nt>>>(dstLeaves,
nanovdb::util::cuda::InjectGridMaskFunctor<OnIdx>(), srcGrid, dstGrid, overlap);
```
Simpler: pre-fill `newSidecar` with a sentinel; slots still holding it after
the data inject are the new voxels.
---
## Stats, validation & integrity
Nodes cache bbox/min/max/avg per node. Mutating values in place leaves them
**stale** — which silently breaks HDDA space-skipping and ray-tracing.
Recompute after any manual edit.
```cpp
#include <nanovdb/tools/GridStats.h> // CPU
// #include <nanovdb/tools/cuda/GridStats.cuh> // GPU (device grid + stream)
nanovdb::NanoGrid<float>* mutableGrid = nullptr; // non-const: it gets written
nanovdb::tools::updateGridStats(mutableGrid, nanovdb::tools::StatsMode::All);
// StatsMode: Disable | BBox | MinMax | All(=Default)
// Extrema over an index-space box, computed directly (no cache):
auto ex = nanovdb::tools::getExtrema(*grid, nanovdb::CoordBBox(nanovdb::Coord(-10), nanovdb::Coord(10)));
float lo = ex.min(), hi = ex.max();
```
Certify a grid after load / build / device transfer:
```cpp
#include <nanovdb/tools/GridChecksum.h>
#include <nanovdb/tools/GridValidator.h>
nanovdb::NanoGrid<float>* mutableGrid = nullptr; // non-const: edited grid
bool good = nanovdb::tools::validateChecksum(grid, nanovdb::CheckMode::Full);
nanovdb::tools::updateChecksum(mutableGrid, nanovdb::CheckMode::Full); // after a legit edit
bool valid = nanovdb::tools::isValid(grid, nanovdb::CheckMode::Full, /*verbose=*/false);
char err[(uint32_t)nanovdb::CheckMode::StrLen] = {}; // CheckMode is scoped → cast
nanovdb::tools::checkGrid(grid, err, nanovdb::CheckMode::Full); // err="" if valid
// CheckMode: Disable/Empty | Half/Partial/Default | Full
// GPU variants: tools/cuda/GridChecksum.cuh, tools/cuda/GridValidator.cuh
```
---
## IndexGrid & VBM
```cpp no-compile
// Build a ValueOnIndex grid from an OpenVDB grid
auto h = nanovdb::tools::createNanoGrid<openvdb::FloatGrid,
nanovdb::ValueOnIndex>(*ovGrid);
// Or from a mesh on the GPU (already returns OnIndexGrid)
nanovdb::tools::cuda::MeshToGrid<nanovdb::ValueOnIndex> mesher(dV, vN, dT, tN, nanovdb::Map(vs));
auto devH = mesher.getHandle();
const auto* g = devH.deviceGrid<nanovdb::ValueOnIndex>();
// External attribute array — same length as active voxel count
size_t N = g->activeVoxelCount();
thrust::device_vector<float> attr(N);
// Read attribute at a coordinate
auto acc = g->getAccessor();
uint64_t idx = acc.getValue(c); // index into attr
float a = attr[idx];
// VBM: SIMT-friendly block iteration (Log2BlockWidth >= 6, i.e. >=64/block)
auto vbmH = nanovdb::tools::buildVoxelBlockManager<6>(g);
// see tools/cuda/VoxelBlockManager.cuh for the GPU decode pattern
```
ChannelAccessor — read the sidecar by attribute, not by index (one typed
call instead of getValue(ijk) → array[idx]). Note: IndexT defaults to
`ValueIndex`, so spell out `ValueOnIndex`:
```cpp
__global__ void readChan(const nanovdb::NanoGrid<nanovdb::ValueOnIndex>* g,
float* dValues, nanovdb::Coord c, float* out) {
nanovdb::ChannelAccessor<float, nanovdb::ValueOnIndex> ca(*g, dValues);
*out = ca.getValue(c); // attribute value (not the index)
// ca(c) same; ca.getIndex(c) for the raw index; ca.probeValue(c, v) for state+value
// ctor (*g, channelID) instead reads an internal blind-data channel
}
```
Bake a sidecar back into a value grid (round-trip partner of the split;
needed by value-typed tools like `signedFloodFill`):
```cpp
#include <nanovdb/tools/cuda/IndexToGrid.cuh>
const auto* idxGrid = devH.deviceGrid<nanovdb::ValueOnIndex>();
const float* dValues = nullptr; // per-active-voxel sidecar
auto floatH = nanovdb::tools::cuda::indexToGrid<float>(idxGrid, dValues);
const auto* floatGrid = floatH.deviceGrid<float>(); // values now in-grid
```
---
## OpenVDB ↔ NanoVDB
```cpp openvdb
#include <nanovdb/tools/CreateNanoGrid.h>
#include <nanovdb/tools/NanoToOpenVDB.h>
// OpenVDB → NanoVDB (optionally with type change)
auto h = nanovdb::tools::createNanoGrid<openvdb::FloatGrid, float>(*ovGrid);
auto h_half = nanovdb::tools::createNanoGrid<openvdb::FloatGrid,
nanovdb::Half>(*ovGrid);
// NanoVDB → OpenVDB
auto ovGrid = nanovdb::tools::nanoToOpenVDB<float>(handle);
```
---
## Blind data (attached arrays)
Read (host or device — `__hostdev__`):
```cpp
uint32_t n = grid->blindDataCount();
const nanovdb::GridBlindMetaData& meta = grid->blindMetaData(0);
// meta.mValueCount, mValueSize, mDataType, mSemantic, mDataClass, mName
int id = grid->findBlindDataForSemantic(nanovdb::GridBlindDataSemantic::PointPosition);
// or: int id = grid->findBlindData("name");
const nanovdb::Vec3f* pos = grid->getBlindData<nanovdb::Vec3f>(id); // nullptr if T mismatch
```
Attach on the GPU (returns a NEW handle with the array appended; fixes the
checksum):
```cpp
#include <nanovdb/tools/cuda/AddBlindData.cuh>
const float* dChannel = nullptr; uint64_t valueCount = 0;
auto h = nanovdb::tools::cuda::addBlindData(
dGrid, dChannel, valueCount,
nanovdb::GridBlindDataClass::ChannelArray,
nanovdb::GridBlindDataSemantic::Unknown, "my_channel");
const auto* g = h.deviceGrid<float>();
```
---
## Common idioms
```cpp
// Iterate active voxels in a grid (CPU, leaf-by-leaf)
auto nmh = nanovdb::createNodeManager(*grid);
auto* mgr = nmh.mgr<float>();
for (uint64_t L = 0; L < mgr->leafCount(); ++L) {
const auto& leaf = mgr->leaf(L);
for (auto it = leaf.beginValueOn(); it; ++it) {
// *it is the value, it.getCoord() is the ijk
}
}
// Sample a grid at a list of world-space points (pts is a std::vector<Vec3f>)
auto sampler = nanovdb::math::createSampler<1>(acc);
std::vector<float> sampled;
for (const auto& w : pts)
sampled.push_back(sampler(grid->worldToIndex(w)));
// Save a level-set sphere to disk
auto h = nanovdb::tools::createLevelSetSphere<float>(10.0, {0,0,0}, 0.1);
nanovdb::io::writeGrid("sphere.nvdb", h);
```
---
## Pitfalls
- **Type mismatch returns nullptr.** Always check `handle.grid<T>()`.
- **Accessors are not thread-safe.** One per thread/warp.
- **Accessors don't cross CPU/GPU.** Build inside the kernel.
- **Topology is frozen.** To "add a voxel" you must rebuild the grid.
- **32-byte alignment.** Don't allocate the buffer yourself with
`new char[N]` — use `HostBuffer` or `DeviceBuffer`, which guarantee
alignment.
- **No runtime `std::` in `__hostdev__` code.** Containers, iostreams,
allocators, `std::sort` etc. won't work on device. For type traits and
compile-time helpers, NanoVDB uses its own `nanovdb::util::is_same` /
`util::enable_if` / `util::conditional` / `util::remove_const` (in
`util/Util.h`) — these compile under C++11 across compilers and don't
need `--expt-relaxed-constexpr`. Where NanoVDB needs more, it pulls from
CCCL's `cuda::std::` (e.g. `cuda::std::numeric_limits` in `math/Math.h`).
Plain `std::` compile-time facilities work with relaxed constexpr but
NanoVDB's own headers avoid them for portability.
- **HDDA is essential for sparse ray-march.** Without it, you're stepping
one voxel at a time through empty space.
---
## Tools / binaries
| Tool | Purpose |
|---------------------|-------------------------------------------|
| `nanovdb_print` | Print metadata for grids in a `.nvdb` |
| `nanovdb_convert` | OpenVDB ↔ NanoVDB on the CLI |
| `nanovdb_validate` | ABI / format validation |
Run with `--help` for options.
File diff suppressed because it is too large Load Diff
-3
View File
@@ -1,3 +0,0 @@
# Transient harness outputs
gen/
build/
-87
View File
@@ -1,87 +0,0 @@
cmake_minimum_required(VERSION 3.20)
project(teachme_tests LANGUAGES CXX CUDA)
# Compile-only gate: object libraries compile each generated translation unit
# to an object file without linking. That is exactly what we want — catch API
# errors at compile time; the fixture's extern stand-ins never need to resolve.
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CUDA_STANDARD 17)
if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
set(CMAKE_CUDA_ARCHITECTURES 89) # RTX 6000 Ada; any arch suffices to compile
endif()
# NanoVDB headers pull in CUDA lambdas / relaxed-constexpr code paths.
# diag 177 = "function declared but never referenced": every wrapped block
# becomes an unreferenced static function on purpose, so silence it.
string(APPEND CMAKE_CUDA_FLAGS
" --extended-lambda --expt-relaxed-constexpr --diag-suppress 177")
# NanoVDB include root: this file is doc/nanovdb/TEACHME/test/CMakeLists.txt, so
# the repo root is four dirs up. Headers are at nanovdb/nanovdb/NanoVDB.h, so the
# include root is the repo's `nanovdb/` subdir (a sibling of `doc/`).
get_filename_component(_teachme_dir "${CMAKE_CURRENT_SOURCE_DIR}" DIRECTORY) # TEACHME
get_filename_component(_docnv_dir "${_teachme_dir}" DIRECTORY) # doc/nanovdb
get_filename_component(_doc_dir "${_docnv_dir}" DIRECTORY) # doc
get_filename_component(REPO_ROOT "${_doc_dir}" DIRECTORY) # repo root
set(NANOVDB_INCLUDE_ROOT "${REPO_ROOT}/nanovdb")
set(OPENVDB_INCLUDE_ROOT "${REPO_ROOT}/openvdb")
message(STATUS "NanoVDB include root: ${NANOVDB_INCLUDE_ROOT}")
# Generated TUs + manifest live in ${GEN_DIR} (passed in, defaults to ./gen).
if(NOT DEFINED GEN_DIR)
set(GEN_DIR "${CMAKE_CURRENT_SOURCE_DIR}/gen")
endif()
set(_manifest "${GEN_DIR}/manifest.txt")
if(NOT EXISTS "${_manifest}")
message(FATAL_ERROR "No manifest at ${_manifest}. Run the extractor first "
"(see run.sh).")
endif()
file(STRINGS "${_manifest}" _lines)
set(_core_srcs "")
set(_ovdb_srcs "")
foreach(_line IN LISTS _lines)
if(_line STREQUAL "")
continue()
endif()
separate_arguments(_parts UNIX_COMMAND "${_line}")
list(GET _parts 0 _stem)
list(GET _parts 1 _needs_ovdb)
set(_src "${GEN_DIR}/${_stem}.cu")
if(_needs_ovdb STREQUAL "1")
list(APPEND _ovdb_srcs "${_src}")
else()
list(APPEND _core_srcs "${_src}")
endif()
endforeach()
# Core (NanoVDB-only) translation units.
if(_core_srcs)
add_library(teachme_blocks OBJECT ${_core_srcs})
target_include_directories(teachme_blocks PRIVATE
"${NANOVDB_INCLUDE_ROOT}" "${GEN_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
list(LENGTH _core_srcs _n_core)
message(STATUS "teachme_blocks: ${_n_core} core TU(s)")
endif()
# OpenVDB-dependent translation units — only if OpenVDB is available.
if(_ovdb_srcs)
find_package(OpenVDB QUIET)
if(OpenVDB_FOUND)
add_library(teachme_blocks_openvdb OBJECT ${_ovdb_srcs})
target_compile_definitions(teachme_blocks_openvdb PRIVATE NANOVDB_USE_OPENVDB)
target_include_directories(teachme_blocks_openvdb PRIVATE
"${NANOVDB_INCLUDE_ROOT}" "${OPENVDB_INCLUDE_ROOT}"
"${GEN_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
target_link_libraries(teachme_blocks_openvdb PRIVATE OpenVDB::openvdb)
list(LENGTH _ovdb_srcs _n_ovdb)
message(STATUS "teachme_blocks_openvdb: ${_n_ovdb} OpenVDB TU(s)")
else()
list(LENGTH _ovdb_srcs _n_ovdb)
message(WARNING "OpenVDB not found — skipping ${_n_ovdb} OpenVDB TU(s). "
"These blocks are reference-checked but not compiled.")
endif()
endif()
-89
View File
@@ -1,89 +0,0 @@
# TEACHME test harness
Keeps the code in the lesson honest. Two gates:
1. **Reference validation** (`teachme_tests.py check-refs`) — every
`#include <...>` in a code block must resolve to a real header in the
NanoVDB tree (or be explicitly exempt). Catches stale-path rot — e.g. a
header that was renamed out from under the docs.
2. **Compilation** (`teachme_tests.py extract` + CMake) — code blocks tagged
as compilable are extracted into `.cu` translation units and compiled
(compile-only, `-c`) against the real NanoVDB headers. Catches API-shape
drift — wrong namespace, a free function that's actually a class, a
renamed method, a changed signature.
Run both with `./run.sh` from this directory.
## Why compile-only
The harness compiles (`nvcc -c`) but does not link or run. NanoVDB is
header-only and the goal is to catch *API* errors (does this call name a
real symbol with a compatible signature?), which all surface at compile
time. Skipping the link step means a fixture header can declare the
"given" symbols a fragment assumes (`grid`, `acc`, device pointers) as
`extern` globals — unresolved at link, but fully type-checked at compile.
Everything compiles as CUDA (`.cu`) because even host-only examples pull
in CUDA code paths (under `__CUDACC__`) when they include headers like
`NodeManager.h` or `io/IO.h`.
## Block tagging
Code blocks are fenced with an info string: a language followed by
whitespace-separated tags, e.g.
```cpp compile
```cpp compile-global continuation
```cpp skip-refs
**Opt-out model:** every `cpp` / `cu` block is compiled by default. A block
is wrapped in a function body unless it opens a top-level definition
(`__global__`, `template`, `struct`, `class`, `namespace`, `enum`, `using`,
`typedef`), in which case it is auto-emitted at file scope. Tags only adjust
the defaults:
| Tag | Meaning |
|----------------|------------------------------------------------------------------------------------------|
| *(none)* | Compiled. Auto: file scope if it opens a top-level definition, else function-wrapped. |
| `no-compile` | Reference-check includes only; do **not** compile. For illustrative/partial fragments. |
| `global` | Force file-scope emission (override the auto-detection). |
| `main` | Block is already a complete program (its own `main`); compile verbatim. |
| `continuation` | Append this block to the previous block's translation unit (shares its symbols). |
| `openvdb` | Block needs OpenVDB; compiled only when OpenVDB is found. |
| `skip-refs` | Do **not** validate includes in this block — for intentionally-stale counter-examples. |
A translation unit is a sequence of segments. A non-`continuation` block
starts a new TU; each following `continuation` block adds a segment. At emit
time, file-scope segments go to file scope (in order) and function segments
each get their own wrapper function — so a kernel definition followed by a
`continuation` launch line compose into one valid TU.
Every TU includes `fixture.cuh`, which pulls in the common NanoVDB headers
(a deliberately broad "kitchen-sink" set, so terse fragments compile without
restating includes) and declares the stand-in "given" symbols (`grid`,
`acc`, device pointers, etc.) as `extern`. Including the heavy `tools/cuda/*`
headers in every TU makes per-TU compilation slower; that's an accepted
trade for letting fragments stay terse. If the suite grows large, switch to
per-TU includes driven by each block's own `#include` lines.
## Coverage
`check-refs` reports how many code blocks are compile-tagged vs
reference-only, so the fraction of the lesson that is actually
compile-gated is visible (and ideally climbing).
## Exemptions
Includes that are intentionally not real are skipped by the validator:
- ellipsis placeholders such as `#include <openvdb/...>`
- any include inside a `skip-refs` block (e.g. the deprecated
`nanovdb/util/cuda/CudaDeviceBuffer.h` shown as a "this path is stale"
counter-example)
## Files
- `teachme_tests.py` — the extractor + reference validator
- `fixture.cuh` — common headers + `extern` stand-in symbols
- `CMakeLists.txt` — compiles the generated TUs
- `run.sh` — driver: check-refs → extract → cmake configure+build → report
-92
View File
@@ -1,92 +0,0 @@
// fixture.cuh — common headers + stand-in "given" symbols for TEACHME
// code-block compilation.
//
// Lesson fragments assume context: "you have a grid", "you have device
// points", etc. The harness compiles each block (compile-only, never linked)
// with this header in scope, so those assumed symbols need declarations with
// the right *types* — enough for the compiler to type-check member calls and
// catch API drift. They are declared `extern` (no definitions): a block that
// declares its own local `grid`/`acc`/etc. simply shadows the extern, and
// since we never link, the unresolved externs cost nothing.
//
// Grow this file as the tagging pass surfaces more assumed names. Keep the
// types matching how the lesson uses each symbol.
#pragma once
// ---- common headers (header guards make re-includes in blocks harmless) ----
// Core read path + IO + math + CUDA.
#include <nanovdb/NanoVDB.h>
#include <nanovdb/GridHandle.h>
#include <nanovdb/HostBuffer.h>
#include <nanovdb/NodeManager.h>
#include <nanovdb/io/IO.h>
#include <nanovdb/math/Ray.h>
#include <nanovdb/math/HDDA.h>
#include <nanovdb/math/SampleFromVoxels.h>
#include <nanovdb/math/Stencils.h>
#include <nanovdb/cuda/DeviceBuffer.h>
#include <nanovdb/cuda/GridHandle.cuh>
#include <nanovdb/cuda/NodeManager.cuh>
// Commonly-assumed "tools" headers — ambient so terse fragments compile
// without restating the include. (OpenVDB-conversion headers are NOT here;
// blocks that need them are tagged `openvdb` and include them explicitly.)
#include <nanovdb/tools/CreatePrimitives.h>
#include <nanovdb/tools/CreateNanoGrid.h>
#include <nanovdb/tools/GridBuilder.h>
#include <nanovdb/tools/VoxelBlockManager.h>
#include <nanovdb/tools/cuda/PointsToGrid.cuh>
#include <nanovdb/tools/cuda/MeshToGrid.cuh>
#include <nanovdb/tools/cuda/DilateGrid.cuh>
#include <nanovdb/tools/cuda/CoarsenGrid.cuh>
#include <nanovdb/tools/cuda/RefineGrid.cuh>
#include <nanovdb/tools/cuda/PruneGrid.cuh>
#include <nanovdb/tools/cuda/MergeGrids.cuh>
#include <nanovdb/tools/cuda/SignedFloodFill.cuh>
#include <cstdint>
#include <cstddef>
#include <cmath>
#include <string>
#include <vector>
#include <iostream>
#include <stdexcept>
// ---- stand-in "given" symbols (extern: declared, never defined) ----
// Handles
extern nanovdb::GridHandle<nanovdb::HostBuffer> handle;
extern nanovdb::GridHandle<nanovdb::HostBuffer> hostH;
extern nanovdb::GridHandle<nanovdb::cuda::DeviceBuffer> devH;
extern nanovdb::GridHandle<nanovdb::cuda::DeviceBuffer> devHandle;
extern std::vector<nanovdb::GridHandle<nanovdb::HostBuffer>> handles;
// Grids (host + device pointers into a float grid)
extern const nanovdb::NanoGrid<float>* grid;
extern const nanovdb::NanoGrid<float>* dGrid;
// A read accessor + sampler over the float grid (fragments often assume these
// already exist from a prior step).
extern nanovdb::DefaultReadAccessor<float> acc;
// Device point / coord / output buffers used by kernel launches.
// dPoints is non-const: PointsToGrid<Point> writes input points into the
// grid's blind data via getPoint<element_type>(...) = ..., which requires a
// non-const element type.
extern nanovdb::Vec3f* dPoints;
extern std::size_t nPts;
extern const nanovdb::Vec3f* dPts;
extern const nanovdb::Vec3f* worldPts;
extern const nanovdb::Coord* dCoords;
extern const nanovdb::Coord* coords;
extern float* dOut;
extern float* out;
extern int N;
// Host-side query containers + single query points
extern std::vector<nanovdb::Vec3f> pts;
extern std::vector<nanovdb::Coord> queries;
extern nanovdb::Vec3f worldPt; // a single world-space query point
extern nanovdb::Vec3f p; // generic world-space point
// Misc scalars
extern double voxelSize;
-59
View File
@@ -1,59 +0,0 @@
#!/usr/bin/env bash
# Drive the TEACHME test harness: reference-check -> extract -> compile.
#
# Usage: ./run.sh
# Exits nonzero if any reference is dangling or any compile-tagged block
# fails to compile.
set -euo pipefail
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TEACHME="$(dirname "$HERE")"
GEN="$HERE/gen"
BUILD="$HERE/build"
MD=(
"$TEACHME/nanovdb_user_lesson.md"
"$TEACHME/nanovdb_user_cheatsheet.md"
"$TEACHME/README.md"
)
echo "==> [1/3] reference check"
python3 "$HERE/teachme_tests.py" check-refs "${MD[@]}"
echo "==> [2/3] extract compile-tagged blocks"
rm -rf "$GEN"
mkdir -p "$GEN"
python3 "$HERE/teachme_tests.py" extract "${MD[@]}" --out "$GEN"
n_tu=$(find "$GEN" -name '*.cu' | wc -l | tr -d ' ')
if [ "$n_tu" -eq 0 ]; then
echo "==> [3/3] compile: no compile-tagged blocks yet — nothing to build"
echo "PASS (reference check only)"
exit 0
fi
echo "==> [3/3] compile $n_tu translation unit(s)"
mkdir -p "$BUILD"
cmake -S "$HERE" -B "$BUILD" -DGEN_DIR="$GEN" -DCMAKE_BUILD_TYPE=Release \
> "$BUILD/configure.log" 2>&1 || { cat "$BUILD/configure.log"; exit 1; }
# Cap parallelism: each TU pulls in the kitchen-sink fixture (most of NanoVDB's
# heavy headers), so nvcc is memory-hungry. Default to all cores locally; CI
# sets TEACHME_JOBS lower so the parallel nvcc processes stay within the
# runner's RAM (8 unbounded jobs OOM a 32 GB runner).
jobs="${TEACHME_JOBS:-$(nproc)}"
# Keep going (--keep-going / -k) so every failing TU is reported, not just the
# first. Capture cmake's status directly (don't pipe through tee, which would
# mask it).
set +e
cmake --build "$BUILD" --parallel "$jobs" -- -k > "$BUILD/build.log" 2>&1
status=$?
set -e
cat "$BUILD/build.log"
if [ "$status" -eq 0 ]; then
echo "PASS: all $n_tu translation unit(s) compiled"
else
echo "FAIL: one or more translation units did not compile (see above)"
exit 1
fi
-319
View File
@@ -1,319 +0,0 @@
#!/usr/bin/env python3
"""TEACHME lesson test harness: reference validation + block extraction.
Two subcommands:
check-refs <md...> Validate every #include in code blocks resolves
against the NanoVDB include root. Reports
compile-coverage. Exits nonzero on dangling refs.
extract <md...> --out <dir> Extract compile-tagged code blocks into .cu
translation units under <dir>, ready for CMake.
See README.md for the block tagging convention.
"""
import argparse
import os
import re
import sys
# Repo layout: this file is at doc/nanovdb/TEACHME/test/teachme_tests.py, so the
# repo root is four levels up. The NanoVDB include root (the dir that contains
# the `nanovdb/` header subdir) is the repo's `nanovdb/`; OpenVDB's is `openvdb/`.
HERE = os.path.dirname(os.path.abspath(__file__))
REPO_ROOT = os.path.abspath(os.path.join(HERE, "..", "..", "..", ".."))
NANOVDB_INCLUDE_ROOT = os.path.join(REPO_ROOT, "nanovdb")
OPENVDB_INCLUDE_ROOT = os.path.join(REPO_ROOT, "openvdb")
INCLUDE_ROOTS = [NANOVDB_INCLUDE_ROOT, OPENVDB_INCLUDE_ROOT]
FENCE_RE = re.compile(r"^```(\w+)?(.*)$")
INCLUDE_RE = re.compile(r'^\s*#\s*include\s*<([^>]+)>')
# Inline-code spans in prose that look like header paths, e.g.
# `nanovdb/tools/GridBuilder.h`. Used to catch stale "Read: ..." references.
PROSE_PATH_RE = re.compile(r'`((?:nanovdb|openvdb)/[\w./]+\.(?:h|cuh|cc|cpp))`')
# A line carrying this marker is exempt from prose-path checking (for
# intentionally-stale counter-examples).
STALE_OK = "teachme:stale-ok"
def resolves(inc):
"""True if an include path exists under any include root."""
return any(os.path.isfile(os.path.join(r, inc)) for r in INCLUDE_ROOTS)
# Languages whose blocks we care about.
CODE_LANGS = {"cpp", "cu", "c++"}
# Opt-OUT model: every cpp/cu block is compiled unless tagged `no-compile`.
# A line that begins a file-scope definition forces file-scope emission even
# without an explicit `global` tag.
FILE_SCOPE_RE = re.compile(r'^\s*(template\b|struct\b|class\b|namespace\b|'
r'__global__\b|enum\b|using\b|typedef\b)')
class Block:
__slots__ = ("path", "start_line", "lang", "tags", "lines")
def __init__(self, path, start_line, lang, tags):
self.path = path
self.start_line = start_line
self.lang = lang
self.tags = tags
self.lines = []
@property
def text(self):
return "".join(self.lines)
def parse_blocks(path):
"""Yield Block objects for every fenced code block in a markdown file."""
blocks = []
with open(path, encoding="utf-8") as f:
lines = f.readlines()
i = 0
in_block = None
for lineno, line in enumerate(lines, 1):
m = FENCE_RE.match(line)
if m:
if in_block is None:
lang = (m.group(1) or "").lower()
tags = set(m.group(2).split())
in_block = Block(path, lineno, lang, tags)
else:
blocks.append(in_block)
in_block = None
continue
if in_block is not None:
in_block.lines.append(line)
if in_block is not None:
sys.stderr.write(f"{path}: unterminated code fence opened at "
f"line {in_block.start_line}\n")
return blocks
def is_exempt_include(inc):
"""Includes that are intentionally not real headers."""
if "..." in inc: # ellipsis placeholder, e.g. openvdb/...
return True
return False
def scan_prose_paths(path):
"""Yield (lineno, token) for header-path references in prose inline code,
skipping lines inside fenced code blocks and lines marked stale-ok."""
with open(path, encoding="utf-8") as f:
lines = f.readlines()
in_fence = False
for lineno, line in enumerate(lines, 1):
if FENCE_RE.match(line) and line.lstrip().startswith("```"):
in_fence = not in_fence
continue
if in_fence or STALE_OK in line:
continue
for tok in PROSE_PATH_RE.findall(line):
yield lineno, tok
def cmd_check_refs(args):
code_blocks = 0
compiled_blocks = 0
dangling = [] # (path, lineno, inc, kind)
for path in args.md:
# 1) #include lines inside code blocks
for b in parse_blocks(path):
if b.lang not in CODE_LANGS:
continue
code_blocks += 1
if "no-compile" not in b.tags:
compiled_blocks += 1
if "skip-refs" in b.tags:
continue
for off, line in enumerate(b.lines):
im = INCLUDE_RE.match(line)
if not im:
continue
inc = im.group(1).strip()
if is_exempt_include(inc):
continue
if not resolves(inc):
dangling.append((path, b.start_line + 1 + off, inc, "include"))
# 2) header-path references in prose ("Read: `nanovdb/.../X.h`")
for lineno, tok in scan_prose_paths(path):
if not resolves(tok):
dangling.append((path, lineno, tok, "prose"))
if dangling:
sys.stderr.write("DANGLING REFERENCES:\n")
for path, lineno, ref, kind in dangling:
rel = os.path.relpath(path)
sys.stderr.write(f" {rel}:{lineno}: [{kind}] {ref!r} does not "
f"resolve under any include root\n")
pct = (100.0 * compiled_blocks / code_blocks) if code_blocks else 0.0
print(f"code blocks: {code_blocks} compiled: {compiled_blocks} "
f"({pct:.0f}%) no-compile: {code_blocks - compiled_blocks}")
if dangling:
print(f"FAIL: {len(dangling)} dangling reference(s)")
return 1
print("OK: all references resolve")
return 0
def split_block(block):
"""Split one block's lines into ordered (kind, lines) sub-segments.
`kind` is 'global' (file scope) or 'fn' (function body). Explicit `global`
/ `main` tags force the whole block. Otherwise we brace-walk: a top-level
definition (matched by FILE_SCOPE_RE at brace depth 0, e.g. a __global__
kernel) becomes a file-scope chunk spanning until its braces balance;
everything else at depth 0 (launches, statements) becomes a function chunk.
This lets a single block mix a kernel definition and its launch.
"""
if "global" in block.tags:
return [("global", block.lines)]
if "main" in block.tags:
return [("main", block.lines)]
segs = []
fn_buf = []
lines = block.lines
i, n = 0, len(lines)
def flush_fn():
if fn_buf:
segs.append(("fn", fn_buf[:]))
fn_buf.clear()
while i < n:
line = lines[i]
stripped = line.lstrip()
if stripped.startswith("#"): # preprocessor: neutral (hoisted later)
fn_buf.append(line)
i += 1
continue
if FILE_SCOPE_RE.match(line): # start of a top-level definition
flush_fn()
chunk = []
depth = 0
saw_brace = False
while i < n:
l = lines[i]
chunk.append(l)
i += 1
depth += l.count("{") - l.count("}")
if "{" in l:
saw_brace = True
if saw_brace and depth <= 0:
break
if not saw_brace and l.rstrip().endswith(";"):
break # brace-less decl, e.g. `using X = ...;`
segs.append(("global", chunk))
continue
fn_buf.append(line) # ordinary statement → function body
i += 1
flush_fn()
return segs if segs else [("fn", lines)]
def cmd_extract(args):
os.makedirs(args.out, exist_ok=True)
# A TU has a list of (kind, lines, line_no) sub-segments + an openvdb flag.
tus = []
current = None
for path in args.md:
for b in parse_blocks(path):
if b.lang not in CODE_LANGS:
continue
# Opt-out: compile everything except blocks tagged no-compile.
if "no-compile" in b.tags:
continue
subsegs = [(k, lines, b.start_line) for (k, lines) in split_block(b)]
cont = "continuation" in b.tags
if cont and current is not None:
current["segs"].extend(subsegs)
if "openvdb" in b.tags:
current["openvdb"] = True
else:
current = {
"segs": list(subsegs),
"openvdb": "openvdb" in b.tags,
"src": os.path.basename(path),
"line": b.start_line,
}
tus.append(current)
manifest = []
for n, tu in enumerate(tus):
stem = f"tu_{n:03d}_{os.path.splitext(tu['src'])[0]}_{tu['line']}"
fname = os.path.join(args.out, stem + ".cu")
# Hoist all preprocessor directives (#include/#define/#pragma) to file
# scope, deduped in first-seen order, so function-wrapped segments
# never carry an #include into block scope (illegal for headers that
# define static __device__ functions).
hoisted = []
seen_hoist = set()
seg_render = [] # (kind, body_lines, line)
for kind, lines, line in tu["segs"]:
body = []
for ln in lines:
if ln.lstrip().startswith("#"):
if ln not in seen_hoist:
seen_hoist.add(ln)
hoisted.append(ln)
else:
body.append(ln)
if body:
seg_render.append((kind, body, line))
out = ['#include "fixture.cuh"\n']
out += hoisted
out.append("\n")
fn_count = 0
for kind, body, line in seg_render:
out.append(f"// --- from {tu['src']}:{line} ---\n")
if kind in ("global", "main"):
out += body
else: # fn
out.append(f"static void _seg_{fn_count}() {{\n")
out += body
out.append("\n}\n")
fn_count += 1
out.append("\n")
with open(fname, "w", encoding="utf-8") as f:
f.writelines(out)
manifest.append((stem, tu["openvdb"]))
# Emit a manifest CMake can read: <stem> <needs_openvdb 0|1>
with open(os.path.join(args.out, "manifest.txt"), "w") as f:
for stem, ovdb in manifest:
f.write(f"{stem} {1 if ovdb else 0}\n")
n_ovdb = sum(1 for _, o in manifest if o)
print(f"extracted {len(manifest)} translation unit(s) "
f"({n_ovdb} need OpenVDB) into {args.out}")
return 0
def main():
ap = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
sub = ap.add_subparsers(dest="cmd", required=True)
p1 = sub.add_parser("check-refs", help="validate #include references")
p1.add_argument("md", nargs="+", help="markdown files")
p1.set_defaults(func=cmd_check_refs)
p2 = sub.add_parser("extract", help="extract compile-tagged blocks to .cu")
p2.add_argument("md", nargs="+", help="markdown files")
p2.add_argument("--out", required=True, help="output directory")
p2.set_defaults(func=cmd_extract)
args = ap.parse_args()
sys.exit(args.func(args))
if __name__ == "__main__":
main()
-4
View File
@@ -6,7 +6,3 @@ Welcome to the NanoVDB documentation page.
* @subpage NanoVDB_FAQ
* @subpage NanoVDB_SourceTree
* @subpage NanoVDB_HelloWorld
For a hands-on introduction, point an LLM coding agent (Claude Code, Cursor, or
similar) at the [TEACHME lessons](https://github.com/AcademySoftwareFoundation/openvdb/tree/master/doc/nanovdb/TEACHME)
and ask it to teach you the NanoVDB API interactively.
-26
View File
@@ -1,26 +0,0 @@
html {
/* override light-mode variables here */
}
html.dark-mode {
/* define dark-mode variable overrides here */
--openvdb-group-header-override: white;
}
/* Fix @name group sections in dark theme appearing strangely */
div.groupHeader
{
box-shadow: none;
color: var(--openvdb-group-header-override);
}
/* Apply invert to all images in tables, regardless of nesting, required to
properly handle latex formulas in dark theme (for some reason
doxygen-awesome only applies this to the first level of nested tables via:
html.dark-mode div.contents > table img)
*/
html.dark-mode div.contents table img
{
filter: brightness(89%) hue-rotate(180deg) invert();
}
+1
View File
@@ -21,6 +21,7 @@
- @ref secPtIndexFilters
- @ref secPtSpaceAndTrans
@section secPtOverview Introduction
@anchor openvdbPointsOverview
+6 -4
View File
@@ -1,6 +1,6 @@
/**
@page python OpenVDB Python
@page python Using OpenVDB in Python
This section describes the OpenVDB Python module and includes Python code
snippets and some complete programs that illustrate how to perform common tasks.
@@ -441,9 +441,11 @@ not on their active states or other attributes.
Large data sets are often handled in Python using
<a href="http://www.numpy.org/">NumPy</a>.
The @b copyFromArray and @b copyToArray grid methods can be used to exchange
data efficiently between scalar-valued grids and three-dimensional NumPy
arrays and between vector-valued grids and four-dimensional NumPy arrays.
The OpenVDB Python module can optionally be compiled with NumPy support.
With NumPy enabled, the @b copyFromArray and @b copyToArray grid methods
can be used to exchange data efficiently between scalar-valued grids
and three-dimensional NumPy arrays and between vector-valued grids and
four-dimensional NumPy arrays.
@code{.py}
>>> import pyopenvdb as vdb
>>> import numpy
-126
View File
@@ -1,126 +0,0 @@
See [LICENSE](LICENSE) for the main open source license of original
code written for the OpenVDB project.
The remainder of this file reproduces the open source licensing details
of other projects that have been imported, incorporated into, or derived
into parts of OpenVDB.
In no particular order:
-------------------------------------------------------------------------
BSD 3-Clause License
SPDX-License-Identifier: BSD-3-Clause
* Imath, Copyright (c) Contributors to the Imath Project.
https://github.com/AcademySoftwareFoundation/Imath
OpenVDB includes a copy of Half.h from the Imath project. This copy can
be disabled in favour of using Half.h from the Imath project - but one
must be provided either way.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
- Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-------------------------------------------------------------------------
MIT License
* doxygen-awesome Copyright (c) 2021 - 2023 jothepro
https://github.com/jothepro/doxygen-awesome-css
OpenVDB uses doxygen-awesome for stylized html output with doxygen and
comes bundled with copies of the css provided by doxygen-awesome. Usage
of this css can be disabled.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
-------------------------------------------------------------------------
Apache 2.0
* VCL (c) Copyright 2012-2022 Agner Fog.
https://github.com/vectorclass/version2
OpenVDB includes a copy of vectorclass for x86 SIMD intrinsic usage. Usage
of VCL is disabled by default and requires the VCL headers to be shipped with
OpenVDB installations. This behaviour and usage of VCL can be controlled
during OpenVDB configuration. See the full LICENSE terms in:
vcl/openvdb/ext/vcl/LICENSE
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-------------------------------------------------------------------------
Public domain
* The simplex noise implementation included in OpenVDB AX is Copyright (c)
Arthur Tombs. It bears the following notice:
This is a derivative work based on OpenSimplex by Kurt Spencer:
https://gist.github.com/KdotJPG/b1270127455a94ac5d19
Anyone is free to make use of this software in whatever way they want.
Attribution is appreciated, but not required.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
-------------------------------------------------------------------------
If we have left anything out, it is unintentional. Please let us know.
@@ -1,138 +0,0 @@
// SPDX-License-Identifier: MIT
/**
Doxygen Awesome
https://github.com/jothepro/doxygen-awesome-css
Copyright (c) 2021 - 2025 jothepro
*/
class DoxygenAwesomeDarkModeToggle extends HTMLElement {
// SVG icons from https://fonts.google.com/icons
// Licensed under the Apache 2.0 license:
// https://www.apache.org/licenses/LICENSE-2.0.html
static lightModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FCBF00"><rect fill="none" height="24" width="24"/><circle cx="12" cy="12" opacity=".3" r="3"/><path d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"/></svg>`
static darkModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FE9700"><rect fill="none" height="24" width="24"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27 C17.45,17.19,14.93,19,12,19c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z" opacity=".3"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/></svg>`
static title = "Toggle Light/Dark Mode"
static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode"
static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode"
static _staticConstructor = function() {
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.userPreference)
// Update the color scheme when the browsers preference changes
// without user interaction on the website.
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged()
})
// Update the color scheme when the tab is made visible again.
// It is possible that the appearance was changed in another tab
// while this tab was in the background.
document.addEventListener("visibilitychange", visibilityState => {
if (document.visibilityState === 'visible') {
DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged()
}
});
}()
static init() {
$(function() {
$(document).ready(function() {
const toggleButton = document.createElement('doxygen-awesome-dark-mode-toggle')
toggleButton.title = DoxygenAwesomeDarkModeToggle.title
toggleButton.updateIcon()
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
toggleButton.updateIcon()
})
document.addEventListener("visibilitychange", visibilityState => {
if (document.visibilityState === 'visible') {
toggleButton.updateIcon()
}
});
$(document).ready(function(){
document.getElementById("MSearchBox").parentNode.appendChild(toggleButton)
})
$(window).resize(function(){
document.getElementById("MSearchBox").parentNode.appendChild(toggleButton)
})
})
})
}
constructor() {
super();
this.onclick=this.toggleDarkMode
}
/**
* @returns `true` for dark-mode, `false` for light-mode system preference
*/
static get systemPreference() {
return window.matchMedia('(prefers-color-scheme: dark)').matches
}
/**
* @returns `true` for dark-mode, `false` for light-mode user preference
*/
static get userPreference() {
return (!DoxygenAwesomeDarkModeToggle.systemPreference && localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)) ||
(DoxygenAwesomeDarkModeToggle.systemPreference && !localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey))
}
static set userPreference(userPreference) {
DoxygenAwesomeDarkModeToggle.darkModeEnabled = userPreference
if(!userPreference) {
if(DoxygenAwesomeDarkModeToggle.systemPreference) {
localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey, true)
} else {
localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)
}
} else {
if(!DoxygenAwesomeDarkModeToggle.systemPreference) {
localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey, true)
} else {
localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey)
}
}
DoxygenAwesomeDarkModeToggle.onUserPreferenceChanged()
}
static enableDarkMode(enable) {
if(enable) {
DoxygenAwesomeDarkModeToggle.darkModeEnabled = true
document.documentElement.classList.add("dark-mode")
document.documentElement.classList.remove("light-mode")
} else {
DoxygenAwesomeDarkModeToggle.darkModeEnabled = false
document.documentElement.classList.remove("dark-mode")
document.documentElement.classList.add("light-mode")
}
}
static onSystemPreferenceChanged() {
DoxygenAwesomeDarkModeToggle.darkModeEnabled = DoxygenAwesomeDarkModeToggle.userPreference
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled)
}
static onUserPreferenceChanged() {
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled)
}
toggleDarkMode() {
DoxygenAwesomeDarkModeToggle.userPreference = !DoxygenAwesomeDarkModeToggle.userPreference
this.updateIcon()
}
updateIcon() {
if(DoxygenAwesomeDarkModeToggle.darkModeEnabled) {
this.innerHTML = DoxygenAwesomeDarkModeToggle.darkModeIcon
} else {
this.innerHTML = DoxygenAwesomeDarkModeToggle.lightModeIcon
}
}
}
customElements.define("doxygen-awesome-dark-mode-toggle", DoxygenAwesomeDarkModeToggle);
@@ -1,66 +0,0 @@
// SPDX-License-Identifier: MIT
/**
Doxygen Awesome
https://github.com/jothepro/doxygen-awesome-css
Copyright (c) 2022 - 2025 jothepro
*/
class DoxygenAwesomeFragmentCopyButton extends HTMLElement {
constructor() {
super();
this.onclick=this.copyContent
}
static title = "Copy to clipboard"
static copyIcon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M23.04,10.322c0,-2.582 -2.096,-4.678 -4.678,-4.678l-6.918,-0c-2.582,-0 -4.678,2.096 -4.678,4.678c0,-0 0,8.04 0,8.04c0,2.582 2.096,4.678 4.678,4.678c0,-0 6.918,-0 6.918,-0c2.582,-0 4.678,-2.096 4.678,-4.678c0,-0 0,-8.04 0,-8.04Zm-2.438,-0l-0,8.04c-0,1.236 -1.004,2.24 -2.24,2.24l-6.918,-0c-1.236,-0 -2.239,-1.004 -2.239,-2.24l-0,-8.04c-0,-1.236 1.003,-2.24 2.239,-2.24c0,0 6.918,0 6.918,0c1.236,0 2.24,1.004 2.24,2.24Z"/><path d="M5.327,16.748c-0,0.358 -0.291,0.648 -0.649,0.648c0,0 0,0 0,0c-2.582,0 -4.678,-2.096 -4.678,-4.678c0,0 0,-8.04 0,-8.04c0,-2.582 2.096,-4.678 4.678,-4.678l6.918,0c2.168,0 3.994,1.478 4.523,3.481c0.038,0.149 0.005,0.306 -0.09,0.428c-0.094,0.121 -0.239,0.191 -0.392,0.191c-0.451,0.005 -1.057,0.005 -1.457,0.005c-0.238,0 -0.455,-0.14 -0.553,-0.357c-0.348,-0.773 -1.128,-1.31 -2.031,-1.31c-0,0 -6.918,0 -6.918,0c-1.236,0 -2.24,1.004 -2.24,2.24l0,8.04c0,1.236 1.004,2.24 2.24,2.24l0,-0c0.358,-0 0.649,0.29 0.649,0.648c-0,0.353 -0,0.789 -0,1.142Z" style="fill-opacity:0.6;"/></svg>`
static successIcon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M8.084,16.111c-0.09,0.09 -0.212,0.141 -0.34,0.141c-0.127,-0 -0.249,-0.051 -0.339,-0.141c-0.746,-0.746 -2.538,-2.538 -3.525,-3.525c-0.375,-0.375 -0.983,-0.375 -1.357,0c-0.178,0.178 -0.369,0.369 -0.547,0.547c-0.375,0.375 -0.375,0.982 -0,1.357c1.135,1.135 3.422,3.422 4.75,4.751c0.27,0.27 0.637,0.421 1.018,0.421c0.382,0 0.749,-0.151 1.019,-0.421c2.731,-2.732 10.166,-10.167 12.454,-12.455c0.375,-0.375 0.375,-0.982 -0,-1.357c-0.178,-0.178 -0.369,-0.369 -0.547,-0.547c-0.375,-0.375 -0.982,-0.375 -1.357,0c-2.273,2.273 -9.567,9.567 -11.229,11.229Z"/></svg>`
static successDuration = 980
static init() {
$(function() {
$(document).ready(function() {
if(navigator.clipboard) {
const fragments = document.getElementsByClassName("fragment")
for(const fragment of fragments) {
const fragmentWrapper = document.createElement("div")
fragmentWrapper.className = "doxygen-awesome-fragment-wrapper"
const fragmentCopyButton = document.createElement("doxygen-awesome-fragment-copy-button")
fragmentCopyButton.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon
fragmentCopyButton.title = DoxygenAwesomeFragmentCopyButton.title
fragment.parentNode.replaceChild(fragmentWrapper, fragment)
fragmentWrapper.appendChild(fragment)
fragmentWrapper.appendChild(fragmentCopyButton)
}
}
})
})
}
copyContent() {
const content = this.previousSibling.cloneNode(true)
// filter out line number from file listings
content.querySelectorAll(".lineno, .ttc").forEach((node) => {
node.remove()
})
let textContent = content.textContent
// remove trailing newlines that appear in file listings
let numberOfTrailingNewlines = 0
while(textContent.charAt(textContent.length - (numberOfTrailingNewlines + 1)) == '\n') {
numberOfTrailingNewlines++;
}
textContent = textContent.substring(0, textContent.length - numberOfTrailingNewlines)
navigator.clipboard.writeText(textContent);
this.classList.add("success")
this.innerHTML = DoxygenAwesomeFragmentCopyButton.successIcon
window.setTimeout(() => {
this.classList.remove("success")
this.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon
}, DoxygenAwesomeFragmentCopyButton.successDuration);
}
}
customElements.define("doxygen-awesome-fragment-copy-button", DoxygenAwesomeFragmentCopyButton)
@@ -1,32 +0,0 @@
// SPDX-License-Identifier: MIT
/**
Doxygen Awesome
https://github.com/jothepro/doxygen-awesome-css
Copyright (c) 2022 - 2025 jothepro
*/
class DoxygenAwesomeParagraphLink {
// Icon from https://fonts.google.com/icons
// Licensed under the Apache 2.0 license:
// https://www.apache.org/licenses/LICENSE-2.0.html
static icon = `<svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M17 7h-4v2h4c1.65 0 3 1.35 3 3s-1.35 3-3 3h-4v2h4c2.76 0 5-2.24 5-5s-2.24-5-5-5zm-6 8H7c-1.65 0-3-1.35-3-3s1.35-3 3-3h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-2zm-3-4h8v2H8z"/></svg>`
static title = "Permanent Link"
static init() {
$(function() {
$(document).ready(function() {
document.querySelectorAll(".contents a.anchor[id], .contents .groupheader > a[id]").forEach((node) => {
let anchorlink = document.createElement("a")
anchorlink.setAttribute("href", `#${node.getAttribute("id")}`)
anchorlink.setAttribute("title", DoxygenAwesomeParagraphLink.title)
anchorlink.classList.add("anchorlink")
node.classList.add("anchor")
anchorlink.innerHTML = DoxygenAwesomeParagraphLink.icon
node.parentElement.appendChild(anchorlink)
})
})
})
}
}
@@ -1,20 +0,0 @@
/* SPDX-License-Identifier: MIT */
/**
Doxygen Awesome
https://github.com/jothepro/doxygen-awesome-css
Copyright (c) 2021 - 2025 jothepro
*/
@media screen and (min-width: 768px) {
#MSearchBox {
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - var(--searchbar-height) - 1px);
}
#MSearchField {
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 66px - var(--searchbar-height));
}
}
@@ -1,105 +0,0 @@
/* SPDX-License-Identifier: MIT */
/**
Doxygen Awesome
https://github.com/jothepro/doxygen-awesome-css
Copyright (c) 2021 - 2025 jothepro
*/
html {
/* side nav width. MUST be = `TREEVIEW_WIDTH`.
* Make sure it is wide enough to contain the page title (logo + title + version)
*/
--side-nav-fixed-width: 335px;
--menu-display: none;
--top-height: 120px;
--toc-sticky-top: -25px;
--toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 25px);
}
#projectname {
white-space: nowrap;
}
@media screen and (min-width: 768px) {
html {
--searchbar-background: var(--page-background-color);
}
#side-nav {
min-width: var(--side-nav-fixed-width);
max-width: var(--side-nav-fixed-width);
top: var(--top-height);
overflow: visible;
}
#nav-tree, #side-nav {
height: calc(100vh - var(--top-height)) !important;
}
#top {
display: block;
border-bottom: none;
height: var(--top-height);
margin-bottom: calc(0px - var(--top-height));
max-width: var(--side-nav-fixed-width);
overflow: hidden;
background: var(--side-nav-background);
}
#main-nav {
float: left;
padding-right: 0;
}
.ui-resizable-handle {
display: none;
}
.ui-resizable-e {
width: 0;
}
#nav-path {
position: fixed;
right: 0;
left: calc(var(--side-nav-fixed-width) + 1px);
bottom: 0;
width: auto;
}
#doc-content {
height: calc(100vh - 31px) !important;
padding-bottom: calc(3 * var(--spacing-large));
padding-top: calc(var(--top-height) - 80px);
box-sizing: border-box;
margin-left: var(--side-nav-fixed-width) !important;
}
#MSearchBox {
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)));
}
#MSearchField {
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 65px);
}
#MSearchResultsWindow {
left: var(--spacing-medium) !important;
right: auto;
}
#nav-sync {
bottom: 4px;
right: auto;
left: 300px;
width: 35px;
top: auto !important;
user-select: none;
position: fixed
}
}
File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More