Compare commits
11
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e7ec6329dc | ||
|
|
a28c227175 | ||
|
|
30e59dc432 | ||
|
|
3fff04fa64 | ||
|
|
a75b75617b | ||
|
|
9abae44383 | ||
|
|
7fffe564ef | ||
|
|
375c683456 | ||
|
|
960336887b | ||
|
|
6966d7453d | ||
|
|
d0b0556a6c |
@@ -1,172 +0,0 @@
|
||||
|
||||
name: AX
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'feature/**'
|
||||
- 'pr/**'
|
||||
paths-ignore:
|
||||
- 'CHANGES'
|
||||
- 'CODEOWNERS'
|
||||
- 'doc/**'
|
||||
- 'nanovdb/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'openvdb_houdini/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
pull_request:
|
||||
branches:
|
||||
- '**'
|
||||
paths-ignore:
|
||||
- 'CHANGES'
|
||||
- 'CODEOWNERS'
|
||||
- 'doc/**'
|
||||
- 'nanovdb/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'openvdb_houdini/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
type:
|
||||
description: 'The type of CI to run (all, mac, linux, grammar)'
|
||||
required: true
|
||||
default: 'all'
|
||||
|
||||
# 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
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
linux-ax:
|
||||
if: |
|
||||
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' }}
|
||||
name: >
|
||||
linux-ax:${{ matrix.config.image }}-cxx:${{ matrix.config.cxx }}-${{ matrix.config.build }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:${{ matrix.config.image }}
|
||||
env:
|
||||
CXX: ${{ matrix.config.cxx }}
|
||||
CCACHE_DIR: /tmp/ccache
|
||||
strategy:
|
||||
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' }
|
||||
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: timestamp
|
||||
id: timestamp
|
||||
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
|
||||
- name: ccache
|
||||
# don't use ccache for debug builds
|
||||
if: matrix.config.build == 'Release'
|
||||
id: ccache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: /tmp/ccache
|
||||
key: linux-ax${{ matrix.config.image }}-${{ matrix.config.cxx }}-${{ steps.timestamp.outputs.timestamp }}
|
||||
restore-keys: linux-ax${{ matrix.config.image }}-${{ matrix.config.cxx }}-
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components='core,python,axcore,axbin,axtest'
|
||||
--cargs=\"
|
||||
${{ matrix.config.cmake }}
|
||||
-DOPENVDB_AX_TEST_CMD_DOWNLOADS=ON
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
\"
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
- name: test_doxygen_examples
|
||||
run: ./ci/extract_test_examples.sh
|
||||
# Keep ccache light by stripping out any caches not accessed in the last day
|
||||
- name: ccache_clean
|
||||
if: matrix.config.build == 'Release'
|
||||
run: ccache --evict-older-than 1d
|
||||
|
||||
macos-ax:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'mac'
|
||||
runs-on: ${{ matrix.config.runner }}
|
||||
name: macos-cxx:${{ matrix.config.cxx }}-llvm:${{ matrix.config.llvm }}-${{ matrix.config.build }}
|
||||
env:
|
||||
CXX: ${{ matrix.config.cxx }}
|
||||
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' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_deps
|
||||
run: |
|
||||
./ci/install_macos.sh ${{ matrix.config.llvm }}
|
||||
./ci/install_tbb_macos.sh
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components="core,python,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
|
||||
\"
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
- name: test_doxygen_examples
|
||||
run: ./ci/extract_test_examples.sh
|
||||
|
||||
gen-grammar:
|
||||
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' }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:2025-clang19.1
|
||||
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
|
||||
with:
|
||||
name: ax_grammar
|
||||
path: ./build/openvdb_ax/openvdb_ax/openvdb_ax/grammar
|
||||
retention-days: 5
|
||||
@@ -1,199 +0,0 @@
|
||||
|
||||
name: Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'feature/**'
|
||||
- 'pr/**'
|
||||
paths-ignore:
|
||||
- 'CHANGES'
|
||||
- 'CODEOWNERS'
|
||||
- 'doc/**'
|
||||
- 'openvdb_maya/**'
|
||||
- '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:
|
||||
- 'CHANGES'
|
||||
- 'CODEOWNERS'
|
||||
- 'doc/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'openvdb_houdini/**'
|
||||
- 'openvdb_ax/**'
|
||||
- 'nanovdb/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
type:
|
||||
description: 'The type of CI to run (all, linux, win, mac)'
|
||||
required: true
|
||||
default: 'all'
|
||||
|
||||
# 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
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
linux-vfx:
|
||||
# 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' }}
|
||||
name: >
|
||||
linux:${{ matrix.config.image }}-abi:${{ matrix.config.abi }}-cxx:${{ matrix.config.cxx }}-type:${{ matrix.config.build }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:${{ matrix.config.image }}
|
||||
env:
|
||||
CXX: ${{ matrix.config.cxx }}
|
||||
CCACHE_DIR: /tmp/ccache
|
||||
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' }
|
||||
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: timestamp
|
||||
id: timestamp
|
||||
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
|
||||
- name: ccache
|
||||
# don't use ccache for debug builds
|
||||
if: matrix.config.build == 'Release'
|
||||
id: ccache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: /tmp/ccache
|
||||
key: linux-vfx${{ matrix.config.image }}-abi${{ matrix.config.abi }}-${{ matrix.config.cxx }}-${{ steps.timestamp.outputs.timestamp }}
|
||||
restore-keys: linux-vfx${{ matrix.config.image }}-abi${{ matrix.config.abi }}-${{ matrix.config.cxx }}-
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components=\"core,python,bin,view,render,test\"
|
||||
--cargs=\"
|
||||
${{ matrix.config.cmake }}
|
||||
-DOPENVDB_CXX_STRICT=ON
|
||||
-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'
|
||||
run: |
|
||||
cd build && ctest -V
|
||||
cd - && ./ci/test_install.sh
|
||||
# Keep ccache light by stripping out any caches not accessed in the last day
|
||||
- name: ccache_clean
|
||||
if: matrix.config.build == 'Release'
|
||||
run: ccache --evict-older-than 1d
|
||||
|
||||
windows:
|
||||
# Windows CI. Tests a dynamic build with MD.
|
||||
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')))
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'windows-2022-8c-32g-300h') || 'windows-latest' }}
|
||||
name: windows
|
||||
env:
|
||||
VCPKG_DEFAULT_TRIPLET: x64-windows
|
||||
strategy:
|
||||
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\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
|
||||
- name: install
|
||||
shell: powershell
|
||||
run: .\ci\install_windows.ps1
|
||||
- name: install_numpy
|
||||
shell: powershell
|
||||
run: .\ci\install_windows_numpy.ps1
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--config='Release'
|
||||
--components='core,bin,view,render,python,test'
|
||||
--cargs=\'
|
||||
-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF
|
||||
-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
|
||||
run: cd build && ctest -V -C Release
|
||||
|
||||
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 }}
|
||||
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
|
||||
- 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
|
||||
|
||||
+20
-113
@@ -11,6 +11,7 @@ on:
|
||||
- 'CHANGES'
|
||||
- 'openvdb_maya/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
pull_request:
|
||||
branches:
|
||||
- '**'
|
||||
@@ -18,54 +19,32 @@ on:
|
||||
- 'CHANGES'
|
||||
- 'openvdb_maya/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
deploy:
|
||||
description: 'Deploy to openvdb-website (docs/coverage)?'
|
||||
description: 'Deploy docs?'
|
||||
required: true
|
||||
default: 'none'
|
||||
|
||||
# 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
|
||||
default: 'false'
|
||||
|
||||
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
|
||||
image: aswf/ci-openvdb:2019
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v2
|
||||
- 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: 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: install_cmake
|
||||
run: ./ci/install_cmake.sh 3.15.0
|
||||
- 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,22 +55,12 @@ 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
|
||||
# https://linuxhint.com/ssh-stricthostkeychecking/
|
||||
run: >
|
||||
echo "Host *
|
||||
StrictHostKeyChecking no
|
||||
@@ -102,77 +71,15 @@ jobs:
|
||||
if: |
|
||||
github.repository_owner == 'AcademySoftwareFoundation' &&
|
||||
github.event_name == 'workflow_dispatch' &&
|
||||
github.event.inputs.deploy == 'docs'
|
||||
github.event.inputs.deploy == 'true'
|
||||
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
|
||||
publish_branch: master
|
||||
publish_branch: doxygen
|
||||
full_commit_message: "Automatic doxygen documentation update
|
||||
- Deployed from: AcademySoftwareFoundation/openvdb ${{ github.sha }}
|
||||
|
||||
Signed-off-by: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>"
|
||||
|
||||
#############################################################################
|
||||
################################ Coverage ###################################
|
||||
#############################################################################
|
||||
|
||||
linux-coverage:
|
||||
if: |
|
||||
github.repository_owner == 'AcademySoftwareFoundation' &&
|
||||
github.event_name == 'workflow_dispatch' &&
|
||||
github.event.inputs.deploy == 'coverage'
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: aswf/ci-openvdb:2025-clang19.1
|
||||
env:
|
||||
CXX: g++
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_gcovr
|
||||
run: pip install gcovr
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=coverage
|
||||
--components="core,axcore,test,axtest"
|
||||
--cargs=\"-DOPENVDB_CORE_STATIC=OFF -DOPENVDB_AX_STATIC=OFF\"
|
||||
- name: test_and_gcov
|
||||
run: |
|
||||
cd build
|
||||
ctest -V
|
||||
make gcov_html
|
||||
cd -
|
||||
- name: zip_large_html
|
||||
# The index.function list is > 100mb. Just zip it and provide it as a
|
||||
# download (could instead use LFS to host but not really worth it).
|
||||
run: |
|
||||
cd build/gcov_html
|
||||
tar -czvf index.functions.html.tar.gz index.functions.html
|
||||
sed -i -e 's/index.functions.html/index.functions.html.tar.gz/g' index.html
|
||||
sed -i -e 's/List of functions/Download function index/g' index.html
|
||||
rm index.functions.html
|
||||
cd -
|
||||
- name: pre_deploy
|
||||
# Overwrite global SSH configuration
|
||||
# https://github.com/peaceiris/actions-gh-pages/issues/719
|
||||
# https://linuxhint.com/ssh-stricthostkeychecking/
|
||||
run: >
|
||||
echo "Host *
|
||||
StrictHostKeyChecking no
|
||||
UserKnownHostsFile=/dev/null
|
||||
" > /etc/ssh/ssh_config
|
||||
- name: deploy
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
with:
|
||||
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
|
||||
publish_dir: ./build/gcov_html
|
||||
destination_dir: documentation/code_coverage
|
||||
external_repository: AcademySoftwareFoundation/openvdb-website
|
||||
publish_branch: master
|
||||
full_commit_message: "Automatic code coverage update
|
||||
- Deployed from: AcademySoftwareFoundation/openvdb ${{ github.sha }}
|
||||
|
||||
Signed-off-by: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>"
|
||||
|
||||
@@ -1,175 +0,0 @@
|
||||
|
||||
name: Houdini
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'feature/**'
|
||||
- 'pr/**'
|
||||
paths-ignore:
|
||||
- 'CHANGES'
|
||||
- 'CODEOWNERS'
|
||||
- 'doc/**'
|
||||
- 'nanovdb/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
pull_request:
|
||||
branches:
|
||||
- '**'
|
||||
paths-ignore:
|
||||
- 'CHANGES'
|
||||
- 'CODEOWNERS'
|
||||
- 'doc/**'
|
||||
- 'nanovdb/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
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
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
checksecret:
|
||||
# Check that valid github secrets have been set. This isn't needed to retrieve
|
||||
# the cache, but ensures that the job doens't start with an empty cache
|
||||
name: Verify Houdini Secrets
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
HOUDINI_SECRETS: ${{ steps.check.outputs.HOUDINI_SECRETS }}
|
||||
steps:
|
||||
- id: check
|
||||
env:
|
||||
HOUDINI_CLIENT_ID: ${{ secrets.HOUDINI_CLIENT_ID }}
|
||||
HOUDINI_SECRET_KEY: ${{ secrets.HOUDINI_SECRET_KEY }}
|
||||
run: echo "HOUDINI_SECRETS=${{ env.HOUDINI_CLIENT_ID != '' && env.HOUDINI_SECRET_KEY != '' }}" >> $GITHUB_OUTPUT
|
||||
- name: Skip Next Jobs
|
||||
if: steps.check.outputs.HOUDINI_SECRETS != 'true'
|
||||
run: echo "HOUDINI_CLIENT_ID and HOUDINI_SECRET_KEY GitHub Action Secrets needs to be set to install Houdini builds"
|
||||
|
||||
linux-vfx-houdini:
|
||||
needs: [checksecret]
|
||||
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 }}
|
||||
container:
|
||||
image: aswf/ci-base:${{ matrix.config.image }}
|
||||
env:
|
||||
CXX: ${{ matrix.config.cxx }}
|
||||
CCACHE_DIR: /tmp/ccache
|
||||
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' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: nanobind
|
||||
run: ./ci/install_nanobind.sh 2.5.0
|
||||
- name: install_gtest
|
||||
run: ./ci/install_gtest.sh latest
|
||||
- name: timestamp
|
||||
id: timestamp
|
||||
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
|
||||
- name: ccache
|
||||
# don't use ccache for debug builds
|
||||
if: matrix.config.build == 'Release'
|
||||
id: ccache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: /tmp/ccache
|
||||
key: linux-vfx-hou${{ matrix.config.hou_hash }}-${{ matrix.config.image }}-${{ matrix.config.cxx }}-${{ steps.timestamp.outputs.timestamp }}
|
||||
restore-keys: linux-vfx-hou${{ matrix.config.hou_hash }}-${{ matrix.config.image }}-${{ matrix.config.cxx }}-
|
||||
- name: fetch_houdini
|
||||
uses: actions/cache/restore@v3
|
||||
with:
|
||||
path: hou
|
||||
key: dummy-houdini${{ matrix.config.hou_hash }}-${{ steps.timestamp.outputs.timestamp }}
|
||||
restore-keys: vdb-v5-houdini${{ matrix.config.hou_hash }}-
|
||||
- name: validate_houdini
|
||||
run: test -f "hou/hou.tar.gz"
|
||||
# Make sure that the unpacked install is NOT in the root of the OpenVDB checkout
|
||||
# otherwise CMake's install RPATHs wil not work correctly.
|
||||
- name: install_houdini
|
||||
run: |
|
||||
mkdir $HOME/houdini_install
|
||||
cp hou/hou.tar.gz $HOME/houdini_install/hou.tar.gz
|
||||
cd $HOME/houdini_install && tar -xzf hou.tar.gz && cd -
|
||||
- name: build
|
||||
run: |
|
||||
./ci/build.sh -v \
|
||||
--build-type="${{ matrix.config.build }}" \
|
||||
--components="${{ matrix.config.components }}" \
|
||||
--cargs=\" \
|
||||
-DHOUDINI_ROOT=$HOME/houdini_install/hou \
|
||||
-DOPENVDB_BUILD_HOUDINI_ABITESTS=OFF \
|
||||
-DOPENVDB_HOUDINI_INSTALL_PREFIX=/tmp \
|
||||
-DDISABLE_CMAKE_SEARCH_PATHS=ON \
|
||||
-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
|
||||
if: matrix.config.build == 'Release'
|
||||
run: ccache --evict-older-than 1d
|
||||
|
||||
macos-houdini:
|
||||
needs: [checksecret]
|
||||
if: >
|
||||
${{ needs.checksecret.outputs.HOUDINI_SECRETS == 'true' ||
|
||||
github.repository_owner == 'AcademySoftwareFoundation' }}
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: fetch_houdini
|
||||
uses: actions/cache/restore@v3
|
||||
with:
|
||||
path: hou
|
||||
key: dummy-houdini
|
||||
restore-keys: vdb-v5-houdini-macos-
|
||||
- name: validate_houdini
|
||||
run: test -f "hou/hou.tar.gz"
|
||||
# Make sure that the unpacked install is NOT in the root of the OpenVDB checkout
|
||||
# otherwise CMake's install RPATHs wil not work correctly.
|
||||
- name: install_houdini
|
||||
run: |
|
||||
mkdir $HOME/houdini_install
|
||||
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
|
||||
- name: build
|
||||
run: |
|
||||
./ci/build.sh -v \
|
||||
--build-type=Release \
|
||||
--components="core,hou,bin,view,render,test,axcore,axbin" \
|
||||
--cargs=\" \
|
||||
-DHOUDINI_ROOT=$HOME/houdini_install/hou \
|
||||
-DOPENVDB_BUILD_HOUDINI_ABITESTS=OFF \
|
||||
-DOPENVDB_HOUDINI_INSTALL_PREFIX=/tmp \
|
||||
-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 \
|
||||
\"
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
@@ -1,198 +0,0 @@
|
||||
|
||||
name: NanoVDB
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'feature/**'
|
||||
- 'pr/**'
|
||||
paths-ignore:
|
||||
- 'CHANGES'
|
||||
- 'CODEOWNERS'
|
||||
- 'doc/**'
|
||||
- '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:
|
||||
- 'CHANGES'
|
||||
- 'CODEOWNERS'
|
||||
- 'doc/**'
|
||||
- 'openvdb_ax/**'
|
||||
- 'openvdb_maya/**'
|
||||
- 'openvdb_houdini/**'
|
||||
- 'fvdb/**'
|
||||
- 'pendingchanges/**'
|
||||
- '**.md'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
type:
|
||||
description: 'The type of CI to run (all, linux, win, mac)'
|
||||
required: true
|
||||
default: 'all'
|
||||
|
||||
# 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:
|
||||
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' }}
|
||||
name: >
|
||||
linux-nanovdb:cxx:${{ matrix.config.cxx }}-${{ matrix.config.build }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:${{ matrix.config.image }}
|
||||
env:
|
||||
CXX: ${{ matrix.config.cxx }}
|
||||
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' }
|
||||
fail-fast: false
|
||||
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: nanobind
|
||||
run: ./ci/install_nanobind.sh 2.5.0
|
||||
- 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
|
||||
--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
|
||||
\'
|
||||
- name: test
|
||||
run: cd build && sudo ctest -V -E ".*cuda.*|.*mgpu.*"
|
||||
|
||||
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')))
|
||||
runs-on: ${{ (github.repository_owner == 'AcademySoftwareFoundation' && 'windows-2022-8c-32g-300h') || 'windows-latest' }}
|
||||
env:
|
||||
VCPKG_DEFAULT_TRIPLET: 'x64-windows'
|
||||
visual_studio: "Visual Studio 17 2022"
|
||||
cuda: "12.4.0"
|
||||
strategy:
|
||||
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
|
||||
- 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: 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
|
||||
--cargs=\'
|
||||
-A x64 -G \"Visual Studio 17 2022\" -DOPENVDB_CORE_STATIC=OFF
|
||||
-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.*"
|
||||
|
||||
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')))
|
||||
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' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_deps
|
||||
run: |
|
||||
./ci/install_macos.sh
|
||||
./ci/install_tbb_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 \'
|
||||
- name: test
|
||||
run: cd build && ctest -V -E ".*cuda.*|.*mgpu.*"
|
||||
|
||||
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
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_gtest
|
||||
run: ./ci/install_gtest.sh latest
|
||||
- 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 make -j8 install
|
||||
sudo ctest -V
|
||||
@@ -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
|
||||
@@ -1,613 +0,0 @@
|
||||
# This workflow runs once a week and tests a variety of configurations,
|
||||
# dependencies and other specific or expensive checkes (sanitizers).
|
||||
# It also contains the Houdini Cache jobs which update the CI cache
|
||||
# with new Houdini releases.
|
||||
|
||||
name: Weekly
|
||||
|
||||
on:
|
||||
schedule:
|
||||
# run this workflow Sunday 00:00 UTC
|
||||
- cron: '0 0 * * 0'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
type:
|
||||
description: 'The type of CI to run (all, houdini, latest, extra, ax, blosc, abi)'
|
||||
required: true
|
||||
default: 'all'
|
||||
|
||||
# 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
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
#############################################################################
|
||||
################################## Houdini ##################################
|
||||
#############################################################################
|
||||
|
||||
# Check that valid github secrets have been set for the ability to
|
||||
# download Houdini and cache it. The secrets are used in download_houdini.py
|
||||
checksecret:
|
||||
name: Verify Houdini Secrets
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
HOUDINI_SECRETS: ${{ steps.check.outputs.HOUDINI_SECRETS }}
|
||||
steps:
|
||||
- id: check
|
||||
env:
|
||||
HOUDINI_CLIENT_ID: ${{ secrets.HOUDINI_CLIENT_ID }}
|
||||
HOUDINI_SECRET_KEY: ${{ secrets.HOUDINI_SECRET_KEY }}
|
||||
run: echo "HOUDINI_SECRETS=${{ env.HOUDINI_CLIENT_ID != '' && env.HOUDINI_SECRET_KEY != '' }}" >> $GITHUB_OUTPUT
|
||||
- name: Skip Next Jobs
|
||||
if: steps.check.outputs.HOUDINI_SECRETS != 'true'
|
||||
run: echo "HOUDINI_CLIENT_ID and HOUDINI_SECRET_KEY GitHub Action Secrets needs to be set to install Houdini builds"
|
||||
# Explicitly error on the ASWF repo, we expect this secret to always exist
|
||||
- name: Error ASWF
|
||||
if: steps.check.outputs.HOUDINI_SECRETS != 'true' && github.repository_owner == 'AcademySoftwareFoundation'
|
||||
run: exit 1
|
||||
|
||||
# download the latest production version of Houdini X, strip out headers,
|
||||
# libraries and binaries required for building OpenVDB and put it into
|
||||
# the GitHub Actions cache
|
||||
linux_houdini:
|
||||
needs: [checksecret]
|
||||
if: |
|
||||
(needs.checksecret.outputs.HOUDINI_SECRETS == 'true') &&
|
||||
(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' }}
|
||||
name: linux-houdini:${{ matrix.config.hou_hash }}
|
||||
env:
|
||||
CXX: clang++
|
||||
HOUDINI_CLIENT_ID: ${{ secrets.HOUDINI_CLIENT_ID }}
|
||||
HOUDINI_SECRET_KEY: ${{ secrets.HOUDINI_SECRET_KEY }}
|
||||
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' }
|
||||
fail-fast: false
|
||||
container:
|
||||
image: aswf/ci-base:2024
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: timestamp
|
||||
id: timestamp
|
||||
run: echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
|
||||
- name: download_houdini
|
||||
run: ./ci/download_houdini.sh ${{ matrix.config.houdini_version }} ${{ matrix.config.platform }} --prod
|
||||
- name: install_houdini
|
||||
run: |
|
||||
mkdir $HOME/houdini_install
|
||||
cp hou/hou.tar.gz $HOME/houdini_install/hou.tar.gz
|
||||
cd $HOME/houdini_install && tar -xzf hou.tar.gz && cd -
|
||||
- name: write_houdini_cache
|
||||
uses: actions/cache/save@v3
|
||||
with:
|
||||
path: hou
|
||||
key: vdb-v5-houdini${{ matrix.config.hou_hash }}-${{ steps.timestamp.outputs.timestamp }}
|
||||
|
||||
macos_houdini:
|
||||
needs: [checksecret]
|
||||
if: |
|
||||
(needs.checksecret.outputs.HOUDINI_SECRETS == 'true') &&
|
||||
(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
|
||||
env:
|
||||
HOUDINI_CLIENT_ID: ${{ secrets.HOUDINI_CLIENT_ID }}
|
||||
HOUDINI_SECRET_KEY: ${{ secrets.HOUDINI_SECRET_KEY }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: timestamp
|
||||
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
|
||||
- name: install_houdini
|
||||
run: |
|
||||
mkdir $HOME/houdini_install
|
||||
cp hou/hou.tar.gz $HOME/houdini_install/hou.tar.gz
|
||||
cd $HOME/houdini_install && tar -xzf hou.tar.gz && cd -
|
||||
- name: write_houdini_cache
|
||||
uses: actions/cache/save@v3
|
||||
with:
|
||||
path: hou
|
||||
key: vdb-v5-houdini-macos-${{ steps.timestamp.outputs.timestamp }}
|
||||
|
||||
#############################################################################
|
||||
########################### Core Library Extras #############################
|
||||
#############################################################################
|
||||
|
||||
# Extra configuration tests for the OpenVDB Core library. These test a
|
||||
# variety of options with newer compilers.
|
||||
linux-extra:
|
||||
if: |
|
||||
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' }}
|
||||
name: linux-extra:${{ matrix.config.name }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:${{ matrix.config.image }}
|
||||
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' }
|
||||
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: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components="${{ matrix.config.components }}"
|
||||
--cargs=\"-DOPENVDB_CXX_STRICT=ON ${{ matrix.config.cmake }}\"
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
|
||||
# Test latest dependencies, latest compilers and options
|
||||
latest:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'latest'
|
||||
runs-on: ${{ matrix.config.runson }}
|
||||
env:
|
||||
CXX: ${{ matrix.config.cxx }}
|
||||
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' }
|
||||
# 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' }
|
||||
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
|
||||
elif [ "$RUNNER_OS" == "macOS" ]; then
|
||||
./ci/install_macos.sh 20
|
||||
./ci/install_tbb_macos.sh
|
||||
else
|
||||
echo "$RUNNER_OS not supported"; exit 1
|
||||
fi
|
||||
- name: build
|
||||
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 }}
|
||||
\'
|
||||
- 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 ##############################
|
||||
#############################################################################
|
||||
|
||||
linux-ax:
|
||||
if: |
|
||||
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' }}
|
||||
name: >
|
||||
linux-ax:${{ matrix.config.image }}-cxx:${{ matrix.config.cxx }}-${{ matrix.config.build }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:${{ matrix.config.image }}
|
||||
env:
|
||||
CXX: ${{ matrix.config.cxx }}
|
||||
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' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: nanobind
|
||||
run: ./ci/install_nanobind.sh 2.5.0
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components=${{ matrix.config.components }}
|
||||
--cargs=\"
|
||||
${{ matrix.config.cmake }}
|
||||
-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'
|
||||
run: rm -rf build
|
||||
- name: build
|
||||
if: matrix.config.components == 'core'
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--components="bin,axcore,axbin,axtest,python"
|
||||
--cargs=\"
|
||||
${{ matrix.config.cmake }}
|
||||
-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
|
||||
- name: test_doxygen_examples
|
||||
run: ./ci/extract_test_examples.sh
|
||||
|
||||
macos-ax:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'ax'
|
||||
runs-on: ${{ matrix.config.runner }}
|
||||
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' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_deps
|
||||
run: |
|
||||
./ci/install_macos.sh ${{ matrix.config.llvm }}
|
||||
./ci/install_tbb_macos.sh
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-type=${{ matrix.config.build }}
|
||||
--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
|
||||
\"
|
||||
- name: test
|
||||
run: cd build && ctest -V
|
||||
- name: test_doxygen_examples
|
||||
run: ./ci/extract_test_examples.sh
|
||||
|
||||
windows-ax:
|
||||
if: |
|
||||
github.event_name != 'workflow_dispatch' ||
|
||||
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 }}
|
||||
env:
|
||||
VCPKG_DEFAULT_TRIPLET: ${{ matrix.config.vc }}
|
||||
# Export this with '' avoid bash treating \ as escape
|
||||
VDB_INSTALL_PREFIX: '${{ github.workspace }}\\install'
|
||||
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.
|
||||
# @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' }
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: llvm
|
||||
run: ./ci/install_llvm_windows.sh ${{ matrix.config.llvm }} ${{ matrix.config.crt }}
|
||||
- name: install
|
||||
shell: powershell
|
||||
run: |
|
||||
vcpkg update
|
||||
vcpkg install tbb gtest
|
||||
- name: build
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--config=${{ matrix.config.build }}
|
||||
--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
|
||||
-DUSE_EXPLICIT_INSTANTIATION=OFF
|
||||
-DLLVM_DIR=\"${HOME}\\llvm_install\\lib\\cmake\\llvm\"
|
||||
-DCMAKE_INSTALL_PREFIX=\"${VDB_INSTALL_PREFIX}\"
|
||||
${{ matrix.config.cmake }}
|
||||
\'
|
||||
- name: runtime_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 "$Env:VDB_INSTALL_PREFIX\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||
- name: test
|
||||
run: cd build && ctest -V -C ${{ matrix.config.build }}
|
||||
|
||||
#############################################################################
|
||||
################################## 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' }}
|
||||
name: linux-blosc:${{ matrix.blosc }}
|
||||
container:
|
||||
image: aswf/ci-openvdb:2025-clang19.1
|
||||
strategy:
|
||||
matrix:
|
||||
blosc: ['1.21.0', 'latest']
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: install_blosc
|
||||
run: sudo ./ci/install_blosc.sh ${{ matrix.blosc }}
|
||||
- name: build
|
||||
run: >
|
||||
sudo ./ci/build.sh -v
|
||||
--build-type=Release
|
||||
--components=\"core,test\"
|
||||
- name: test
|
||||
run: cd build && sudo ctest -V
|
||||
|
||||
#############################################################################
|
||||
################################## ABI ######################################
|
||||
#############################################################################
|
||||
|
||||
linux-abi-checker:
|
||||
if: |
|
||||
github.event_name == 'workflow_dispatch' &&
|
||||
(github.event.inputs.type == 'all' ||
|
||||
github.event.inputs.type == 'abi')
|
||||
runs-on: ubuntu-22.04
|
||||
env:
|
||||
# The 'abicheck' build type sets these, but older versions of the library
|
||||
# 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
|
||||
fetch-tags: true
|
||||
# Compute the latest major version - that is used as our baseline
|
||||
# note: For CI forks, make sure you have your tags synced
|
||||
- name: get_major_version
|
||||
run: |
|
||||
LATEST_VERSION_TAG=$(git tag --merged | sort --version-sort | tail -n1)
|
||||
echo "Computed latest VDB tag: ${LATEST_VERSION_TAG}"
|
||||
VDB_MAJOR_VERSION=$(echo ${LATEST_VERSION_TAG} | cut -f1 -d '.' | tr -d -c 0-9)
|
||||
echo "Using major version: ${VDB_MAJOR_VERSION}"
|
||||
echo "VDB_MAJOR_VERSION=${VDB_MAJOR_VERSION}" >> "$GITHUB_ENV"
|
||||
- name: install_deps
|
||||
run: sudo apt-get -q install -y libboost-iostreams-dev libtbb-dev libblosc-dev elfutils
|
||||
- name: install_abi_checker
|
||||
run: sudo apt-get -q install -y abi-dumper abi-compliance-checker
|
||||
- name: build_new
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-dir=build_new
|
||||
--build-type=abicheck
|
||||
--target=openvdb_shared
|
||||
--components=\"core\"
|
||||
--cargs=\'-DUSE_EXPLICIT_INSTANTIATION=OFF -DDISABLE_DEPENDENCY_VERSION_CHECKS=ON\'
|
||||
- name: checkout_baseline
|
||||
run: git checkout v${VDB_MAJOR_VERSION}.0.0
|
||||
- name: build_old
|
||||
run: >
|
||||
./ci/build.sh -v
|
||||
--build-dir=build_old
|
||||
--build-type=abicheck
|
||||
--target=openvdb_shared
|
||||
--components=\"core\"
|
||||
--cargs=\'-DUSE_EXPLICIT_INSTANTIATION=OFF -DDISABLE_DEPENDENCY_VERSION_CHECKS=ON\'
|
||||
- name: abi_dump
|
||||
run: |
|
||||
abi-dumper build_new/openvdb/openvdb/libopenvdb.so -o ABI-NEW.dump -lver 1
|
||||
abi-dumper build_old/openvdb/openvdb/libopenvdb.so -o ABI-OLD.dump -lver 2
|
||||
# Replace the version namespace in the latest ABI dump with the baseline
|
||||
# version we're comparing against. We should probably instead build the
|
||||
# latest with the baseline version number but no CMake/defines allow us to
|
||||
# do this.
|
||||
- name: replace_symbols
|
||||
run: sed -i -E 's/openvdb([^v]*)v[0-9]*_[0-9]/openvdb\1v'${VDB_MAJOR_VERSION}'_0/g' ABI-NEW.dump
|
||||
- name: abi_check
|
||||
# -strict treats warnings as errors
|
||||
# -extended checks all member data
|
||||
# we check everything _not_ in openvdb::**::internal namespace
|
||||
run: >
|
||||
abi-compliance-checker -l OPENVDB
|
||||
-old ABI-OLD.dump
|
||||
-new ABI-NEW.dump
|
||||
-skip-internal-symbols "\d(openvdb.*internal)"
|
||||
-skip-internal-types "(openvdb.*internal)::"
|
||||
-strict
|
||||
-extended
|
||||
- name: upload_report
|
||||
uses: actions/upload-artifact@v4
|
||||
if: always()
|
||||
with:
|
||||
name: abi_report
|
||||
path: ./compat_reports/OPENVDB/2_to_1/compat_report.html
|
||||
retention-days: 5
|
||||
@@ -1,42 +0,0 @@
|
||||
|
||||
name: Whitespace
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- 'ext/**'
|
||||
- 'pendingchanges/**'
|
||||
- 'tsc/meetings/**'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- 'ext/**'
|
||||
- 'pendingchanges/**'
|
||||
- 'tsc/meetings/**'
|
||||
|
||||
# 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:
|
||||
# Search the git repository for any trailing spaces excluding meeting notes and auto-generated wlt files
|
||||
trailingspaces:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: test
|
||||
run: |
|
||||
set +e
|
||||
git grep -n -I -E '^.+[ ]+$' -- ':!tsc/meetings/*' ':!pendingchanges/*' ':!ext/*' ':!*.wlt'
|
||||
test $? -eq 1
|
||||
|
||||
# Search for any tabs excluding meeting notes, image files and a few others
|
||||
spacesnottabs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- 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'
|
||||
test $? -eq 1
|
||||
@@ -1,2 +1 @@
|
||||
/build/*
|
||||
.DS_Store
|
||||
|
||||
@@ -1,962 +1,36 @@
|
||||
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.0 - November 1, 2023
|
||||
|
||||
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 9 for
|
||||
Houdini 19.5 and 10 for Houdini 20.0.
|
||||
|
||||
OpenEXR 2 and Python 2 are no longer supported.
|
||||
|
||||
OpenVDB:
|
||||
Improvements:
|
||||
- Removed use of boost::any in favor of std::any.
|
||||
[Contributed by Brian McKinnon]
|
||||
|
||||
Bug Fixes:
|
||||
- Fix potential crash reading corrupt .vdb files with invalid
|
||||
blosc or zip chunks.
|
||||
[Contributed by Matthias Ueberheide]
|
||||
|
||||
NanoVDB:
|
||||
Highlights:
|
||||
- Several new tools to generate and modify NanoVDB grids on the GPU.
|
||||
- New file format that supports streaming of raw grid buffers.
|
||||
|
||||
New Features:
|
||||
- New memory efficient GridClass::IndexGrid that separates values from tree
|
||||
- 4 new GridTypes (Index, OnIndex, IndexMask, OnIndexMask) used by IndexGrid
|
||||
- Added createNanoGrid that replaces older conversion methods in GridBuilder.h,
|
||||
IndexGridBuilder.h and OpenToNanoVDB.h
|
||||
- Added cudaPointsToGrid that constructs a point device grid from a list of
|
||||
points.
|
||||
- Added cudaVoxelsToGrid that constructs a voxel device grid from a list of
|
||||
voxels.
|
||||
- Added cuda/CudaUtils.h with several cuda utility functions.
|
||||
- Added GpuTimer for timing of kernels in a specific cuda stream.
|
||||
- Added cudaIndexToGrid that converts IndexGrids into regular Grids.
|
||||
- Added cudaSignedFloodFill that performs signed-flood filling on the GPU.
|
||||
- Added cudaAddBlindData that adds blind data to an existing grid on the GPU.
|
||||
- Added cudaGridChecksum that computes checksums of device grids.
|
||||
- Added cudaGridHandle that handles grids on the GPU.
|
||||
- Added cudaNodeManager that constructs a NodeManager on the GPU.
|
||||
- Added build type Points and GridType::PointIndex for point grids.
|
||||
- Added GridType::Vec3u16 and GridType::Vec3u8 for compressed coordinates.
|
||||
- Added PrefixSum.h for concurrent computation of prefix sum on the CPU.
|
||||
|
||||
API Changes:
|
||||
- Version 32.6.0 (ABI is unchanged).
|
||||
- Transition from C++11 to C++17
|
||||
- Vec3R is deprecated, please use Vec3d instead.
|
||||
- nanoToOpenVDB now takes the index of a NanoVDB in a GridHandle.
|
||||
- GridData, InternalData and LeafData are now public.
|
||||
- GridMetaData can be copied.
|
||||
- Improvements to GridBuilder.h that allows construction of grids on CPU.
|
||||
- GridHandle's move c-tor now requires the GridBuffer to contain a valid grid.
|
||||
- Moved CudaDeviceBuffer.h to cuda/CudaDeviceBuffer.h.
|
||||
- New API for acceleration of custom random-access with ValueAccessors.
|
||||
- Added BitFlags class for convenient bit-mask operations.
|
||||
- Added Vec2/3::min/maxComponentAtomic GPU methods.
|
||||
- Added BBox::expandAtomic and BBox::intersectAtomic.
|
||||
- Added Coord::expandAtomic.
|
||||
- Added Map constructors.
|
||||
- Added Mask::DenseIterator, Mask::setOnAtomic, and Mask::setOffAtomic.
|
||||
- InternalNode::ChildIterator is now const-correct.
|
||||
- Added several new NanoVDB Build Traits.
|
||||
- Syncing PNanoVDB.h with NanoVDB.h.
|
||||
|
||||
Build:
|
||||
- Support for OpenEXR 2.X has been removed.
|
||||
- Better support for building with external package configurations
|
||||
with CMAKE_FIND_PACKAGE_PREFER_CONFIG=ON.
|
||||
|
||||
Python:
|
||||
- Removed Python 2 support.
|
||||
[Contributed by Matthew Cong]
|
||||
- Removed explicit bindings for Math types.
|
||||
[Contributed by Matthew Cong]
|
||||
- Improved type casting for TypedMetadata.
|
||||
[Contributed by Matthew Cong]
|
||||
|
||||
|
||||
Version 10.1.0 - October 11, 2023
|
||||
|
||||
Highlights:
|
||||
- OpenVDB Python bindings are now implemented using pybind11 instead of
|
||||
Boost.Python.
|
||||
[Contributed by Matthew Cong]
|
||||
|
||||
OpenVDB:
|
||||
New features:
|
||||
- Added points::replicate() for the replication of PointDataGrid points
|
||||
and attributes.
|
||||
|
||||
Improvements:
|
||||
- Upgraded OpenVDBs internal half representation to IMath 3.1.6. Brings
|
||||
conversion support using F16C instructions (if enabled using -mf16c) and
|
||||
the removal of the exponent lookup table in favor of bit shifting.
|
||||
- OpenVDBs copy of Half.h is no longer built with an internal lookup table,
|
||||
but explicitly selects the non-LUT version and disables the creation of
|
||||
the LUT. This is required to avoid symbol conflicts with different
|
||||
namespaced OpenVDB builds.
|
||||
- Removed boost::uuid from Archive, instead std::random_device is used
|
||||
directly to generate UUID-like objects.
|
||||
- Moved all cases of file static/global variables which relied on non-trivial
|
||||
construction into function scopes as static locals. These would previously
|
||||
initialize themselves on start-up in a non-deterministic, compiler-dictated
|
||||
order(static-initialization-order-fiasco). This order is now defined by the
|
||||
program's execution.
|
||||
- Fixed the constants used in openvdb::math::Coord::hash() and
|
||||
nanovdb::Coord::hash() to correctly be prime numbers (note that this
|
||||
changes the result of these methods).
|
||||
[Contributed by Benedikt Mersch]
|
||||
- Updated tools::meshToVolume to take two new optional arguments to provide
|
||||
an interior test oracle and an interior testing method. These allow the
|
||||
default outside-flood-fill to be replaced if the actual sidedness can be
|
||||
known.
|
||||
[Contributed by Tomas Skrivan]
|
||||
- LevelSetRebuild now includes example code that demonstrates the intended
|
||||
use of the new meshToVolume interior testing parameters for the
|
||||
resampling of level sets, where the original grid is used as the true
|
||||
sign value. However, due to differences between polygonalization and
|
||||
trilinear interpolation, this behaviour is disabled and exists as a
|
||||
reference.
|
||||
- Introduced openvdb::TupleList to wrap std::tuple and provide interface
|
||||
interop methods with openvdb::TypeList.
|
||||
- Added OPENVDB_FORCE_INLINE, OPENVDB_LIKELY and OPENVDB_UNLIKELY macros.
|
||||
- Introduced openvdb::make_index_sequence to solve clang compilations
|
||||
issues with compiler built-in index_sequence implementations.
|
||||
|
||||
API changes:
|
||||
- Significant infrastructural change to the ValueAccessor header and
|
||||
implementation. All ValueAccessor specializations have been consolidated
|
||||
into a single class which supports all possible ValueAccessor configurations
|
||||
using index_sequences. Backward compatible declarations have been provided.
|
||||
The new ValueAccessor implementation is marked as final.
|
||||
- PagedArray iterators no longer derive from std::iterator
|
||||
(but remains standard compliant).
|
||||
|
||||
Bug Fixes:
|
||||
- Internal counters in tree::RangeIterator were limited to 32bit precision.
|
||||
They are now extended to size_t.
|
||||
[Reported by SpaceX]
|
||||
- Fixed a bug when compiling with -fvisibility=hidden and GCC 11 which
|
||||
would cause a crash in openvdb::initialize().
|
||||
- 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]
|
||||
- Fixed a bug with LeafNodeBool Topology constructor with designated
|
||||
on/off values which wouldn't apply them correctly.
|
||||
[Reported by @hozhaoea]
|
||||
|
||||
OpenVDB AX:
|
||||
Improvements:
|
||||
- Added support for LLVM 15.
|
||||
|
||||
Bug Fixes:
|
||||
- Fixed a bug in AX on older X86 hardware which could cause a crash when
|
||||
accessing point attributes with half compression (bug introduced in 9.1.0).
|
||||
- Fixed an incorrect option in the `vdb_ax` command line tool where the default
|
||||
optimization level was set to NONE instead of O3 (issue introduced in 10.0.0).
|
||||
|
||||
Houdini:
|
||||
Improvements:
|
||||
- Added Preserve Holes option to VDB From Polygons that uses the
|
||||
fast winding oracle to not collapse holes in polygonal geometry.
|
||||
|
||||
Bug Fixes:
|
||||
- Fix a bug in the projection mode of the Advect Points SOP that was causing
|
||||
a segfault.
|
||||
|
||||
Build:
|
||||
- Fixed a build issue where Boost was not being pulled in when
|
||||
OPENVDB_USE_DELAYED_LOADING was set to OFF.
|
||||
- Fixed a build issue with AX on 32-bit platforms.
|
||||
[Reported by Mathieu Malaterre]
|
||||
- Fixed a compilation issue with the min() and max() methods on Stencils
|
||||
in openvdb/math/Stencils.h.
|
||||
[Reported by Samuel Mauch]
|
||||
- Fixed a compilation error that would be encountered when attempting to
|
||||
enable the SSE4.2 or AVX SIMD options on non-x86 based platforms.
|
||||
- Improved support for compiling with C++20.
|
||||
[Contributed by Denys Maletskyy and Jérémie Dumas]
|
||||
- OpenVDB's CMake no longer modifies the BUILD_SHARED_LIBS variable.
|
||||
[Reported by Maksim Shabunin]
|
||||
- Fix int-in-bool-context GCC9+ warnings by switching to use constexpr if.
|
||||
|
||||
Version 10.0.1 - November 30, 2022
|
||||
|
||||
Bug Fixes:
|
||||
- Fix uninitialized point flags in tools::VolumeToMesh which could result in
|
||||
non-deterministic results (bug introduced in 10.0.0).
|
||||
|
||||
Build:
|
||||
- Fixed CXX standard requirement for VDB components in FindOpenVDB.cmake
|
||||
|
||||
Version 10.0.0 - October 27, 2022
|
||||
|
||||
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 8 for
|
||||
Houdini 19.0 and 9 for Houdini 19.5.
|
||||
|
||||
Highlights:
|
||||
- Introducing OpenVDBLink, which provides a Mathematica interface to
|
||||
OpenVDB. This link ports over access to various grid containers including
|
||||
level sets, fog volumes, vector grids, integer grids, Boolean grids,
|
||||
and mask grids. Construction, modification, combinations, visualisations,
|
||||
queries, import, export, etc. can be achieved over grids too. Any
|
||||
Mathematica 3D region that's ConstantRegionQ and BoundedRegionQ can
|
||||
be represented as a level set grid, providing a more seamless integration
|
||||
with OpenVDB.
|
||||
- Introducing a new command-line tool, dubbed vdb_tool, that can combine any
|
||||
number of the high-level tools available in openvdb/tools. For
|
||||
instance, it can convert a sequence of polygon meshes and particles to
|
||||
level sets, perform a large number of operations on these level set
|
||||
surfaces and export them as adaptive polygon meshes.
|
||||
|
||||
OpenVDB:
|
||||
Improvements:
|
||||
- Significantly improved the performance of all ValueAccessor methods which
|
||||
access LeafNode value buffer data. This improvement applies to any type
|
||||
which is delay load compatible (all default types except for bool and mask
|
||||
grids) and improves the performance of many OpenVDB tools.
|
||||
- Improved the performance of volumeToMesh by 10-15%.
|
||||
|
||||
ABI changes:
|
||||
- ABI change to openvdb::RootNode, which now has a new member that defines
|
||||
the origin of the node. For now this origin is set to a default value of
|
||||
(0,0,0), but in the near future we will allow for offsets to improve
|
||||
access performance and reduce the memory footprints.
|
||||
- Removed deprecated virtual methods from AttributeArray.
|
||||
|
||||
API changes:
|
||||
- Removed PagedArray::push_back().
|
||||
- Removed Tree visitor methods from Tree, RootNode, InternalNode and
|
||||
LeafNode classes - visit(), visit2(), visitActiveBBox().
|
||||
- Removed LeafManager::getNodes().
|
||||
- Removed tools::dilateVoxels() and tools::erodeVoxels() in favor of
|
||||
tools::dilateActiveValues() and tools::erodeActiveValues().
|
||||
- Removed tools::FindActiveValues::any() and
|
||||
tools::FindActiveValues::none().
|
||||
- StringGrid and StringTrees have been removed.
|
||||
|
||||
Bug Fixes:
|
||||
- Fixed an issue with tools::topologyToLevelSet which would previously
|
||||
ignore active tiles in the input topology.
|
||||
[Reported by Tobias Rittig]
|
||||
- Fixed a bug with ValueAccessor::addLeaf and ValueAccessor::addTile which
|
||||
wouldn't add the provided leaf nodes to the underlying tree. This bug did
|
||||
NOT affect the specialized accessors which are used by the default tree
|
||||
configuration.
|
||||
[Contributed by Andrey Zakirov]
|
||||
- Fixed a bug where ValueAccessor::probeNode<NodeT> and
|
||||
ValueAccessor:probeConstNode<NodeT> would return a nullptr if the NodeT
|
||||
type was not explicitly being cached by the accessor but the node existed
|
||||
in the tree.
|
||||
- Fixed a bug on Windows where math::Abs could truncate 64bit integer values.
|
||||
[Contributed by Edward Lam]
|
||||
- Fixed an occurrence of undefined behaviour with math::floatToInt32 and
|
||||
math::doubleToInt64.
|
||||
[Reported by Vojtěch Bubník]
|
||||
- Fixed bugs in the sum merge that produced incorrect merged grids when
|
||||
deep-copying the input nodes or when non-zero background grids were being
|
||||
used.
|
||||
- Fixed a bug in FastSweeping where voxels/tiles are left with min/max float
|
||||
values.
|
||||
- Fixed a bug in math/Tuple.h that prevented compilation with VS2017.
|
||||
|
||||
OpenVDB AX:
|
||||
Improvements:
|
||||
- Major updates to the command line interface of the vdb_ax binary, exposing
|
||||
more controls such as tile streaming, value iterator types and attribute
|
||||
bindings.
|
||||
|
||||
OpenVDB Houdini:
|
||||
New Features:
|
||||
- Add convex hull activation for VDB Activate SOP (requires 19.5).
|
||||
|
||||
Improvements:
|
||||
- Improved SDF activation to use dynamic node manager.
|
||||
|
||||
Bug Fixes:
|
||||
- Fixed a bug in VDB Visualize SOP where color values that exceed
|
||||
the range wrap around instead of being clamped.
|
||||
|
||||
NanoVDB:
|
||||
New Features:
|
||||
- Added nanovdb::IndexGrid that allows for arbitrary voxel values and even
|
||||
multiple channels to be associated with NanoVDB grids. They are more
|
||||
flexible and memory efficient than regular grids at a small cost of
|
||||
random-access performance. IndexGrids are constructed with the new
|
||||
nanovdb::IndexGridBuilder and accessed with the new
|
||||
nanovdb::ChannelAccessor.
|
||||
- Added iterators to all tree node classes for visiting inactive, active, or
|
||||
all values and child nodes.
|
||||
- NanoVDB.h now includes standalone implementations of reading and writing
|
||||
uncompressed nanovdb grids buffers.
|
||||
- Added Stats::getExtrema, which computes the min/max values of all voxels
|
||||
in a NanoVDB grid that intersects with a user-defined bounding-box.
|
||||
- Added nanovdb::Mask::countOn(int) which is essential to the new
|
||||
nanovdb::IndexGrid.
|
||||
- Added RootNode::probeChild and InternalNode::probeChild.
|
||||
|
||||
Improvements:
|
||||
- Added a new much improved nanovdb::NodeManager, that is both faster and
|
||||
more memory efficient, and that works on both the CPU and GPU. Note, it
|
||||
uses a handle for allocation (just like nanovdb::Grid) and replaces the
|
||||
old nanovdb::LeafManager which is now deprecated.
|
||||
- NanoToOpenVDB is extended to work with grids templated on Fp4, Fp8, Fp16,
|
||||
FpN, bool and ValueMask.
|
||||
- Renamed RootNode::findTile to RootNode::probeTile and made it public.
|
||||
- Made Mask::getWord return both a const and non-const reference.
|
||||
- Improved unit-tests to use explicit 32B alignment (see alignment bug-fix
|
||||
below).
|
||||
- PNanoVDB.h (a C99 port of NanoVDB.h) has been updated.
|
||||
|
||||
Bug Fixes:
|
||||
- Fixed a bug in nanovdb::HostBuffer that could produce crashes due to
|
||||
misaligned CPU memory allocations.
|
||||
- Fixed bug related to uninitialized memory in nanovdb::Grid which could
|
||||
confuse CRC32 checksum validation.
|
||||
- Fixed bugs related to the use of intrinsic functions for fast bit-counting
|
||||
in nanovdb.
|
||||
- Fixed a potential security vulnerability in NanoVDB.h related to buffer
|
||||
overflow exploits.
|
||||
|
||||
Build:
|
||||
- Added OPENVDB_USE_DELAYED_LOAD flag that enables delayed loading and
|
||||
defaults to on.
|
||||
- Add a placeholder to inject the specific revision and URL used
|
||||
to build OpenVDB, useful for 3rd party build scripts to publish
|
||||
their exact versions.
|
||||
- Fixed an issue where OPENVDB_AX_DLL was not being defined on shared
|
||||
library builds of AX, resulting in symbols not being exported.
|
||||
[Reported by Ray Molenkamp]
|
||||
- Fixed an issue where setting Tbb_INCLUDE_DIR could cause CMake failures.
|
||||
- Updated FindTBB.cmake to support newer library ABI suffixing in
|
||||
TBB 2021.5.
|
||||
- Updated FindBlosc.cmake to better handle cases where blosc is built with
|
||||
external sources.
|
||||
- Resolved LLVM deprecation warnings in AX and added support for LLVM 14.
|
||||
- On Windows (MSVC), OpenVDB is now built with extra compiler options to
|
||||
ensure stricter C++ conformance: /permissive- /Zc:throwingNew /Zc:inline.
|
||||
- On Windows (MSVC), the _USE_MATH_DEFINES macro is no longer defined when
|
||||
including <openvdb/Platform.h> (or any dependent headers). If you were
|
||||
relying on this in your own project for M_PI, M_PI_2, etc. you can add
|
||||
-D_USE_MATH_DEFINES to your own project compiler options. See
|
||||
https://docs.microsoft.com/en-us/cpp/c-runtime-library/math-constants
|
||||
for more info.
|
||||
|
||||
Version 9.1.0 - June 9, 2022
|
||||
Version 9.0.1 - In development
|
||||
|
||||
Bug Fixes:
|
||||
- Minor fix to move assignment operator in nanovdb/util/HostBuffer.h.
|
||||
This could potentially be a problem on Windows debug builds (unconfirmed).
|
||||
- Minor fix to range in openvdb/tools/LevelSetSphere.h. This could result
|
||||
in data races for multi-threaded execution (unconfirmed)
|
||||
[Reported by Tommy Hinks]
|
||||
- Fixed a bug with Tree::combineExtended which wouldn't propagate the
|
||||
resulting active state when a destination tile overlapped a source child node.
|
||||
[Reported by @frapit]
|
||||
in data races for multi-threaded execution (unconfirmed) [Reported by Tommy Hinks]
|
||||
- Fixed a bug with Tree::combineExtended which wouldn't propagate the resulting active state when a destination tile overlapped a source child node. [Reported by @frapit]
|
||||
- Fix unit tests failures with Blosc versions >= 1.19.0.
|
||||
- Fixed a regression in ax::run which wouldn't propagate exceptions
|
||||
- Fixed a bug where ax::ast::parse could return a partially constructed but
|
||||
invalid AST on failure
|
||||
- Fixed AX logger exit handling in ax::Compiler::compile and ax::ast::parse
|
||||
- Fixed an issue which could result in significant compilation times when
|
||||
instantiating TypeList<>::Unique<>
|
||||
|
||||
New features:
|
||||
- Added support for AMD's HIP API in NanoVDB
|
||||
[Contributed by Blender Foundation]
|
||||
- Added bindings mechanism to AX to allow differing data and AX attribute
|
||||
names (@) in Point and Volume executables.
|
||||
- Added support for AMD's HIP API in NanoVDB [Contributed by Blender Foundation]
|
||||
- Added bindings mechanism to AX to allow differing data and AX attribute names (@) in Point and Volume executables.
|
||||
- Added support for OpenVDB AX on Windows.
|
||||
- Added tools::memUsageIfLoaded() which returns the memory consumption of
|
||||
a deserialized VDB tree, useful if delay-loading is enabled.
|
||||
- Added points::rasterizeSpheres() and points::rasterizeSmoothSpheres()
|
||||
variants, new kernels and improved performance for OpenVDB points to
|
||||
surface rasterization.
|
||||
- Added points::rasterizeTrilinear() for OpenVDB points, fast staggered
|
||||
or colocated trilinear rasterization for scalar and vector attributes.
|
||||
- Exposed TypeList declarations in openvdb.h which denote the default set
|
||||
of types supported by OpenVDB.
|
||||
- Added points::FrustumRasterizer for efficient rasterization of OpenVDB
|
||||
points to frustum volumes with optional motion blur.
|
||||
|
||||
Improvements:
|
||||
- Added a --thread [n] argument to the vdb_ax binary.
|
||||
- Added a --copy-file-metadata option to vdb_ax. This behaviour is now
|
||||
off by default.
|
||||
- Added support for multiple input files with the vdb_ax binary using -i.
|
||||
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.
|
||||
- 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
|
||||
VDB grids.
|
||||
- Improved build support for MinGW
|
||||
[Contributed by Mehdi Chinoune]
|
||||
- Added a new foreach method to TypeList for iterating over types without
|
||||
constructing them.
|
||||
- Added TypeList::Transform declaration for transforming TypeLists into new
|
||||
types.
|
||||
- Moved Grid::apply implementation to TypeList::apply to allow for other
|
||||
polymorphic types to invoke it.
|
||||
- Minor updates to NanoVDB to remove compiler warnings.
|
||||
- Added a --copy-file-metadata option to vdb_ax. This behaviour is now off by default.
|
||||
- Added support for multiple input files with the vdb_ax binary using -i. 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]
|
||||
|
||||
Build:
|
||||
- Regenerated AX grammar with Flex 2.6.4 and Bison 3.8.2.
|
||||
- Improved locating NumPy in CMake when multiple python versions are installed.
|
||||
- Fixed an issue which could report Python as missing when using CMake 3.18
|
||||
and later on some systems.
|
||||
[Reported by Sam James]
|
||||
- Changed the way boost_python and boost_numpy are located. Both components
|
||||
must match the major/minor version of python in use. This can be
|
||||
circumvented by providing Boost_PYTHON_VERSION or
|
||||
Boost_PYTHON_VERSION_MAJOR.
|
||||
- Relocated OpenVDB binaries to a new openvdb_cmd root directory.
|
||||
- FindTBB.cmake now prioritises newer TBB installations.
|
||||
- Added option to compress PDB data in MSVC debug builds.
|
||||
- Fixed an issue which could report Python as missing when using CMake 3.18 and later on some systems. [Reported by Sam James]
|
||||
|
||||
Houdini:
|
||||
- Added Attribute Bindings to AX SOP to allow differently named AX
|
||||
attributes (@) and target point attributes/volumes.
|
||||
- Fix race condition in OpenVDB Merge SOP that could cause crashes or
|
||||
merged VDBs to not be deleted.
|
||||
- VDB Activate SOP no longer stops at the first non-VDB primitive, but
|
||||
instead just skips such primitives.
|
||||
- Added VDB Rasterize Frustum SOP for efficient rasterization of OpenVDB
|
||||
points into frustum volumes with optional motion blur.
|
||||
- Added Attribute Bindings to AX SOP to allow differently named AX attributes (@) and target point attributes/volumes.
|
||||
- Fix race condition in OpenVDB Merge SOP that could cause crashes
|
||||
or merged VDBs to not be deleted.
|
||||
|
||||
|
||||
Version 9.0.0 - October 29, 2021
|
||||
@@ -1348,7 +422,7 @@ Version 8.0.0 - December 23, 2020
|
||||
providing users with a new way of interacting with OpenVDB data. AX is
|
||||
tailored towards writing highly parallelizable and customizable OpenVDB
|
||||
volume and point kernel operations. See the documentation for more:
|
||||
https://www.openvdb.org/documentation/openvdbax.html
|
||||
https://academysoftwarefoundation.github.io/openvdb/openvdbax.html
|
||||
|
||||
New features:
|
||||
- Added tools::anyActiveVoxels and tools::anyActiveTiles that check
|
||||
|
||||
+83
-172
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[
|
||||
|
||||
@@ -18,12 +18,12 @@
|
||||
and required dependencies are expected. See the dependency documentation
|
||||
for more information:
|
||||
|
||||
https://www.openvdb.org/documentation/doxygen/dependencies.html
|
||||
https://academysoftwarefoundation.github.io/openvdb/dependencies.html
|
||||
|
||||
And the documentation on building OpenVDB for more in depth installation
|
||||
instructions:
|
||||
|
||||
https://www.openvdb.org/documentation/doxygen/build.html
|
||||
https://academysoftwarefoundation.github.io/openvdb/build.html
|
||||
|
||||
This CMakeLists file provides most available options for configuring the
|
||||
build and installation of all OpenVDB components. By default the core
|
||||
@@ -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.15)
|
||||
|
||||
# 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 9)
|
||||
set(OpenVDB_MINOR_VERSION 0)
|
||||
set(OpenVDB_PATCH_VERSION 1)
|
||||
set(OpenVDB_VERSION "${OpenVDB_MAJOR_VERSION}.${OpenVDB_MINOR_VERSION}.${OpenVDB_PATCH_VERSION}")
|
||||
@@ -64,7 +64,7 @@ project(OpenVDB LANGUAGES CXX VERSION ${OpenVDB_VERSION})
|
||||
include(CMakeDependentOption)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
# Components
|
||||
# todo epydoc and pdflatex
|
||||
option(OPENVDB_BUILD_CORE "Enable the core OpenVDB library. Both static and shared versions are enabled by default" ON)
|
||||
option(OPENVDB_BUILD_BINARIES "Enable the vdb binaries. Only vdb_print is enabled by default" ON)
|
||||
option(OPENVDB_BUILD_PYTHON_MODULE "Build the pyopenvdb Python module" OFF)
|
||||
@@ -72,42 +72,24 @@ option(OPENVDB_BUILD_UNITTESTS "Build the OpenVDB unit tests" OFF)
|
||||
option(OPENVDB_BUILD_DOCS "Build the OpenVDB documentation" OFF)
|
||||
option(OPENVDB_BUILD_HOUDINI_PLUGIN "Build the Houdini plugin" OFF)
|
||||
option(OPENVDB_BUILD_HOUDINI_ABITESTS "Build the Houdini ABI tests" OFF)
|
||||
option(OPENVDB_BUILD_MAYA_PLUGIN "Build the Maya plugin" OFF)
|
||||
|
||||
option(OPENVDB_BUILD_AX "Build the OpenVDB AX library. Turns ON if USE_AX is ON." ${USE_AX})
|
||||
option(OPENVDB_BUILD_AX_UNITTESTS "Build the OpenVDB AX unit tests" OFF)
|
||||
|
||||
option(OPENVDB_BUILD_NANOVDB "Build the NanoVDB library. Turns ON if USE_NANOVDB is ON." ${USE_NANOVDB})
|
||||
|
||||
# Global options
|
||||
option(OPENVDB_BUILD_MAYA_PLUGIN "Build the Maya plugin" OFF)
|
||||
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
|
||||
"Install the provided OpenVDB CMake modules when building the core library"
|
||||
ON "OPENVDB_BUILD_CORE" OFF)
|
||||
option(USE_CCACHE "Build using Ccache if found on the path" ON)
|
||||
# Disable this on Windows due to linker OOM issues:
|
||||
# LNK1248: image size (XXX) exceeds maximum allowable size (FFFFFFFF)
|
||||
# https://github.com/AcademySoftwareFoundation/openvdb/issues/1718
|
||||
# https://github.com/AcademySoftwareFoundation/openvdb/issues/1624
|
||||
cmake_dependent_option(USE_EXPLICIT_INSTANTIATION "Use explicit instantiation for all supported classes
|
||||
and methods against a pre-defined list of OpenVDB trees. This makes the core library larger and slower
|
||||
to compile, but speeds up the compilation of all dependent code by bypassing the expensive template
|
||||
instantation." ON "NOT WIN32" OFF)
|
||||
option(OPENVDB_FUTURE_DEPRECATION "Generate messages for upcoming deprecation" ON)
|
||||
option(OPENVDB_ENABLE_UNINSTALL "Adds a CMake uninstall target." ON)
|
||||
option(USE_COLORED_OUTPUT "Always produce ANSI-colored output (GNU/Clang only)." OFF)
|
||||
|
||||
# Component dependency options
|
||||
cmake_dependent_option(USE_PKGCONFIG "Use pkg-config to search for dependent libraries." ON "NOT WIN32" OFF)
|
||||
option(USE_HOUDINI [=[
|
||||
Build the library against a Houdini installation. Turns on automatically if OPENVDB_BUILD_HOUDINI_PLUGIN is enabled.
|
||||
When enabled, you do not need to provide dependency locations for TBB, Blosc, Imath and OpenEXR. Boost must be
|
||||
provided. Imath/OpenEXR can optionally be provided.]=] OFF)
|
||||
When enabled, you do not need to provide dependency locations for TBB, Blosc, IlmBase and OpenEXR. Boost must be
|
||||
provided. IlmBase/OpenEXR can optionally be provided if Houdini Version >= 17.5.]=] OFF)
|
||||
option(USE_MAYA [=[
|
||||
Build the library against a Maya installation. Turns on automatically if OPENVDB_BUILD_MAYA_PLUGIN is enabled.
|
||||
When enabled, you do not need to provide dependency locations for TBB. All other dependencies must be provided.]=] OFF)
|
||||
@@ -135,33 +117,10 @@ 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)
|
||||
option(USE_CCACHE "Build using Ccache if found on the path" ON)
|
||||
option(USE_STATIC_DEPENDENCIES [=[
|
||||
Only search for and use static libraries. If OFF the shared versions of requried libraries are prioritised, falling
|
||||
back to static libraries. Forcing individual static dependencies can be enabled by setting XXX_USE_STATIC_LIBS
|
||||
@@ -175,6 +134,17 @@ Disable CMakes default system search paths when locating dependencies. When enab
|
||||
its default system search routine if it cannot find a dependency with the provided settings. When disabled, only
|
||||
paths provided through the Xxx_ROOT, supported XXX_INCLUDEDIR/XXX_LIBRARYDIR variables or the SYSTEM_LIBRARY_PATHS
|
||||
list will be searched.]=] OFF)
|
||||
option(OPENVDB_USE_DEPRECATED_ABI_7 "Bypass minimum ABI requirement checks" OFF)
|
||||
option(OPENVDB_USE_DEPRECATED_ABI_8 "Bypass minimum ABI requirement checks" OFF)
|
||||
option(OPENVDB_USE_FUTURE_ABI_10 "Bypass future ABI check" OFF)
|
||||
option(OPENVDB_FUTURE_DEPRECATION "Generate messages for upcoming deprecation" ON)
|
||||
option(OPENVDB_ENABLE_UNINSTALL "Adds a CMake uninstall target." ON)
|
||||
option(USE_COLORED_OUTPUT "Always produce ANSI-colored output (GNU/Clang only)." OFF)
|
||||
cmake_dependent_option(USE_PKGCONFIG "Use pkg-config to search for dependent libraries." ON "NOT WIN32" OFF)
|
||||
|
||||
option(USE_EXPLICIT_INSTANTIATION "Use explicit instantiation for all supported classes and methods against a
|
||||
pre-defined list of OpenVDB trees. This makes the core library larger and slower to compile, but speeds up
|
||||
the compilation of all dependent code by bypassing the expensive template instantation." ON)
|
||||
|
||||
set(SYSTEM_LIBRARY_PATHS "" CACHE STRING [=[
|
||||
A global list of library paths to additionally use into when searching for dependencies.]=])
|
||||
@@ -182,7 +152,6 @@ set(MSVC_MP_THREAD_COUNT "" CACHE STRING [=[
|
||||
The number of threads to use when invoking MSVC builds with cmake --build. CMake defaults to 1. Note that
|
||||
cmake --parallel and CMAKE_BUILD_PARALLEL_LEVEL only change the number of PROJECTS that are built in parallel,
|
||||
NOT the number of TU's ]=])
|
||||
option(MSVC_COMPRESS_PDB "Whether to attempt to compress PDB symbol data in MSVC debug builds." OFF)
|
||||
|
||||
set(_CONCURRENT_MALLOC_OPTIONS None Auto Jemalloc Tbbmalloc)
|
||||
if(NOT CONCURRENT_MALLOC)
|
||||
@@ -200,6 +169,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()
|
||||
@@ -264,9 +246,11 @@ mark_as_advanced(
|
||||
OPENVDB_BUILD_HOUDINI_ABITESTS
|
||||
OPENVDB_CXX_STRICT
|
||||
OPENVDB_ENABLE_RPATH
|
||||
OPENVDB_USE_DELAYED_LOADING
|
||||
OPENVDB_FUTURE_DEPRECATION
|
||||
OPENVDB_SIMD
|
||||
OPENVDB_USE_DEPRECATED_ABI_7
|
||||
OPENVDB_USE_DEPRECATED_ABI_8
|
||||
OPENVDB_USE_FUTURE_ABI_10
|
||||
SYSTEM_LIBRARY_PATHS
|
||||
USE_CCACHE
|
||||
USE_COLORED_OUTPUT
|
||||
@@ -274,7 +258,6 @@ mark_as_advanced(
|
||||
USE_IMATH_HALF
|
||||
USE_LOG4CPLUS
|
||||
USE_MAYA
|
||||
MSVC_COMPRESS_PDB
|
||||
)
|
||||
|
||||
#########################################################################
|
||||
@@ -283,20 +266,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})
|
||||
endforeach()
|
||||
option(OPENVDB_USE_FUTURE_ABI_${FUTURE_OPENVDB_ABI_VERSION} "Bypass future ABI check" OFF)
|
||||
mark_as_advanced(OPENVDB_USE_FUTURE_ABI_${FUTURE_OPENVDB_ABI_VERSION})
|
||||
|
||||
#########################################################################
|
||||
|
||||
enable_testing()
|
||||
@@ -306,35 +275,13 @@ enable_testing()
|
||||
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()
|
||||
# @todo fix our glew cmake module
|
||||
|
||||
if(OPENVDB_INSTALL_CMAKE_MODULES)
|
||||
set(OPENVDB_CMAKE_MODULES
|
||||
cmake/FindBlosc.cmake
|
||||
cmake/FindJemalloc.cmake
|
||||
cmake/FindIlmBase.cmake
|
||||
cmake/FindLog4cplus.cmake
|
||||
cmake/FindOpenEXR.cmake
|
||||
cmake/FindOpenVDB.cmake
|
||||
@@ -344,7 +291,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
|
||||
@@ -393,54 +340,56 @@ endif()
|
||||
if(USE_CCACHE)
|
||||
find_program(CCACHE_PATH ccache)
|
||||
if(CCACHE_PATH)
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PATH})
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
|
||||
message(STATUS "Using ccache: ${CCACHE_PATH}")
|
||||
endif()
|
||||
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)
|
||||
|
||||
#########################################################################
|
||||
|
||||
# Configure malloc library. Use Jemalloc if available, tbbmalloc otherwise
|
||||
# Configure malloc library. Use Jemalloc for Linux and non-Maya, otherwise Tbbmalloc.
|
||||
# * On Mac OSX, linking against Jemalloc < 4.3.0 seg-faults with this error:
|
||||
# malloc: *** malloc_zone_unregister() failed for 0xaddress
|
||||
# Houdini 17.5 and older ships with Jemalloc 3.6.0, so we make Tbbmalloc the default
|
||||
# on Mac OSX (https://github.com/jemalloc/jemalloc/issues/420). Later versions of
|
||||
# Jemalloc are thought to work, but haven't been tested.
|
||||
# * On Windows, we follow SideFX's example in using Tbbmalloc due to the challenges
|
||||
# of injecting into the Windows runtime to replace the system allocator.
|
||||
|
||||
if(CONCURRENT_MALLOC STREQUAL "Auto")
|
||||
find_package(Jemalloc QUIET)
|
||||
if(NOT TARGET Jemalloc::jemalloc)
|
||||
message(WARNING "Unable to find Jemalloc, attempting to fall back to TBB malloc.
|
||||
It is recommended to use Jemalloc for optimum performance.")
|
||||
if((OPENVDB_BUILD_BINARIES OR OPENVDB_BUILD_UNITTESTS) AND CONCURRENT_MALLOC STREQUAL "Auto")
|
||||
if(WIN32 OR APPLE OR USE_MAYA)
|
||||
set(CONCURRENT_MALLOC "Tbbmalloc")
|
||||
else()
|
||||
set(CONCURRENT_MALLOC "Jemalloc")
|
||||
find_package(Jemalloc QUIET)
|
||||
if(NOT TARGET Jemalloc::jemalloc)
|
||||
message(WARNING "Unable to find Jemalloc, attempting to fall back to TBB malloc.
|
||||
It is recommended to use Jemalloc for optimum performance.")
|
||||
set(CONCURRENT_MALLOC "Tbbmalloc")
|
||||
else()
|
||||
set(CONCURRENT_MALLOC "Jemalloc")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Configure SIMD. AVX implies SSE 4.2.
|
||||
|
||||
if(OPENVDB_SIMD STREQUAL "AVX")
|
||||
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-mavx>")
|
||||
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-msse4.2>")
|
||||
add_compile_definitions("$<$<COMPILE_LANGUAGE:CXX>:OPENVDB_USE_AVX>")
|
||||
add_compile_definitions("$<$<COMPILE_LANGUAGE:CXX>:OPENVDB_USE_SSE42>")
|
||||
elseif(OPENVDB_SIMD STREQUAL "SSE42")
|
||||
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-msse4.2>")
|
||||
add_compile_definitions("$<$<COMPILE_LANGUAGE:CXX>:OPENVDB_USE_SSE42>")
|
||||
endif()
|
||||
|
||||
#########################################################################
|
||||
|
||||
# Configure our cmake modules to only search for static libraries
|
||||
@@ -448,6 +397,7 @@ endif()
|
||||
if(USE_STATIC_DEPENDENCIES)
|
||||
set(BLOSC_USE_STATIC_LIBS ON)
|
||||
set(OPENEXR_USE_STATIC_LIBS ON)
|
||||
set(ILMBASE_USE_STATIC_LIBS ON)
|
||||
set(TBB_USE_STATIC_LIBS ON)
|
||||
set(LOG4CPLUS_USE_STATIC_LIBS ON)
|
||||
set(JEMALLOC_USE_STATIC_LIBS ON)
|
||||
@@ -503,44 +453,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
|
||||
@@ -571,14 +483,14 @@ if(OpenVDB_ABI LESS MINIMUM_OPENVDB_ABI_VERSION)
|
||||
"no longer supported.")
|
||||
endif()
|
||||
|
||||
if(OpenVDB_ABI IN_LIST OPENVDB_DEPRECATED_ABI_LIST)
|
||||
if(FUTURE_MINIMUM_OPENVDB_ABI_VERSION AND OpenVDB_ABI LESS FUTURE_MINIMUM_OPENVDB_ABI_VERSION)
|
||||
if(NOT OPENVDB_USE_DEPRECATED_ABI_${OpenVDB_ABI})
|
||||
message(FATAL_ERROR "OpenVDB ABI versions earlier than ${OpenVDB_MAJOR_VERSION} "
|
||||
message(FATAL_ERROR "OpenVDB ABI versions earlier than ${FUTURE_MINIMUM_OPENVDB_ABI_VERSION} "
|
||||
"are deprecated. Set CMake option OPENVDB_USE_DEPRECATED_ABI_${OpenVDB_ABI} to ON to "
|
||||
"suppress this error.")
|
||||
endif()
|
||||
|
||||
message(DEPRECATION "OpenVDB ABI versions earlier than ${OpenVDB_MAJOR_VERSION} "
|
||||
message(DEPRECATION "OpenVDB ABI versions earlier than ${FUTURE_MINIMUM_OPENVDB_ABI_VERSION} "
|
||||
"are deprecated and will soon be removed.")
|
||||
# global target definition
|
||||
add_definitions(-DOPENVDB_USE_DEPRECATED_ABI_${OpenVDB_ABI})
|
||||
@@ -615,6 +527,10 @@ if(OPENVDB_BUILD_AX)
|
||||
add_subdirectory(openvdb_ax/openvdb_ax)
|
||||
endif()
|
||||
|
||||
if(OPENVDB_BUILD_AX_UNITTESTS)
|
||||
add_subdirectory(openvdb_ax/openvdb_ax/test)
|
||||
endif()
|
||||
|
||||
if(OPENVDB_BUILD_PYTHON_MODULE)
|
||||
add_subdirectory(openvdb/openvdb/python)
|
||||
endif()
|
||||
@@ -627,11 +543,6 @@ if(OPENVDB_BUILD_UNITTESTS)
|
||||
add_subdirectory(openvdb/openvdb/unittest)
|
||||
endif()
|
||||
|
||||
# Tests the vdb_ax binary so needs to come after openvdb_cmd
|
||||
if(OPENVDB_BUILD_AX_UNITTESTS)
|
||||
add_subdirectory(openvdb_ax/openvdb_ax/test)
|
||||
endif()
|
||||
|
||||
if(OPENVDB_BUILD_HOUDINI_PLUGIN)
|
||||
add_subdirectory(openvdb_houdini/openvdb_houdini)
|
||||
endif()
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+17
-24
@@ -10,7 +10,7 @@ The contributor role is the starting role for anyone participating in the projec
|
||||
|
||||
### Process for becoming a contributor
|
||||
|
||||
* Review the [coding standards](https://www.openvdb.org/documentation/doxygen/codingStyle.html) to ensure your contribution is in line with the project's coding and styling guidelines.
|
||||
* Review the [coding standards](https://academysoftwarefoundation.github.io/openvdb/codingStyle.html) to ensure your contribution is in line with the project's coding and styling guidelines.
|
||||
* Have a signed CLA on file ( see [below](#contributor-license-agreements) )
|
||||
* Submit your code as a PR with the appropriate [DCO sign-off](#commit-sign-off).
|
||||
* Have your submission approved by the [committer(s)](#committer) and merged into the codebase.
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
-4
@@ -12,7 +12,5 @@ The current OpenVDB maintainers are:
|
||||
| Dan Bailey | danbailey@ilm.com
|
||||
| Nick Avramoussis | navramoussis@wetafx.co.nz
|
||||
| Ken Museth | ken.museth@gmail.com
|
||||
| Andre Pradhana | andre.pradhana@gmail.com
|
||||
| Richard Jones | richardj@ilm.com
|
||||
| Gregory Hurst | tbd
|
||||
| Jonathan Swartz | tbd
|
||||
| Andre Pradhana | andre.pradhana@dreamworks.com
|
||||
| Richard Jones | rhj@dneg.com
|
||||
|
||||
@@ -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)
|
||||
@@ -1,76 +1,50 @@
|
||||

|
||||

|
||||
|
||||
| OpenVDB | AX | Nano | Houdini | License | CII |
|
||||
| :----: | :----: | :----: | :----: | :-----: | :-: |
|
||||
| [](https://github.com/AcademySoftwareFoundation/openvdb/actions/workflows/build.yml) | [](https://github.com/AcademySoftwareFoundation/openvdb/actions/workflows/ax.yml) | [](https://github.com/AcademySoftwareFoundation/openvdb/actions/workflows/nanovdb.yml) | [](https://github.com/AcademySoftwareFoundation/openvdb/actions/workflows/houdini.yml) | [](LICENSE) | [](https://bestpractices.coreinfrastructure.org/projects/2774) |
|
||||
[](LICENSE)
|
||||
[](https://bestpractices.coreinfrastructure.org/projects/2774)
|
||||
[](https://slack.aswf.io/)
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
| OpenVDB | AX | Nano | Houdini |
|
||||
| :----: | :----: | :----: | :----: |
|
||||
| [](https://github.com/AcademySoftwareFoundation/openvdb/actions/workflows/build.yml) | [](https://github.com/AcademySoftwareFoundation/openvdb/actions/workflows/ax.yml) | [](https://github.com/AcademySoftwareFoundation/openvdb/actions/workflows/nanovdb.yml) | [](https://github.com/AcademySoftwareFoundation/openvdb/actions/workflows/houdini.yml) |
|
||||
|
||||
[Website](https://www.openvdb.org) |
|
||||
[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) |
|
||||
[Slack](https://slack.aswf.io/)
|
||||
[Documentation](https://academysoftwarefoundation.github.io/openvdb)
|
||||
|
||||
OpenVDB is an open source C++ library comprising a novel hierarchical data structure and a large suite of tools for the efficient storage and manipulation of sparse volumetric data discretized on three-dimensional grids. It was developed by DreamWorks Animation for use in volumetric applications typically encountered in feature film production.
|
||||
|
||||
OpenVDB is an open source C++ library comprising a novel hierarchical data
|
||||
structure and a large suite of tools for the efficient storage and manipulation
|
||||
of sparse volumetric data discretized on three-dimensional grids. It was
|
||||
developed by DreamWorks Animation for use in volumetric applications typically
|
||||
encountered in feature film production.
|
||||
|
||||
### Development Repository
|
||||
|
||||
This GitHub repository hosts the trunk of the OpenVDB development. This implies
|
||||
that it is the newest public version with the latest features and bug fixes.
|
||||
However, it also means that it has not undergone a lot of testing and is
|
||||
generally less stable than the [production releases](https://github.com/AcademySoftwareFoundation/openvdb/releases).
|
||||
This GitHub repository hosts the trunk of the OpenVDB development. This implies that it is the newest public version with the latest features and bug fixes. However, it also means that it has not undergone a lot of testing and is generally less stable than the [production releases](https://github.com/AcademySoftwareFoundation/openvdb/releases).
|
||||
|
||||
|
||||
### License
|
||||
|
||||
OpenVDB is released under the [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0),
|
||||
which is a free, open source software license developed and maintained by the
|
||||
Apache Software Foundation.
|
||||
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 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.
|
||||
The trademarks of any contributor to this project may not be used in association with the project without the contributor's express permission.
|
||||
|
||||
### Contributing
|
||||
|
||||
OpenVDB welcomes contributions to the OpenVDB project. Please refer to the
|
||||
[contribution guidelines](CONTRIBUTING.md) for details on how to make a
|
||||
contribution.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
OpenVDB welcomes contributions to the OpenVDB project. Please refer to the [contribution guidelines](CONTRIBUTING.md) for details on how to make a contribution.
|
||||
|
||||
### Developer Quick Start
|
||||
|
||||
The following provides basic installation examples for the core OpenVDB library.
|
||||
Other components, such as the python module, OpenVDB AX, NanoVDB and various
|
||||
executables, may require additional dependencies. See the
|
||||
[build documentation](https://www.openvdb.org/documentation/doxygen/build.html)
|
||||
for help with installations.
|
||||
The following provides basic installation examples for the core OpenVDB library. Other components, such as the python module, OpenVDB AX, NanoVDB and various executables, may require additional dependencies. See the [build documentation](https://academysoftwarefoundation.github.io/openvdb/build.html) for help with installations.
|
||||
|
||||
##### Linux/MacOS
|
||||
#### Linux
|
||||
##### Installing Dependencies (Boost, TBB, Blosc)
|
||||
|
||||
```bash
|
||||
# Linux
|
||||
# @note If your distribution does not have required versions, consider using
|
||||
# apt pinning. See the dependency documentation for more details.
|
||||
apt-get install -y libboost-iostreams-dev
|
||||
apt-get install -y libtbb-dev
|
||||
apt-get install -y libblosc-dev
|
||||
|
||||
# MacOS
|
||||
# @note We are using homebrew in this example to install requried dependencies
|
||||
# https://brew.sh/
|
||||
brew install boost
|
||||
brew install tbb
|
||||
brew install c-blosc
|
||||
```
|
||||
|
||||
##### Building OpenVDB
|
||||
```bash
|
||||
git clone git@github.com:AcademySoftwareFoundation/openvdb.git
|
||||
cd openvdb
|
||||
@@ -79,25 +53,42 @@ cd build
|
||||
cmake ..
|
||||
make -j4 && make install
|
||||
```
|
||||
|
||||
##### Windows
|
||||
#### macOS
|
||||
##### Installing Dependencies (Boost, TBB, Blosc)
|
||||
```bash
|
||||
brew install boost
|
||||
brew install tbb
|
||||
brew install c-blosc
|
||||
```
|
||||
##### Building OpenVDB
|
||||
```bash
|
||||
git clone git@github.com:AcademySoftwareFoundation/openvdb.git
|
||||
cd openvdb
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
make -j4 && make install
|
||||
```
|
||||
#### Windows
|
||||
##### Installing Dependencies (Boost, TBB, Blosc)
|
||||
|
||||
Note that the following commands have only been tested for 64bit systems/libraries.
|
||||
It is recommended to set the `VCPKG_DEFAULT_TRIPLET` environment variable to
|
||||
`x64-windows` to use 64-bit libraries by default. You will also require
|
||||
[Visual Studio](https://visualstudio.microsoft.com/downloads/) (for the MSVC C++
|
||||
runtime and compiler toolchains), [CMake](https://cmake.org/download/) and optionally
|
||||
[vcpkg](https://github.com/microsoft/vcpkg) for the installation of OpenVDB's
|
||||
dependencies.
|
||||
[Git](https://git-scm.com/downloads), [vcpkg](https://github.com/microsoft/vcpkg)
|
||||
and [CMake](https://cmake.org/download/) to be installed.
|
||||
|
||||
```bash
|
||||
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-uuid:x64-windows
|
||||
vcpkg install boost-interprocess:x64-windows
|
||||
```
|
||||
|
||||
##### Building OpenVDB
|
||||
```bash
|
||||
git clone git@github.com:AcademySoftwareFoundation/openvdb.git
|
||||
cd openvdb
|
||||
@@ -107,19 +98,42 @@ cmake -DCMAKE_TOOLCHAIN_FILE=<PATH_TO_VCPKG>\scripts\buildsystems\vcpkg.cmake -D
|
||||
cmake --build . --parallel 4 --config Release --target install
|
||||
```
|
||||
|
||||
#### Building OpenVDB AX and NanoVDB
|
||||
#### Building OpenVDB AX
|
||||
|
||||
OpenVDB AX depends on the core OpenVDB library. NanoVDB can be built with and
|
||||
without OpenVDB support. Note that NanoVDB has its own build instructions, see
|
||||
the [NanoVDB build documentation](https://www.openvdb.org/documentation/doxygen/NanoVDB_HowToBuild.html)
|
||||
for details.
|
||||
OpenVDB AX depends on the core OpenVDB library. See the [build documentation](https://academysoftwarefoundation.github.io/openvdb/build.html) for all available AX component options:
|
||||
|
||||
The following variables can be passed to the `cmake` configure command. There
|
||||
are more optional VDB components, see the [build documentation](https://www.openvdb.org/documentation/doxygen/build.html)
|
||||
for a complete list.
|
||||
```bash
|
||||
git clone git@github.com:AcademySoftwareFoundation/openvdb.git
|
||||
cd openvdb
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DOPENVDB_BUILD_AX=ON ..
|
||||
make -j4 && make install
|
||||
```
|
||||
|
||||
| Option | Details |
|
||||
| :---- | :----- |
|
||||
| `-D OPENVDB_BUILD_AX=ON` | to enable OpenVDB AX |
|
||||
| `-D OPENVDB_BUILD_NANOVDB=ON` | to enable NanoVDB |
|
||||
| `-D NANOVDB_USE_OPENVDB=ON` | to use OpenVDB in NanoVDB |
|
||||
#### Building NanoVDB
|
||||
|
||||
NanoVDB can be built with and without OpenVDB support. To see full build instructions
|
||||
see the [NanoVDB build documentation](https://academysoftwarefoundation.github.io/openvdb/NanoVDB_HowToBuild.html)
|
||||
|
||||
#### Building Without OpenVDB Support
|
||||
|
||||
```bash
|
||||
git clone git@github.com:AcademySoftwareFoundation/openvdb.git
|
||||
cd openvdb/nanovdb/nanovdb # Build from the subdirectory
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
make -j4 && make install
|
||||
```
|
||||
|
||||
#### Building With OpenVDB Support
|
||||
|
||||
```bash
|
||||
git clone git@github.com:AcademySoftwareFoundation/openvdb.git
|
||||
cd openvdb
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DOPENVDB_BUILD_NANOVDB=ON ..
|
||||
make -j4 && make install
|
||||
```
|
||||
|
||||
+12
-50
@@ -1,11 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -e
|
||||
|
||||
CI_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)
|
||||
|
||||
# print versions
|
||||
bash --version
|
||||
if [ ! -z "$CXX" ]; then $CXX -v; fi
|
||||
@@ -31,33 +27,16 @@ declare -A PARMS
|
||||
PARMS[--components]=core,bin
|
||||
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
|
||||
else
|
||||
# Github actions runners have 2 threads
|
||||
# https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners
|
||||
if [[ $CXX == "g++" ]]; then
|
||||
# GCC hits memory limits on runners, build in serial
|
||||
PARMS[-j]=1
|
||||
else
|
||||
PARMS[-j]=2
|
||||
fi
|
||||
fi
|
||||
# github actions runners have 2 threads
|
||||
# https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners
|
||||
PARMS[-j]=2
|
||||
|
||||
# Available options for --components
|
||||
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 +52,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'
|
||||
|
||||
################################################
|
||||
|
||||
@@ -131,15 +108,7 @@ if HAS_PARM -v || HAS_PARM --verbose; then
|
||||
# support older versions of CMake.
|
||||
CMAKE_EXTRA+=("-DCMAKE_VERBOSE_MAKEFILE=ON")
|
||||
fi
|
||||
if HAS_PARM --build-type; then
|
||||
CMAKE_EXTRA+=("-DCMAKE_BUILD_TYPE=${PARMS[--build-type]}")
|
||||
build_type="${PARMS[--build-type]}"
|
||||
debug="Debug"
|
||||
# Ignore case - if the build-type is Debug, we enable asserts
|
||||
if [ "${build_type,,}" = "${debug,,}" ]; then
|
||||
CMAKE_EXTRA+=("-DOPENVDB_ENABLE_ASSERTS=ON")
|
||||
fi
|
||||
fi
|
||||
if HAS_PARM --build-type; then CMAKE_EXTRA+=("-DCMAKE_BUILD_TYPE=${PARMS[--build-type]}"); fi
|
||||
|
||||
# Available components. If a component is not provided it is
|
||||
# explicitly set to OFF.
|
||||
@@ -158,16 +127,12 @@ 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
|
||||
|
||||
################################################
|
||||
|
||||
# github actions runners have 8 threads
|
||||
# github actions runners have 2 threads
|
||||
# https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners
|
||||
export CMAKE_BUILD_PARALLEL_LEVEL=${PARMS[-j]}
|
||||
echo "Build using ${CMAKE_BUILD_PARALLEL_LEVEL} threads"
|
||||
@@ -194,15 +159,12 @@ cd ${BUILD_DIR}
|
||||
set -x
|
||||
|
||||
# Note:
|
||||
# - OPENVDB_BUILD_BINARIES is always ON, but each binary will be toggled depending on the provided comps
|
||||
# - 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).
|
||||
# - print and lod binary options are always on and can be toggles with: OPENVDB_BUILD_BINARIES=ON/OFF
|
||||
cmake \
|
||||
-DOPENVDB_USE_DEPRECATED_ABI_11=ON \
|
||||
-DOPENVDB_USE_DEPRECATED_ABI_12=ON \
|
||||
-DOPENVDB_TOOL_USE_NANO=OFF \
|
||||
-DOPENVDB_BUILD_BINARIES=ON \
|
||||
-DOPENVDB_BUILD_PYTHON_UNITTESTS=ON \
|
||||
-DOPENVDB_USE_DEPRECATED_ABI_7=ON \
|
||||
-DOPENVDB_USE_DEPRECATED_ABI_8=ON \
|
||||
-DOPENVDB_BUILD_VDB_PRINT=ON \
|
||||
-DOPENVDB_BUILD_VDB_LOD=ON \
|
||||
-DMSVC_MP_THREAD_COUNT=${PARMS[-j]} \
|
||||
"${CMAKE_EXTRA[@]}" \
|
||||
..
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
|
||||
Executable → Regular
+37
-87
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env python3
|
||||
#!/usr/local/bin/python
|
||||
#
|
||||
# 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:
|
||||
@@ -19,16 +19,16 @@ import base64
|
||||
import requests
|
||||
import hashlib
|
||||
import os
|
||||
import argparse
|
||||
import copy
|
||||
|
||||
# For progress bar printing
|
||||
try:
|
||||
from tqdm import tqdm
|
||||
has_tqdm = True
|
||||
except:
|
||||
has_tqdm = False
|
||||
pass
|
||||
# this argument is for the major.minor version of Houdini to download (such as 15.0, 15.5, 16.0)
|
||||
version = sys.argv[1]
|
||||
only_production = True if sys.argv[2] == 'ON' else False
|
||||
user_client_id = os.getenv('HOUDINI_CLIENT_ID')
|
||||
user_client_secret_key = os.getenv('HOUDINI_SECRET_KEY')
|
||||
|
||||
if not re.match('[0-9][0-9]\.[0-9]$', version):
|
||||
raise IOError('Invalid Houdini Version "%s", expecting in the form "major.minor" such as "16.0"' % version)
|
||||
|
||||
|
||||
# Code that provides convenient Python wrappers to call into the API:
|
||||
|
||||
@@ -94,7 +94,7 @@ def get_access_token_and_expiry_time(
|
||||
),
|
||||
})
|
||||
if response.status_code != 200:
|
||||
raise AuthorizationError(response.status_code, response.text)
|
||||
raise AuthorizationError(response.status_code, reponse.text)
|
||||
|
||||
response_json = response.json()
|
||||
access_token_expiry_time = time.time() - 2 + response_json["expires_in"]
|
||||
@@ -138,83 +138,33 @@ class APIError(Exception):
|
||||
self.http_code = http_code
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
service = service(
|
||||
access_token_url="https://www.sidefx.com/oauth2/application_token",
|
||||
client_id=user_client_id,
|
||||
client_secret_key=user_client_secret_key,
|
||||
endpoint_url="https://www.sidefx.com/api/",
|
||||
)
|
||||
|
||||
parser = argparse.ArgumentParser(description='Download a Houdini Installation')
|
||||
parser.add_argument('version', type=str, help='Major.Minor version of Houdini to download')
|
||||
parser.add_argument('platform', type=str, help='Platform target')
|
||||
parser.add_argument('--prod', action='store_true', help='Only download production builds')
|
||||
parser.add_argument('--list', action='store_true', help='Just list the available builds and exit.')
|
||||
args = parser.parse_args()
|
||||
releases_list = service.download.get_daily_builds_list(
|
||||
product='houdini', version=version, platform='linux', only_production=only_production)
|
||||
|
||||
version = args.version
|
||||
platform = args.platform
|
||||
only_production = args.prod
|
||||
latest_release = service.download.get_daily_build_download(
|
||||
product='houdini', version=version, platform='linux', build=releases_list[0]['build'])
|
||||
|
||||
user_client_id = os.getenv('HOUDINI_CLIENT_ID')
|
||||
user_client_secret_key = os.getenv('HOUDINI_SECRET_KEY')
|
||||
|
||||
if not re.match('[0-9][0-9]\.[0-9]$', version):
|
||||
raise IOError('Invalid Houdini Version "%s", expecting in the form "major.minor" such as "16.0"' % version)
|
||||
|
||||
service = service(
|
||||
access_token_url="https://www.sidefx.com/oauth2/application_token",
|
||||
client_id=user_client_id,
|
||||
client_secret_key=user_client_secret_key,
|
||||
endpoint_url="https://www.sidefx.com/api/",
|
||||
)
|
||||
|
||||
releases_list = service.download.get_daily_builds_list(
|
||||
product='houdini', version=version, platform=platform, only_production=only_production)
|
||||
|
||||
print('Available builds:')
|
||||
for rel in releases_list:
|
||||
rel = copy.deepcopy(rel)
|
||||
if 'third_party_libraries' in rel:
|
||||
# Don't print these
|
||||
del rel['third_party_libraries']
|
||||
print(rel)
|
||||
|
||||
if args.list:
|
||||
sys.exit(0)
|
||||
|
||||
print('Selecting build: ' + releases_list[0]['build'])
|
||||
|
||||
latest_release = service.download.get_daily_build_download(
|
||||
product='houdini', version=version, platform=platform, build=releases_list[0]['build'])
|
||||
print(latest_release)
|
||||
|
||||
# Can't do this procedurally as latest_release['filename'] can contain
|
||||
# multiple periods and may have multiple trailing extensions...
|
||||
extension = ''
|
||||
if 'linux' in platform: extension = 'tar.gz'
|
||||
elif 'macos' in platform: extension = 'dmg'
|
||||
elif 'win64' in platform: extension = 'exe'
|
||||
assert(extension in latest_release['filename'])
|
||||
|
||||
# Download the file and save it as hou.extension
|
||||
local_filename = 'hou.' + extension
|
||||
print('Writing to "' + local_filename + '"')
|
||||
|
||||
response = requests.get(latest_release['download_url'], stream=True)
|
||||
if response.status_code == 200:
|
||||
# Download the file as hou.tar.gz
|
||||
local_filename = 'hou.tar.gz'
|
||||
response = requests.get(latest_release['download_url'], stream=True)
|
||||
if response.status_code == 200:
|
||||
with open(local_filename, 'wb') as f:
|
||||
response.raw.decode_content = True
|
||||
if has_tqdm:
|
||||
file_size = int(response.headers.get('Content-Length', 0))
|
||||
desc = "(Unknown total file size)" if file_size == 0 else ""
|
||||
with tqdm.wrapattr(response.raw, "read", total=file_size, desc=desc) as r_raw:
|
||||
with open(local_filename, 'wb') as f:
|
||||
shutil.copyfileobj(r_raw, f)
|
||||
else:
|
||||
with open(local_filename, 'wb') as f:
|
||||
shutil.copyfileobj(response.raw, f)
|
||||
else:
|
||||
raise Exception('Error downloading file!')
|
||||
shutil.copyfileobj(response.raw, f)
|
||||
else:
|
||||
raise Exception('Error downloading file!')
|
||||
|
||||
# Verify the file checksum is matching
|
||||
file_hash = hashlib.md5()
|
||||
with open(local_filename, 'rb') as f:
|
||||
for chunk in iter(lambda: f.read(4096), b''):
|
||||
file_hash.update(chunk)
|
||||
if file_hash.hexdigest() != latest_release['hash']:
|
||||
raise Exception('Checksum does not match!')
|
||||
# Verify the file checksum is matching
|
||||
file_hash = hashlib.md5()
|
||||
with open(local_filename, 'rb') as f:
|
||||
for chunk in iter(lambda: f.read(4096), b''):
|
||||
file_hash.update(chunk)
|
||||
if file_hash.hexdigest() != latest_release['hash']:
|
||||
raise Exception('Checksum does not match!')
|
||||
|
||||
+37
-113
@@ -1,130 +1,54 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
HOUDINI_MAJOR="$1"
|
||||
PLATFORM="$2"
|
||||
OTHER_ARGS="$3"
|
||||
GOLD="$2"
|
||||
|
||||
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
|
||||
pip install --user requests
|
||||
|
||||
python3 ci/download_houdini.py $HOUDINI_MAJOR $PLATFORM $OTHER_ARGS
|
||||
python ci/download_houdini.py $HOUDINI_MAJOR $GOLD
|
||||
|
||||
if [[ $PLATFORM =~ "linux" ]]; then
|
||||
# create dir hierarchy
|
||||
mkdir -p hou/bin
|
||||
mkdir -p hou/houdini
|
||||
mkdir -p hou/toolkit
|
||||
mkdir -p hou/dsolib
|
||||
# create dir hierarchy
|
||||
mkdir -p hou/bin
|
||||
mkdir -p hou/houdini
|
||||
mkdir -p hou/toolkit
|
||||
mkdir -p hou/dsolib
|
||||
|
||||
# unpack hou.tar.gz and cleanup
|
||||
tar -xzf hou.tar.gz
|
||||
rm -rf hou.tar.gz
|
||||
cd houdini*
|
||||
tar -xzf houdini.tar.gz
|
||||
# unpack hou.tar.gz and cleanup
|
||||
tar -xzf hou.tar.gz
|
||||
rm -rf hou.tar.gz
|
||||
cd houdini*
|
||||
tar -xzf houdini.tar.gz
|
||||
|
||||
# copy required files into hou dir
|
||||
cp houdini_setup* ../hou/.
|
||||
# copy required files into hou dir
|
||||
cp houdini_setup* ../hou/.
|
||||
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/libHalf* ../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/.
|
||||
cp -r dsolib/libIlmImf* ../hou/dsolib/.
|
||||
|
||||
# report library names
|
||||
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/.
|
||||
cd ..
|
||||
|
||||
elif [[ $PLATFORM =~ "macos" ]]; then
|
||||
# Exract files by mounting the downloaded dmg (we only really want to
|
||||
# expand Houdini.framework)
|
||||
hdiutil attach hou.dmg
|
||||
pkgutil --expand-full /Volumes/Houdini/Houdini.pkg Houdini
|
||||
hdiutil detach /Volumes/Houdini
|
||||
rm hou.dmg
|
||||
|
||||
# Move the required Frameworks and delete the extracted src
|
||||
mkdir -p hou/Frameworks
|
||||
mv Houdini/Framework.pkg/Payload/Houdini.framework hou/Frameworks/Houdini.framework
|
||||
rm -rf Houdini
|
||||
|
||||
# Report library names
|
||||
ls -al hou/Frameworks/Houdini.framework/Libraries
|
||||
|
||||
# Remove unused resources
|
||||
cd hou/Frameworks/Houdini.framework/Resources/
|
||||
rm -rf $(ls | grep -e toolkit -v)
|
||||
cd -
|
||||
|
||||
# Handle libraries. On some versions of MacOS with older versions of ld,
|
||||
# ld will complain (error) if shared libraries contain missing files which
|
||||
# are referenced with LC_LOAD_DYLIB or LC_RPATH entries (even though they
|
||||
# are not explicitly required at link time). We still want to delete these
|
||||
# unused libs as they occupt ~1-2GB. To handle this, we generate a unique
|
||||
# list of libs that our direct dependencies reference and create an empty
|
||||
# shared dylib in their place.
|
||||
cd hou/Frameworks/Houdini.framework/Libraries
|
||||
# Remove any folders here, they aren't needed
|
||||
rm -rf $(ls -p | grep /)
|
||||
# Remove any library that does not match the -e patterns (inverse grep with -v)
|
||||
unused_libraries=$(ls | \
|
||||
grep -e libHoudini \
|
||||
-e libopenvdb_sesi \
|
||||
-e libblosc \
|
||||
-e libhboost \
|
||||
-e libz \
|
||||
-e libbz2 \
|
||||
-e libtbb \
|
||||
-e libjemalloc \
|
||||
-e liblzma \
|
||||
-e libIex \
|
||||
-e libImath \
|
||||
-e libIlmThread \
|
||||
-v)
|
||||
rm -rf ${unused_libraries}
|
||||
|
||||
# Create an empty valid shared lib
|
||||
echo '' | clang -x c -shared -o libempty.dylib -
|
||||
|
||||
# Generate a unique list of libs that our remaining libs reference
|
||||
for i in $(ls); do otool -LX $i >> libnames; done
|
||||
sort -u libnames | grep @rpath | cut -f1 -d' ' | xargs > rpaths
|
||||
|
||||
# Recreate unused libraries that have been deleted as empty shared dylibs
|
||||
# to keep ld happy
|
||||
for libpath in $(cat rpaths); do
|
||||
libpath=${libpath#"@rpath/"}
|
||||
echo "Checking $libpath"
|
||||
if [ ! -f $libpath ]; then
|
||||
echo "Creating empty library at $libpath"
|
||||
mkdir -p $(dirname $libpath)
|
||||
cp libempty.dylib $libpath
|
||||
fi
|
||||
done
|
||||
|
||||
rm libempty.dylib
|
||||
cd -
|
||||
# needed for < H18.0 (due to sesitag)
|
||||
if [ "$HOUDINI_MAJOR" == "17.0" ] || [ "$HOUDINI_MAJOR" == "17.5" ]; then
|
||||
cp -r bin/app_init* ../hou/bin/.
|
||||
cp -r bin/sesitag* ../hou/bin/.
|
||||
cp -r dsolib/lib* ../hou/dsolib/.
|
||||
fi
|
||||
|
||||
# write hou into hou.tar.gz and cleanup
|
||||
cd ..
|
||||
tar -czvf hou.tar.gz hou
|
||||
|
||||
# move hou.tar.gz into hou subdirectory
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
@@ -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 #
|
||||
|
||||
+1
-3
@@ -1,6 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
@@ -34,5 +32,5 @@ cmake \
|
||||
"${CMAKE_EXTRA[@]}" \
|
||||
..
|
||||
|
||||
make -j8
|
||||
make -j4
|
||||
make install
|
||||
|
||||
Executable
+15
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -ex
|
||||
|
||||
CMAKE_VERSION="$1"
|
||||
CMAKE_PACKAGE=cmake-${CMAKE_VERSION}-Linux-x86_64
|
||||
|
||||
wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/${CMAKE_PACKAGE}.tar.gz
|
||||
|
||||
tar -xf ${CMAKE_PACKAGE}.tar.gz
|
||||
cp ${CMAKE_PACKAGE}/bin/* /usr/local/bin/
|
||||
cp -r ${CMAKE_PACKAGE}/share/* /usr/local/share/
|
||||
|
||||
rm -rf ${CMAKE_PACKAGE}
|
||||
rm -rf ${CMAKE_PACKAGE}.tar.gz
|
||||
@@ -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,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 ../.
|
||||
make -j8
|
||||
cmake ../.
|
||||
make -j4
|
||||
make install
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
+5
-8
@@ -1,21 +1,18 @@
|
||||
#!/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}
|
||||
git checkout release-${GTEST_VERSION} -b v${GTEST_VERSION}
|
||||
fi
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
|
||||
cmake ..
|
||||
|
||||
make -j$(nproc)
|
||||
sudo make install
|
||||
cmake ../.
|
||||
make -j4
|
||||
make install
|
||||
|
||||
@@ -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
|
||||
@@ -1,58 +1,28 @@
|
||||
#!/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
|
||||
|
||||
cmake -B . -S ../llvm -A x64 -G "Visual Studio 17 2022" -Thost=x64 \
|
||||
# @note currently only test static builds with MT
|
||||
cmake -S ../llvm -A x64 -G "Visual Studio 16 2019" -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 ..
|
||||
|
||||
|
||||
+16
-31
@@ -1,52 +1,37 @@
|
||||
#!/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
|
||||
brew install c-blosc
|
||||
brew install cmake
|
||||
brew install ilmbase
|
||||
brew install openexr@2
|
||||
brew install boost
|
||||
brew install boost-python3 # also installs the dependent python version
|
||||
brew install tbb@2020
|
||||
brew install zlib
|
||||
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 zlib
|
||||
brew install jemalloc
|
||||
|
||||
# Alias python version installed by nanobind to path
|
||||
py_version=$(brew info nanobind --json | \
|
||||
# Alias python version installed by boost-python3 to path
|
||||
py_version=$(brew info boost-python3 --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
|
||||
# Export OpenEXR paths which are no longer installed to /usr/local (as v2.x is deprecated)
|
||||
echo "IlmBase_ROOT=/usr/local/opt/ilmbase" >> $GITHUB_ENV
|
||||
echo "OpenEXR_ROOT=/usr/local/opt/openexr@2" >> $GITHUB_ENV
|
||||
echo "/usr/local/opt/openexr@2/bin" >> $GITHUB_PATH
|
||||
|
||||
# Export TBB paths which are no longer installed to /usr/local (as v2020 is deprecated)
|
||||
echo "TBB_ROOT=/usr/local/opt/tbb@2020" >> $GITHUB_ENV
|
||||
echo "/usr/local/opt/tbb@2020/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
|
||||
else
|
||||
brew install llvm@$LLVM_VERSION
|
||||
fi
|
||||
fi
|
||||
|
||||
Executable
+26
@@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Download and install deps from homebrew on macos
|
||||
|
||||
LLVM_VERSION=$1
|
||||
if [ -z $LLVM_VERSION ]; then
|
||||
echo "No LLVM version provided for LLVM installation"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
brew update
|
||||
brew install bash gnu-getopt # for CI scripts
|
||||
brew install cmake
|
||||
brew install boost
|
||||
brew install cppunit
|
||||
brew install c-blosc
|
||||
brew install tbb@2020
|
||||
brew install llvm@$LLVM_VERSION
|
||||
brew install zlib
|
||||
|
||||
# Export TBB paths which are no longer installed to /usr/local (as v2020 is deprecated)
|
||||
echo "TBB_ROOT=/usr/local/opt/tbb@2020" >> $GITHUB_ENV
|
||||
echo "/usr/local/opt/tbb@2020/bin" >> $GITHUB_PATH
|
||||
|
||||
# use gnu-getopt
|
||||
echo "/usr/local/opt/gnu-getopt/bin" >> $GITHUB_PATH
|
||||
@@ -1,30 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
PYBIND11_VERSION="$1"
|
||||
INSTALL_ROOT="$2"
|
||||
CMAKE_EXTRA=()
|
||||
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
|
||||
|
||||
if [ "$PYBIND11_VERSION" != "latest" ]; then
|
||||
git checkout tags/v${PYBIND11_VERSION} -b v${PYBIND11_VERSION}
|
||||
fi
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
|
||||
cmake \
|
||||
-DNB_TEST=OFF \
|
||||
"${CMAKE_EXTRA[@]}" \
|
||||
..
|
||||
|
||||
make -j8
|
||||
sudo make install
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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"
|
||||
Executable
+7
@@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -ex
|
||||
|
||||
vcpkg update
|
||||
vcpkg install zlib libpng openexr tbb gtest blosc glfw3 glew \
|
||||
boost-iostreams boost-any boost-uuid boost-interprocess boost-algorithm
|
||||
@@ -25,14 +25,11 @@ $CUDA_KNOWN_URLS = @{
|
||||
"11.2.0" = "https://developer.download.nvidia.com/compute/cuda/11.2.0/network_installers/cuda_11.2.0_win10_network.exe";
|
||||
"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.3.0" = "https://developer.download.nvidia.com/compute/cuda/11.3.0/network_installers/cuda_11.3.0_win10_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";
|
||||
"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.
|
||||
@@ -46,7 +43,6 @@ $CUDA_PACKAGES_IN = @(
|
||||
"curand_dev";
|
||||
"nvrtc_dev";
|
||||
"cudart";
|
||||
"thrust";
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -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
@@ -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.15)
|
||||
project(TestInstall LANGUAGES CXX)
|
||||
find_package(OpenVDB REQUIRED COMPONENTS openvdb)
|
||||
add_executable(test_vdb_print \"../openvdb_cmd/vdb_print/main.cc\")
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
set -ex
|
||||
|
||||
|
||||
@@ -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))
|
||||
@@ -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})
|
||||
+24
-72
@@ -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.15)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
mark_as_advanced(
|
||||
@@ -188,6 +188,20 @@ list(APPEND _BLOSC_LIBRARYDIR_SEARCH_DIRS
|
||||
${SYSTEM_LIBRARY_PATHS}
|
||||
)
|
||||
|
||||
# Library suffix handling
|
||||
|
||||
set(_BLOSC_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||
|
||||
if(MSVC)
|
||||
if(BLOSC_USE_STATIC_LIBS)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".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 +244,11 @@ 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})
|
||||
unset(_BLOSC_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
|
||||
|
||||
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
|
||||
@@ -357,76 +376,9 @@ if(NOT TARGET Blosc::blosc)
|
||||
set_target_properties(Blosc::blosc PROPERTIES
|
||||
INTERFACE_LINK_DIRECTORIES
|
||||
"\$<\$<CONFIG:Release>:${Blosc_RELEASE_LIBRARY_DIRS}>;\$<\$<CONFIG:Debug>:${Blosc_DEBUG_LIBRARY_DIRS}>")
|
||||
|
||||
set(BLOSC_EXTERNAL_LIBRARIES lz4 snappy zlib zstd)
|
||||
|
||||
foreach(BLOSC_EXTERNAL_LIB ${BLOSC_EXTERNAL_LIBRARIES})
|
||||
|
||||
foreach(BUILD_TYPE ${BLOSC_BUILD_TYPES})
|
||||
set(_BLOSC_CMAKE_IGNORE_PATH ${CMAKE_IGNORE_PATH})
|
||||
|
||||
if(VCPKG_TOOLCHAIN)
|
||||
if(BUILD_TYPE STREQUAL RELEASE)
|
||||
list(APPEND CMAKE_IGNORE_PATH ${Blosc_DEBUG_LIBRARY_DIRS})
|
||||
else()
|
||||
list(APPEND CMAKE_IGNORE_PATH ${Blosc_RELEASE_LIBRARY_DIRS})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
find_library(${BLOSC_EXTERNAL_LIB}_LIBRARY_${BUILD_TYPE} ${BLOSC_EXTERNAL_LIB}
|
||||
${_FIND_BLOSC_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_BLOSC_LIBRARYDIR_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} lib64 lib)
|
||||
|
||||
if(NOT ${BLOSC_EXTERNAL_LIB}_LIBRARY_${BUILD_TYPE})
|
||||
if(BUILD_TYPE STREQUAL DEBUG)
|
||||
find_library(${BLOSC_EXTERNAL_LIB}_LIBRARY_${BUILD_TYPE} "${BLOSC_EXTERNAL_LIB}d"
|
||||
${_FIND_BLOSC_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_BLOSC_LIBRARYDIR_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} lib64 lib)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(CMAKE_IGNORE_PATH ${_BLOSC_CMAKE_IGNORE_PATH})
|
||||
endforeach()
|
||||
|
||||
if(${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG AND ${BLOSC_EXTERNAL_LIB}_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(${BLOSC_EXTERNAL_LIB}_LIBRARY optimized ${${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE} debug ${${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG})
|
||||
else()
|
||||
# For single-config generators where CMAKE_BUILD_TYPE has no value,
|
||||
# just use the release libraries
|
||||
set(${BLOSC_EXTERNAL_LIB}_LIBRARY ${${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE})
|
||||
endif()
|
||||
# FIXME: This probably should be set for both cases
|
||||
set(${BLOSC_EXTERNAL_LIB}_LIBRARIES optimized ${${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE} debug ${${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG})
|
||||
endif()
|
||||
|
||||
# if only the release version was found, set the debug variable also to the release version
|
||||
if(${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE AND NOT ${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG)
|
||||
set(${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG ${${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE})
|
||||
set(${BLOSC_EXTERNAL_LIB}_LIBRARY ${${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE})
|
||||
set(${BLOSC_EXTERNAL_LIB}_LIBRARIES ${${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE})
|
||||
endif()
|
||||
|
||||
# if only the debug version was found, set the release variable also to the debug version
|
||||
if(${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG AND NOT ${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE)
|
||||
set(${BLOSC_EXTERNAL_LIB}_LIBRARY_RELEASE ${${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG})
|
||||
set(${BLOSC_EXTERNAL_LIB}_LIBRARY ${${BLOSC_EXTERNAL_LIB}_LIBRARY_DEBUG})
|
||||
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()
|
||||
|
||||
endforeach()
|
||||
target_link_libraries(Blosc::blosc INTERFACE
|
||||
$<$<CONFIG:Release>:lz4;snappy;zlib;zstd>
|
||||
$<$<CONFIG:Debug>:lz4d;snappyd;zlibd;zstd>)
|
||||
endif()
|
||||
|
||||
endif()
|
||||
|
||||
|
||||
@@ -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.15)
|
||||
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()
|
||||
@@ -0,0 +1,447 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
FindIlmBase
|
||||
-----------
|
||||
|
||||
Find IlmBase include dirs and libraries
|
||||
|
||||
Use this module by invoking find_package with the form::
|
||||
|
||||
find_package(IlmBase
|
||||
[version] [EXACT] # Minimum or EXACT version
|
||||
[REQUIRED] # Fail with error if IlmBase is not found
|
||||
[COMPONENTS <libs>...] # IlmBase libraries by their canonical name
|
||||
# e.g. "Half" for "libHalf"
|
||||
)
|
||||
|
||||
IMPORTED Targets
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``IlmBase::Half``
|
||||
The Half library target.
|
||||
``IlmBase::Iex``
|
||||
The Iex library target.
|
||||
``IlmBase::IexMath``
|
||||
The IexMath library target.
|
||||
``IlmBase::IlmThread``
|
||||
The IlmThread library target.
|
||||
``IlmBase::Imath``
|
||||
The Imath library target.
|
||||
|
||||
Result Variables
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
This will define the following variables:
|
||||
|
||||
``IlmBase_FOUND``
|
||||
True if the system has the IlmBase library.
|
||||
``IlmBase_VERSION``
|
||||
The version of the IlmBase library which was found.
|
||||
``IlmBase_INCLUDE_DIRS``
|
||||
Include directories needed to use IlmBase.
|
||||
``IlmBase_RELEASE_LIBRARIES``
|
||||
Libraries needed to link to the release version of IlmBase.
|
||||
``IlmBase_RELEASE_LIBRARY_DIRS``
|
||||
IlmBase release library directories.
|
||||
``IlmBase_DEBUG_LIBRARIES``
|
||||
Libraries needed to link to the debug version of IlmBase.
|
||||
``IlmBase_DEBUG_LIBRARY_DIRS``
|
||||
IlmBase debug library directories.
|
||||
``IlmBase_{COMPONENT}_FOUND``
|
||||
True if the system has the named IlmBase component.
|
||||
|
||||
Deprecated - use [RELEASE|DEBUG] variants:
|
||||
|
||||
``IlmBase_LIBRARIES``
|
||||
Libraries needed to link to IlmBase.
|
||||
``IlmBase_LIBRARY_DIRS``
|
||||
IlmBase library directories.
|
||||
|
||||
Cache Variables
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
The following cache variables may also be set:
|
||||
|
||||
``IlmBase_INCLUDE_DIR``
|
||||
The directory containing ``IlmBase/config-auto.h``.
|
||||
``IlmBase_{COMPONENT}_LIBRARY``
|
||||
Individual component libraries for IlmBase. may include target_link_libraries() debug/optimized keywords.
|
||||
``IlmBase_{COMPONENT}_LIBRARY_RELEASE``
|
||||
Individual component libraries for IlmBase release
|
||||
``IlmBase_{COMPONENT}_LIBRARY_DEBUG``
|
||||
Individual component libraries for IlmBase debug
|
||||
|
||||
Hints
|
||||
^^^^^
|
||||
|
||||
Instead of explicitly setting the cache variables, the following variables
|
||||
may be provided to tell this module where to look.
|
||||
|
||||
``IlmBase_ROOT``
|
||||
Preferred installation prefix.
|
||||
``ILMBASE_INCLUDEDIR``
|
||||
Preferred include directory e.g. <prefix>/include
|
||||
``ILMBASE_LIBRARYDIR``
|
||||
Preferred library directory e.g. <prefix>/lib
|
||||
``ILMBASE_DEBUG_SUFFIX``
|
||||
Suffix of the debug version of ilmbase libs. Defaults to "_d".
|
||||
``SYSTEM_LIBRARY_PATHS``
|
||||
Global list of library paths intended to be searched by and find_xxx call
|
||||
``ILMBASE_USE_STATIC_LIBS``
|
||||
Only search for static ilmbase libraries
|
||||
``DISABLE_CMAKE_SEARCH_PATHS``
|
||||
Disable CMakes default search paths for find_xxx calls in this module
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
mark_as_advanced(
|
||||
IlmBase_INCLUDE_DIR
|
||||
IlmBase_LIBRARY
|
||||
)
|
||||
|
||||
set(_FIND_ILMBASE_ADDITIONAL_OPTIONS "")
|
||||
if(DISABLE_CMAKE_SEARCH_PATHS)
|
||||
set(_FIND_ILMBASE_ADDITIONAL_OPTIONS NO_DEFAULT_PATH)
|
||||
endif()
|
||||
|
||||
set(_ILMBASE_COMPONENT_LIST
|
||||
Half
|
||||
Iex
|
||||
IexMath
|
||||
IlmThread
|
||||
Imath
|
||||
)
|
||||
|
||||
if(IlmBase_FIND_COMPONENTS)
|
||||
set(ILMBASE_COMPONENTS_PROVIDED TRUE)
|
||||
set(_IGNORED_COMPONENTS "")
|
||||
foreach(COMPONENT ${IlmBase_FIND_COMPONENTS})
|
||||
if(NOT ${COMPONENT} IN_LIST _ILMBASE_COMPONENT_LIST)
|
||||
list(APPEND _IGNORED_COMPONENTS ${COMPONENT})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
if(_IGNORED_COMPONENTS)
|
||||
message(STATUS "Ignoring unknown components of IlmBase:")
|
||||
foreach(COMPONENT ${_IGNORED_COMPONENTS})
|
||||
message(STATUS " ${COMPONENT}")
|
||||
endforeach()
|
||||
list(REMOVE_ITEM IlmBase_FIND_COMPONENTS ${_IGNORED_COMPONENTS})
|
||||
endif()
|
||||
else()
|
||||
set(ILMBASE_COMPONENTS_PROVIDED FALSE)
|
||||
set(IlmBase_FIND_COMPONENTS ${_ILMBASE_COMPONENT_LIST})
|
||||
endif()
|
||||
|
||||
# Set _ILMBASE_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 ILMBASE_ROOT from CMake 3.12
|
||||
if(IlmBase_ROOT)
|
||||
set(_ILMBASE_ROOT ${IlmBase_ROOT})
|
||||
elseif(DEFINED ENV{IlmBase_ROOT})
|
||||
set(_ILMBASE_ROOT $ENV{IlmBase_ROOT})
|
||||
elseif(ILMBASE_ROOT)
|
||||
set(_ILMBASE_ROOT ${ILMBASE_ROOT})
|
||||
elseif(DEFINED ENV{ILMBASE_ROOT})
|
||||
set(_ILMBASE_ROOT $ENV{ILMBASE_ROOT})
|
||||
endif()
|
||||
|
||||
# Additionally try and use pkconfig to find IlmBase
|
||||
if(USE_PKGCONFIG)
|
||||
if(NOT DEFINED PKG_CONFIG_FOUND)
|
||||
find_package(PkgConfig)
|
||||
endif()
|
||||
if(PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(PC_IlmBase QUIET ilmbase)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# ------------------------------------------------------------------------
|
||||
# Search for IlmBase include DIR
|
||||
# ------------------------------------------------------------------------
|
||||
|
||||
set(_ILMBASE_INCLUDE_SEARCH_DIRS "")
|
||||
list(APPEND _ILMBASE_INCLUDE_SEARCH_DIRS
|
||||
${ILMBASE_INCLUDEDIR}
|
||||
${_ILMBASE_ROOT}
|
||||
${PC_IlmBase_INCLUDEDIR}
|
||||
${SYSTEM_LIBRARY_PATHS}
|
||||
)
|
||||
|
||||
# Look for a standard IlmBase header file.
|
||||
find_path(IlmBase_INCLUDE_DIR IlmBaseConfig.h
|
||||
${_FIND_ILMBASE_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_ILMBASE_INCLUDE_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_INCLUDEDIR}/OpenEXR include/OpenEXR OpenEXR
|
||||
)
|
||||
|
||||
if(EXISTS "${IlmBase_INCLUDE_DIR}/IlmBaseConfig.h")
|
||||
# Get the ILMBASE version information from the config header
|
||||
file(STRINGS "${IlmBase_INCLUDE_DIR}/IlmBaseConfig.h"
|
||||
_ilmbase_version_major_string REGEX "#define ILMBASE_VERSION_MAJOR "
|
||||
)
|
||||
string(REGEX REPLACE "#define ILMBASE_VERSION_MAJOR" ""
|
||||
_ilmbase_version_major_string "${_ilmbase_version_major_string}"
|
||||
)
|
||||
string(STRIP "${_ilmbase_version_major_string}" IlmBase_VERSION_MAJOR)
|
||||
|
||||
file(STRINGS "${IlmBase_INCLUDE_DIR}/IlmBaseConfig.h"
|
||||
_ilmbase_version_minor_string REGEX "#define ILMBASE_VERSION_MINOR "
|
||||
)
|
||||
string(REGEX REPLACE "#define ILMBASE_VERSION_MINOR" ""
|
||||
_ilmbase_version_minor_string "${_ilmbase_version_minor_string}"
|
||||
)
|
||||
string(STRIP "${_ilmbase_version_minor_string}" IlmBase_VERSION_MINOR)
|
||||
|
||||
unset(_ilmbase_version_major_string)
|
||||
unset(_ilmbase_version_minor_string)
|
||||
|
||||
set(IlmBase_VERSION ${IlmBase_VERSION_MAJOR}.${IlmBase_VERSION_MINOR})
|
||||
endif()
|
||||
|
||||
# ------------------------------------------------------------------------
|
||||
# Search for ILMBASE lib DIR
|
||||
# ------------------------------------------------------------------------
|
||||
|
||||
if(NOT DEFINED ILMBASE_DEBUG_SUFFIX)
|
||||
set(ILMBASE_DEBUG_SUFFIX _d)
|
||||
endif()
|
||||
|
||||
set(_ILMBASE_LIBRARYDIR_SEARCH_DIRS "")
|
||||
|
||||
# Append to _ILMBASE_LIBRARYDIR_SEARCH_DIRS in priority order
|
||||
|
||||
list(APPEND _ILMBASE_LIBRARYDIR_SEARCH_DIRS
|
||||
${ILMBASE_LIBRARYDIR}
|
||||
${_ILMBASE_ROOT}
|
||||
${PC_IlmBase_LIBDIR}
|
||||
${SYSTEM_LIBRARY_PATHS}
|
||||
)
|
||||
|
||||
set(IlmBase_LIB_COMPONENTS "")
|
||||
list(APPEND ILM_BUILD_TYPES RELEASE DEBUG)
|
||||
|
||||
foreach(COMPONENT ${IlmBase_FIND_COMPONENTS})
|
||||
foreach(BUILD_TYPE ${ILM_BUILD_TYPES})
|
||||
|
||||
set(_TMP_SUFFIX "")
|
||||
if(BUILD_TYPE STREQUAL DEBUG)
|
||||
set(_TMP_SUFFIX ${ILMBASE_DEBUG_SUFFIX})
|
||||
endif()
|
||||
|
||||
set(_IlmBase_Version_Suffix "-${IlmBase_VERSION_MAJOR}_${IlmBase_VERSION_MINOR}")
|
||||
set(_ILMBASE_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||
|
||||
if(WIN32)
|
||||
if(ILMBASE_USE_STATIC_LIBS)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES "${_TMP_SUFFIX}.lib")
|
||||
endif()
|
||||
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "${_IlmBase_Version_Suffix}${_TMP_SUFFIX}.lib")
|
||||
else()
|
||||
if(ILMBASE_USE_STATIC_LIBS)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES "${_TMP_SUFFIX}.a")
|
||||
else()
|
||||
if(APPLE)
|
||||
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "${_IlmBase_Version_Suffix}${_TMP_SUFFIX}.dylib")
|
||||
else()
|
||||
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "${_IlmBase_Version_Suffix}${_TMP_SUFFIX}.so")
|
||||
endif()
|
||||
endif()
|
||||
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "${_IlmBase_Version_Suffix}${_TMP_SUFFIX}.a")
|
||||
endif()
|
||||
|
||||
# Find the lib
|
||||
find_library(IlmBase_${COMPONENT}_LIBRARY_${BUILD_TYPE} ${COMPONENT}
|
||||
${_FIND_ILMBASE_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_ILMBASE_LIBRARYDIR_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} lib64 lib
|
||||
)
|
||||
|
||||
if(EXISTS ${IlmBase_${COMPONENT}_LIBRARY_${BUILD_TYPE}})
|
||||
list(APPEND IlmBase_LIB_COMPONENTS ${IlmBase_${COMPONENT}_LIBRARY_${BUILD_TYPE}})
|
||||
list(APPEND IlmBase_LIB_COMPONENTS_${BUILD_TYPE} ${IlmBase_${COMPONENT}_LIBRARY_${BUILD_TYPE}})
|
||||
endif()
|
||||
|
||||
# Reset library suffix
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_ILMBASE_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||
unset(_ILMBASE_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
|
||||
unset(_IlmBase_Version_Suffix)
|
||||
unset(_TMP_SUFFIX)
|
||||
endforeach()
|
||||
|
||||
if(IlmBase_${COMPONENT}_LIBRARY_DEBUG AND IlmBase_${COMPONENT}_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(IlmBase_${COMPONENT}_LIBRARY optimized ${IlmBase_${COMPONENT}_LIBRARY_RELEASE} debug ${IlmBase_${COMPONENT}_LIBRARY_DEBUG})
|
||||
else()
|
||||
# For single-config generators where CMAKE_BUILD_TYPE has no value,
|
||||
# just use the release libraries
|
||||
set(IlmBase_${COMPONENT}_LIBRARY ${IlmBase_${COMPONENT}_LIBRARY_RELEASE})
|
||||
endif()
|
||||
# FIXME: This probably should be set for both cases
|
||||
set(IlmBase_${COMPONENT}_LIBRARIES optimized ${IlmBase_${COMPONENT}_LIBRARY_RELEASE} debug ${IlmBase_${COMPONENT}_LIBRARY_DEBUG})
|
||||
endif()
|
||||
|
||||
# if only the release version was found, set the debug variable also to the release version
|
||||
if(IlmBase_${COMPONENT}_LIBRARY_RELEASE AND NOT IlmBase_${COMPONENT}_LIBRARY_DEBUG)
|
||||
set(IlmBase_${COMPONENT}_LIBRARY_DEBUG ${IlmBase_${COMPONENT}_LIBRARY_RELEASE})
|
||||
set(IlmBase_${COMPONENT}_LIBRARY ${IlmBase_${COMPONENT}_LIBRARY_RELEASE})
|
||||
set(IlmBase_${COMPONENT}_LIBRARIES ${IlmBase_${COMPONENT}_LIBRARY_RELEASE})
|
||||
endif()
|
||||
|
||||
# if only the debug version was found, set the release variable also to the debug version
|
||||
if(IlmBase_${COMPONENT}_LIBRARY_DEBUG AND NOT IlmBase_${COMPONENT}_LIBRARY_RELEASE)
|
||||
set(IlmBase_${COMPONENT}_LIBRARY_RELEASE ${IlmBase_${COMPONENT}_LIBRARY_DEBUG})
|
||||
set(IlmBase_${COMPONENT}_LIBRARY ${IlmBase_${COMPONENT}_LIBRARY_DEBUG})
|
||||
set(IlmBase_${COMPONENT}_LIBRARIES ${IlmBase_${COMPONENT}_LIBRARY_DEBUG})
|
||||
endif()
|
||||
|
||||
# If the debug & release library ends up being the same, omit the keywords
|
||||
if("${IlmBase_${COMPONENT}_LIBRARY_RELEASE}" STREQUAL "${IlmBase_${COMPONENT}_LIBRARY_DEBUG}")
|
||||
set(IlmBase_${COMPONENT}_LIBRARY ${IlmBase_${COMPONENT}_LIBRARY_RELEASE} )
|
||||
set(IlmBase_${COMPONENT}_LIBRARIES ${IlmBase_${COMPONENT}_LIBRARY_RELEASE} )
|
||||
endif()
|
||||
|
||||
if(IlmBase_${COMPONENT}_LIBRARY)
|
||||
set(IlmBase_${COMPONENT}_FOUND TRUE)
|
||||
else()
|
||||
set(IlmBase_${COMPONENT}_FOUND FALSE)
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# ------------------------------------------------------------------------
|
||||
# Cache and set ILMBASE_FOUND
|
||||
# ------------------------------------------------------------------------
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(IlmBase
|
||||
FOUND_VAR IlmBase_FOUND
|
||||
REQUIRED_VARS
|
||||
IlmBase_INCLUDE_DIR
|
||||
IlmBase_LIB_COMPONENTS
|
||||
VERSION_VAR IlmBase_VERSION
|
||||
HANDLE_COMPONENTS
|
||||
)
|
||||
|
||||
if(NOT IlmBase_FOUND)
|
||||
if(IlmBase_FIND_REQUIRED)
|
||||
message(FATAL_ERROR "Unable to find IlmBase")
|
||||
endif()
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Partition release/debug lib vars
|
||||
|
||||
set(IlmBase_RELEASE_LIBRARIES "")
|
||||
set(IlmBase_RELEASE_LIBRARY_DIRS "")
|
||||
set(IlmBase_DEBUG_LIBRARIES "")
|
||||
set(IlmBase_DEBUG_LIBRARY_DIRS "")
|
||||
foreach(LIB ${IlmBase_LIB_COMPONENTS_RELEASE})
|
||||
get_filename_component(_ILM_LIBDIR ${LIB} DIRECTORY)
|
||||
list(APPEND IlmBase_RELEASE_LIBRARIES ${LIB})
|
||||
list(APPEND IlmBase_RELEASE_LIBRARY_DIRS ${_ILM_LIBDIR})
|
||||
endforeach()
|
||||
|
||||
foreach(LIB ${IlmBase_LIB_COMPONENTS_DEBUG})
|
||||
get_filename_component(_ILM_LIBDIR ${LIB} DIRECTORY)
|
||||
list(APPEND IlmBase_DEBUG_LIBRARIES ${LIB})
|
||||
list(APPEND IlmBase_DEBUG_LIBRARY_DIRS ${_ILM_LIBDIR})
|
||||
endforeach()
|
||||
|
||||
list(REMOVE_DUPLICATES IlmBase_RELEASE_LIBRARY_DIRS)
|
||||
list(REMOVE_DUPLICATES IlmBase_DEBUG_LIBRARY_DIRS)
|
||||
|
||||
set(IlmBase_LIBRARIES ${IlmBase_RELEASE_LIBRARIES})
|
||||
set(IlmBase_LIBRARY_DIRS ${IlmBase_RELEASE_LIBRARY_DIRS})
|
||||
|
||||
# We have to add both include and include/OpenEXR to the include
|
||||
# path in case OpenEXR and IlmBase are installed separately.
|
||||
#
|
||||
# Make sure we get the absolute path to avoid issues where
|
||||
# /usr/include/OpenEXR/../ is picked up and passed to gcc from cmake
|
||||
# which won't correctly compute /usr/include as an implicit system
|
||||
# dir if the path is relative:
|
||||
#
|
||||
# https://github.com/AcademySoftwareFoundation/openvdb/issues/632
|
||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70129
|
||||
|
||||
set(_IlmBase_Parent_Dir "")
|
||||
get_filename_component(_IlmBase_Parent_Dir
|
||||
${IlmBase_INCLUDE_DIR}/../ ABSOLUTE)
|
||||
|
||||
set(IlmBase_INCLUDE_DIRS)
|
||||
list(APPEND IlmBase_INCLUDE_DIRS
|
||||
${_IlmBase_Parent_Dir}
|
||||
${IlmBase_INCLUDE_DIR}
|
||||
)
|
||||
unset(_IlmBase_Parent_Dir)
|
||||
|
||||
# Configure imported targets
|
||||
|
||||
foreach(COMPONENT ${IlmBase_FIND_COMPONENTS})
|
||||
# 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(ILMBASE_${COMPONENT}_LIB_TYPE UNKNOWN)
|
||||
if(ILMBASE_USE_STATIC_LIBS)
|
||||
set(ILMBASE_${COMPONENT}_LIB_TYPE STATIC)
|
||||
elseif(UNIX)
|
||||
get_filename_component(_ILMBASE_${COMPONENT}_EXT ${IlmBase_${COMPONENT}_LIBRARY_RELEASE} EXT)
|
||||
if(${_ILMBASE_${COMPONENT}_EXT} STREQUAL ".a")
|
||||
set(ILMBASE_${COMPONENT}_LIB_TYPE STATIC)
|
||||
elseif(${_ILMBASE_${COMPONENT}_EXT} STREQUAL ".so" OR
|
||||
${_ILMBASE_${COMPONENT}_EXT} STREQUAL ".dylib")
|
||||
set(ILMBASE_${COMPONENT}_LIB_TYPE SHARED)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(IlmBase_${COMPONENT}_DEFINITIONS)
|
||||
|
||||
# Add the OPENEXR_DLL define if the library is not static on WIN32
|
||||
if(WIN32)
|
||||
if(NOT ILMBASE_${COMPONENT}_LIB_TYPE STREQUAL STATIC)
|
||||
list(APPEND IlmBase_${COMPONENT}_DEFINITIONS OPENEXR_DLL)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT TARGET IlmBase::${COMPONENT})
|
||||
add_library(IlmBase::${COMPONENT} ${ILMBASE_${COMPONENT}_LIB_TYPE} IMPORTED)
|
||||
set_target_properties(IlmBase::${COMPONENT} PROPERTIES
|
||||
INTERFACE_COMPILE_OPTIONS "${PC_IlmBase_CFLAGS_OTHER}"
|
||||
INTERFACE_COMPILE_DEFINITIONS "${IlmBase_${COMPONENT}_DEFINITIONS}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${IlmBase_INCLUDE_DIRS}")
|
||||
|
||||
# Standard location
|
||||
set_target_properties(IlmBase::${COMPONENT} PROPERTIES
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
|
||||
IMPORTED_LOCATION "${IlmBase_${COMPONENT}_LIBRARY}")
|
||||
|
||||
# Release location
|
||||
if(EXISTS "${IlmBase_${COMPONENT}_LIBRARY_RELEASE}")
|
||||
set_property(TARGET IlmBase::${COMPONENT} APPEND PROPERTY
|
||||
IMPORTED_CONFIGURATIONS RELEASE)
|
||||
set_target_properties(IlmBase::${COMPONENT} PROPERTIES
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX"
|
||||
IMPORTED_LOCATION_RELEASE "${IlmBase_${COMPONENT}_LIBRARY_RELEASE}")
|
||||
endif()
|
||||
|
||||
# Debug location
|
||||
if(EXISTS "${IlmBase_${COMPONENT}_LIBRARY_DEBUG}")
|
||||
set_property(TARGET IlmBase::${COMPONENT} APPEND PROPERTY
|
||||
IMPORTED_CONFIGURATIONS DEBUG)
|
||||
set_target_properties(IlmBase::${COMPONENT} PROPERTIES
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX"
|
||||
IMPORTED_LOCATION_DEBUG "${IlmBase_${COMPONENT}_LIBRARY_DEBUG}")
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
@@ -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.15)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
|
||||
@@ -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.15)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
|
||||
@@ -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()
|
||||
@@ -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.15)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
|
||||
+61
-32
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -64,8 +64,6 @@ This will define the following variables:
|
||||
True if the OpenVDB Library has been built with log4cplus support
|
||||
``OpenVDB_USES_IMATH_HALF``
|
||||
True if the OpenVDB Library has been built with Imath half support
|
||||
``OpenVDB_USES_DELAYED_LOADING``
|
||||
True if the OpenVDB Library has been built with delayed-loading
|
||||
``OpenVDB_ABI``
|
||||
Set if this module was able to determine the ABI number the located
|
||||
OpenVDB Library was built against. Unset otherwise.
|
||||
@@ -109,7 +107,7 @@ may be provided to tell this module where to look.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
@@ -334,8 +332,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
|
||||
)
|
||||
|
||||
@@ -392,9 +392,6 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS})
|
||||
elseif(${COMPONENT} STREQUAL "openvdb_je")
|
||||
# alias to the result of openvdb which should be handled first
|
||||
set(OpenVDB_${COMPONENT}_LIBRARY ${OpenVDB_openvdb_LIBRARY})
|
||||
elseif(${COMPONENT} STREQUAL "nanovdb")
|
||||
# alias to the result of openvdb which should be handled first
|
||||
set(OpenVDB_${COMPONENT}_LIBRARY ${OpenVDB_openvdb_LIBRARY})
|
||||
else()
|
||||
find_library(OpenVDB_${COMPONENT}_LIBRARY ${LIB_NAME}
|
||||
${_FIND_OPENVDB_ADDITIONAL_OPTIONS}
|
||||
@@ -490,10 +487,46 @@ endif()
|
||||
|
||||
find_package(TBB REQUIRED COMPONENTS tbb)
|
||||
|
||||
if(NOT OPENVDB_USE_STATIC_LIBS AND NOT Boost_USE_STATIC_LIBS)
|
||||
# @note Both of these must be set for Boost 1.70 (VFX2020) to link against
|
||||
# boost shared libraries (more specifically libraries built with -fPIC).
|
||||
# http://boost.2283326.n4.nabble.com/CMake-config-scripts-broken-in-1-70-td4708957.html
|
||||
# https://github.com/boostorg/boost_install/commit/160c7cb2b2c720e74463865ef0454d4c4cd9ae7c
|
||||
set(BUILD_SHARED_LIBS ON)
|
||||
set(Boost_USE_STATIC_LIBS OFF)
|
||||
endif()
|
||||
|
||||
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
|
||||
@@ -522,7 +555,6 @@ set(OpenVDB_USES_BLOSC ${USE_BLOSC})
|
||||
set(OpenVDB_USES_ZLIB ${USE_ZLIB})
|
||||
set(OpenVDB_USES_LOG4CPLUS ${USE_LOG4CPLUS})
|
||||
set(OpenVDB_USES_IMATH_HALF ${USE_IMATH_HALF})
|
||||
set(OpenVDB_USES_DELAYED_LOADING ${OPENVDB_USE_DELAYED_LOADING})
|
||||
set(OpenVDB_DEFINITIONS)
|
||||
|
||||
if(WIN32)
|
||||
@@ -555,7 +587,6 @@ if(_OPENVDB_HAS_NEW_VERSION_HEADER)
|
||||
OPENVDB_GET_VERSION_DEFINE(${_OPENVDB_VERSION_HEADER} "OPENVDB_USE_IMATH_HALF" OpenVDB_USES_IMATH_HALF)
|
||||
OPENVDB_GET_VERSION_DEFINE(${_OPENVDB_VERSION_HEADER} "OPENVDB_USE_BLOSC" OpenVDB_USES_BLOSC)
|
||||
OPENVDB_GET_VERSION_DEFINE(${_OPENVDB_VERSION_HEADER} "OPENVDB_USE_ZLIB" OpenVDB_USES_ZLIB)
|
||||
OPENVDB_GET_VERSION_DEFINE(${_OPENVDB_VERSION_HEADER} "OPENVDB_USE_DELAYED_LOADING" OpenVDB_USES_DELAYED_LOADING)
|
||||
elseif(NOT OPENVDB_USE_STATIC_LIBS)
|
||||
# Use GetPrerequisites to see which libraries this OpenVDB lib has linked to
|
||||
# which we can query for optional deps. This basically runs ldd/otoll/objdump
|
||||
@@ -602,11 +633,6 @@ elseif(NOT OPENVDB_USE_STATIC_LIBS)
|
||||
if(NOT ${_HAS_DEP} EQUAL -1)
|
||||
set(OpenVDB_USES_IMATH_HALF ON)
|
||||
endif()
|
||||
|
||||
string(FIND ${PREREQUISITE} "boost_iostreams" _HAS_DEP)
|
||||
if(NOT ${_HAS_DEP} EQUAL -1)
|
||||
set(OpenVDB_USES_DELAYED_LOADING ON)
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
unset(_OPENVDB_PREREQUISITE_LIST)
|
||||
@@ -625,11 +651,19 @@ if(OpenVDB_USES_LOG4CPLUS)
|
||||
endif()
|
||||
|
||||
if(OpenVDB_USES_IMATH_HALF)
|
||||
find_package(Imath REQUIRED CONFIG)
|
||||
endif()
|
||||
find_package(Imath CONFIG)
|
||||
if (NOT TARGET Imath::Imath)
|
||||
find_package(IlmBase REQUIRED COMPONENTS Half)
|
||||
endif()
|
||||
|
||||
if(OpenVDB_USES_DELAYED_LOADING)
|
||||
find_package(Boost REQUIRED COMPONENTS iostreams)
|
||||
if(WIN32)
|
||||
# @note OPENVDB_OPENEXR_STATICLIB is old functionality and should be removed
|
||||
if(OPENEXR_USE_STATIC_LIBS OR
|
||||
("${ILMBASE_LIB_TYPE}" STREQUAL "STATIC_LIBRARY") OR
|
||||
("${IMATH_LIB_TYPE}" STREQUAL "STATIC_LIBRARY"))
|
||||
list(APPEND OpenVDB_DEFINITIONS OPENVDB_OPENEXR_STATICLIB)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(UNIX)
|
||||
@@ -637,19 +671,14 @@ if(UNIX)
|
||||
endif()
|
||||
|
||||
# Set deps. Note that the order here is important. If we're building against
|
||||
# Houdini we must include Imath deps first to ensure the users chosen
|
||||
# Houdini 17.5 we must include IlmBase deps first to ensure the users chosen
|
||||
# namespaced headers are correctly prioritized. Otherwise other include paths
|
||||
# from shared installs (including houdini) may pull in the wrong headers
|
||||
|
||||
set(_OPENVDB_VISIBLE_DEPENDENCIES "")
|
||||
|
||||
if(OpenVDB_USES_DELAYED_LOADING)
|
||||
list(APPEND _OPENVDB_VISIBLE_DEPENDENCIES Boost::iostreams)
|
||||
list(APPEND OpenVDB_DEFINITIONS OPENVDB_USE_DELAYED_LOADING)
|
||||
endif()
|
||||
set(_OPENVDB_VISIBLE_DEPENDENCIES Boost::iostreams)
|
||||
|
||||
if(OpenVDB_USES_IMATH_HALF)
|
||||
list(APPEND _OPENVDB_VISIBLE_DEPENDENCIES Imath::Imath)
|
||||
list(APPEND _OPENVDB_VISIBLE_DEPENDENCIES $<TARGET_NAME_IF_EXISTS:IlmBase::Half> $<TARGET_NAME_IF_EXISTS:Imath::Imath>)
|
||||
endif()
|
||||
|
||||
if(OpenVDB_USES_LOG4CPLUS)
|
||||
@@ -720,7 +749,7 @@ if(NOT TARGET OpenVDB::openvdb)
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${OpenVDB_INCLUDE_DIR}"
|
||||
IMPORTED_LINK_DEPENDENT_LIBRARIES "${_OPENVDB_HIDDEN_DEPENDENCIES}" # non visible deps
|
||||
INTERFACE_LINK_LIBRARIES "${_OPENVDB_VISIBLE_DEPENDENCIES}" # visible deps (headers)
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_17
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_14
|
||||
)
|
||||
endif()
|
||||
|
||||
@@ -742,8 +771,8 @@ 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_COMPILE_FEATURES cxx_std_17
|
||||
INTERFACE_LINK_LIBRARIES "OpenVDB::openvdb;Boost::${BOOST_PYTHON_LIB};${PYTHON_LIBRARIES}"
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_14
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
@@ -757,7 +786,7 @@ if(OpenVDB_openvdb_houdini_LIBRARY)
|
||||
IMPORTED_LOCATION "${OpenVDB_openvdb_houdini_LIBRARY}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${OpenVDB_openvdb_houdini_INCLUDE_DIR}"
|
||||
INTERFACE_LINK_LIBRARIES "OpenVDB::openvdb;Houdini"
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_17
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_14
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
@@ -787,7 +816,7 @@ if(OpenVDB_openvdb_ax_LIBRARY)
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${OpenVDB_openvdb_ax_INCLUDE_DIR}"
|
||||
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${LLVM_INCLUDE_DIRS}"
|
||||
INTERFACE_LINK_LIBRARIES "OpenVDB::openvdb;${LLVM_LIBS}"
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_17
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_14
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
@@ -801,7 +830,7 @@ if(OpenVDB_nanovdb_LIBRARY)
|
||||
IMPORTED_LOCATION "${OpenVDB_nanovdb_LIBRARY}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${OpenVDB_nanovdb_INCLUDE_DIR}"
|
||||
INTERFACE_LINK_LIBRARIES "OpenVDB::openvdb;"
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_17
|
||||
INTERFACE_COMPILE_FEATURES cxx_std_14
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
+31
-68
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -34,7 +34,7 @@ This will define the following variables:
|
||||
|
||||
``Tbb_FOUND``
|
||||
True if the system has the Tbb library.
|
||||
``Tbb_VERSION`` ``TBB_VERSION``
|
||||
``Tbb_VERSION``
|
||||
The version of the Tbb library which was found.
|
||||
``Tbb_INCLUDE_DIRS``
|
||||
Include directories needed to use Tbb.
|
||||
@@ -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.15)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
|
||||
@@ -162,72 +162,51 @@ list(APPEND _TBB_INCLUDE_SEARCH_DIRS
|
||||
${SYSTEM_LIBRARY_PATHS}
|
||||
)
|
||||
|
||||
if(NOT Tbb_INCLUDE_DIR)
|
||||
# Look for a legacy tbb header file.
|
||||
find_path(Tbb_LEGACY_INCLUDE_DIR tbb/tbb_stddef.h
|
||||
${_FIND_TBB_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_TBB_INCLUDE_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_INCLUDEDIR} include
|
||||
)
|
||||
else()
|
||||
set(Tbb_LEGACY_INCLUDE_DIR ${Tbb_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
# Look for a new tbb header installation
|
||||
# From TBB 2021, tbb_stddef is removed and the directory include/tbb is
|
||||
# simply an alias for include/oneapi/tbb. Try and find the version header
|
||||
# in oneapi/tbb
|
||||
find_path(Tbb_INCLUDE_DIR oneapi/tbb/version.h
|
||||
# Look for a standard tbb header file.
|
||||
find_path(Tbb_INCLUDE_DIR tbb/tbb_stddef.h
|
||||
${_FIND_TBB_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_TBB_INCLUDE_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_INCLUDEDIR} include
|
||||
)
|
||||
|
||||
set(_tbb_legacy_version_file "${Tbb_LEGACY_INCLUDE_DIR}/tbb/tbb_stddef.h")
|
||||
set(_tbb_version_file "${Tbb_INCLUDE_DIR}/oneapi/tbb/version.h")
|
||||
set(_tbb_version_file "${Tbb_INCLUDE_DIR}/tbb/tbb_stddef.h")
|
||||
|
||||
if(EXISTS ${_tbb_legacy_version_file})
|
||||
if(EXISTS ${_tbb_version_file})
|
||||
message(WARNING "
|
||||
FindTBB located both an old and new tbb installation.
|
||||
old: ${_tbb_legacy_version_file}
|
||||
new: ${_tbb_version_file}
|
||||
The NEWER versioned installation will be used. You can set TBB_INCLUDEDIR
|
||||
to control FindTBB.cmake search, or explicitly set Tbb_INCLUDE_DIR to the
|
||||
desired location.
|
||||
")
|
||||
else()
|
||||
set(_tbb_version_file "${_tbb_legacy_version_file}")
|
||||
set(Tbb_INCLUDE_DIR ${Tbb_LEGACY_INCLUDE_DIR} CACHE STRING "" FORCE)
|
||||
endif()
|
||||
if(NOT EXISTS ${_tbb_version_file})
|
||||
# From TBB 2021, tbb_stddef is removed and the directory include/tbb is
|
||||
# simply an alias for include/oneapi/tbb. Try and find the version header
|
||||
# in oneapi/tbb
|
||||
find_path(Tbb_INCLUDE_DIR oneapi/tbb/version.h
|
||||
${_FIND_TBB_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_TBB_INCLUDE_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_INCLUDEDIR} include
|
||||
)
|
||||
set(_tbb_version_file "${Tbb_INCLUDE_DIR}/oneapi/tbb/version.h")
|
||||
endif()
|
||||
|
||||
|
||||
if(EXISTS ${_tbb_version_file})
|
||||
file(STRINGS ${_tbb_version_file} _tbb_version_major_string REGEX "#define TBB_VERSION_MAJOR " )
|
||||
string(REGEX REPLACE "#define TBB_VERSION_MAJOR" "" _tbb_version_major_string "${_tbb_version_major_string}")
|
||||
file(STRINGS ${_tbb_version_file}
|
||||
_tbb_version_major_string REGEX "#define TBB_VERSION_MAJOR "
|
||||
)
|
||||
string(REGEX REPLACE "#define TBB_VERSION_MAJOR" ""
|
||||
_tbb_version_major_string "${_tbb_version_major_string}"
|
||||
)
|
||||
string(STRIP "${_tbb_version_major_string}" Tbb_VERSION_MAJOR)
|
||||
|
||||
file(STRINGS ${_tbb_version_file} _tbb_version_minor_string REGEX "#define TBB_VERSION_MINOR ")
|
||||
string(REGEX REPLACE "#define TBB_VERSION_MINOR" "" _tbb_version_minor_string "${_tbb_version_minor_string}")
|
||||
file(STRINGS ${_tbb_version_file}
|
||||
_tbb_version_minor_string REGEX "#define TBB_VERSION_MINOR "
|
||||
)
|
||||
string(REGEX REPLACE "#define TBB_VERSION_MINOR" ""
|
||||
_tbb_version_minor_string "${_tbb_version_minor_string}"
|
||||
)
|
||||
string(STRIP "${_tbb_version_minor_string}" Tbb_VERSION_MINOR)
|
||||
|
||||
file(STRINGS ${_tbb_version_file} _tbb_binary_version_string REGEX "#define __TBB_BINARY_VERSION ")
|
||||
string(REGEX REPLACE "#define __TBB_BINARY_VERSION" "" _tbb_binary_version_string "${_tbb_binary_version_string}")
|
||||
string(STRIP "${_tbb_binary_version_string}" Tbb_BINARY_VERSION)
|
||||
|
||||
unset(_tbb_version_major_string)
|
||||
unset(_tbb_version_minor_string)
|
||||
unset(_tbb_binary_version_string)
|
||||
|
||||
# Set both for compatibility reasons, TBB's CONFIG files only set the latter
|
||||
set(Tbb_VERSION ${Tbb_VERSION_MAJOR}.${Tbb_VERSION_MINOR})
|
||||
set(TBB_VERSION ${Tbb_VERSION})
|
||||
endif()
|
||||
|
||||
unset(_tbb_version_file)
|
||||
unset(_tbb_legacy_version_file)
|
||||
unset(Tbb_LEGACY_INCLUDE_DIR)
|
||||
|
||||
# ------------------------------------------------------------------------
|
||||
# Search for TBB lib DIR
|
||||
@@ -276,22 +255,8 @@ foreach(COMPONENT ${TBB_FIND_COMPONENTS})
|
||||
find_library(Tbb_${COMPONENT}_LIBRARY_${BUILD_TYPE} ${_TBB_LIB_NAME}
|
||||
${_FIND_TBB_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_TBB_LIBRARYDIR_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} lib64 lib)
|
||||
|
||||
# If we didn't find the library, prepend Tbb_BINARY_VERSION to each possible
|
||||
# component name and try again. As of TBB 2021, TBB decides to version some
|
||||
# of its libraries on some of its platforms...
|
||||
if(NOT Tbb_${COMPONENT}_LIBRARY_${BUILD_TYPE} AND Tbb_BINARY_VERSION)
|
||||
set(_TBB_LIB_NAME "${COMPONENT}${Tbb_BINARY_VERSION}")
|
||||
if(BUILD_TYPE STREQUAL DEBUG)
|
||||
set(_TBB_LIB_NAME "${_TBB_LIB_NAME}${TBB_DEBUG_SUFFIX}")
|
||||
endif()
|
||||
|
||||
find_library(Tbb_${COMPONENT}_LIBRARY_${BUILD_TYPE} ${_TBB_LIB_NAME}
|
||||
${_FIND_TBB_ADDITIONAL_OPTIONS}
|
||||
PATHS ${_TBB_LIBRARYDIR_SEARCH_DIRS}
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} lib64 lib)
|
||||
endif()
|
||||
PATH_SUFFIXES ${CMAKE_INSTALL_LIBDIR} lib64 lib
|
||||
)
|
||||
|
||||
# On Unix, TBB sometimes uses linker scripts instead of symlinks, so parse the linker script
|
||||
# and correct the library name if so
|
||||
@@ -461,9 +426,7 @@ foreach(COMPONENT ${TBB_FIND_COMPONENTS})
|
||||
IMPORTED_CONFIGURATIONS RELEASE)
|
||||
set_target_properties(TBB::${COMPONENT} PROPERTIES
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX"
|
||||
IMPORTED_LOCATION_RELEASE "${Tbb_${COMPONENT}_LIBRARY_RELEASE}"
|
||||
MAP_IMPORTED_CONFIG_MINSIZEREL Release
|
||||
MAP_IMPORTED_CONFIG_RELWITHDEBINFO Release)
|
||||
IMPORTED_LOCATION_RELEASE "${Tbb_${COMPONENT}_LIBRARY_RELEASE}")
|
||||
endif()
|
||||
|
||||
# Debug location
|
||||
|
||||
@@ -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.15)
|
||||
|
||||
set(_FIND_GLFW3_ADDITIONAL_OPTIONS "")
|
||||
if(DISABLE_CMAKE_SEARCH_PATHS)
|
||||
@@ -109,11 +109,16 @@ endif()
|
||||
set(glfw3_FIND_VERSION ${MINIMUM_GLFW_VERSION})
|
||||
find_package(glfw3 ${MINIMUM_GLFW_VERSION} REQUIRED)
|
||||
|
||||
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} "
|
||||
"is deprecated and will be removed.")
|
||||
endif()
|
||||
# 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()
|
||||
|
||||
unset(glfw3_FIND_VERSION)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[.rst:
|
||||
|
||||
@@ -49,6 +49,8 @@ overwrite user provided values.
|
||||
``ZLIB_LIBRARY``
|
||||
``OPENEXR_INCLUDEDIR``
|
||||
``OPENEXR_LIBRARYDIR``
|
||||
``ILMBASE_INCLUDEDIR``
|
||||
``ILMBASE_LIBRARYDIR``
|
||||
``TBB_INCLUDEDIR``
|
||||
``TBB_LIBRARYDIR``
|
||||
``BLOSC_INCLUDEDIR``
|
||||
@@ -73,7 +75,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.15)
|
||||
|
||||
# Include utility functions for version information
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/OpenVDBUtils.cmake)
|
||||
@@ -288,11 +290,7 @@ endif()
|
||||
|
||||
# Jemalloc
|
||||
|
||||
# * On Mac OSX, linking against Jemalloc < 4.3.0 seg-faults with this error:
|
||||
# malloc: *** malloc_zone_unregister() failed for 0xaddress
|
||||
# As of Houdini 20, it still ships with Jemalloc 3.6.0, so don't expose it
|
||||
# on Mac OSX (https://github.com/jemalloc/jemalloc/issues/420).
|
||||
if(NOT APPLE AND NOT JEMALLOC_LIBRARYDIR)
|
||||
if(NOT JEMALLOC_LIBRARYDIR)
|
||||
set(JEMALLOC_LIBRARYDIR ${HOUDINI_LIB_DIR})
|
||||
endif()
|
||||
|
||||
@@ -305,10 +303,21 @@ if(NOT OPENEXR_LIBRARYDIR)
|
||||
set(OPENEXR_LIBRARYDIR ${HOUDINI_LIB_DIR})
|
||||
endif()
|
||||
|
||||
# IlmBase
|
||||
|
||||
if(NOT ILMBASE_INCLUDEDIR)
|
||||
set(ILMBASE_INCLUDEDIR ${HOUDINI_INCLUDE_DIR})
|
||||
endif()
|
||||
if(NOT ILMBASE_LIBRARYDIR)
|
||||
set(ILMBASE_LIBRARYDIR ${HOUDINI_LIB_DIR})
|
||||
endif()
|
||||
|
||||
# Boost - currently must be provided as VDB is not fully configured to
|
||||
# use Houdini's namespaced hboost
|
||||
|
||||
# Versions of Houdini >= 17.5 have some namespaced libraries (IlmBase/OpenEXR).
|
||||
# Add the required suffix as part of the cmake lib suffix searches
|
||||
|
||||
if(APPLE)
|
||||
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "_sidefx.dylib")
|
||||
elseif(UNIX)
|
||||
@@ -324,82 +333,87 @@ endif()
|
||||
# Explicitly configure the OpenVDB ABI version depending on the Houdini
|
||||
# version.
|
||||
|
||||
find_file(_houdini_openvdb_version_file "openvdb/version.h"
|
||||
PATHS ${HOUDINI_INCLUDE_DIR}
|
||||
NO_DEFAULT_PATH)
|
||||
if(_houdini_openvdb_version_file)
|
||||
OPENVDB_VERSION_FROM_HEADER("${_houdini_openvdb_version_file}"
|
||||
ABI OPENVDB_HOUDINI_ABI)
|
||||
endif()
|
||||
unset(_houdini_openvdb_version_file)
|
||||
if(NOT OPENVDB_HOUDINI_ABI)
|
||||
message(WARNING "Unknown version of Houdini, assuming OpenVDB ABI=${OpenVDB_MAJOR_VERSION}, "
|
||||
"but if this not correct, the CMake flag -DOPENVDB_HOUDINI_ABI=<N> can override this value.")
|
||||
set(OPENVDB_HOUDINI_ABI ${OpenVDB_MAJOR_VERSION})
|
||||
endif()
|
||||
|
||||
# ------------------------------------------------------------------------
|
||||
# Configure libstc++ CXX11 ABI
|
||||
# ------------------------------------------------------------------------
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
# Assume we're using libstdc++
|
||||
message(STATUS "Configuring CXX11 ABI for Houdini compatibility...")
|
||||
|
||||
execute_process(COMMAND echo "#include <string>"
|
||||
COMMAND ${CMAKE_CXX_COMPILER} "-x" "c++" "-E" "-dM" "-"
|
||||
COMMAND grep "-F" "_GLIBCXX_USE_CXX11_ABI"
|
||||
TIMEOUT 10
|
||||
RESULT_VARIABLE QUERIED_GCC_CXX11_ABI_SUCCESS
|
||||
OUTPUT_VARIABLE _GCC_CXX11_ABI)
|
||||
|
||||
set(GLIBCXX_USE_CXX11_ABI "UNKNOWN")
|
||||
|
||||
if(NOT QUERIED_GCC_CXX11_ABI_SUCCESS)
|
||||
string(FIND ${_GCC_CXX11_ABI} "_GLIBCXX_USE_CXX11_ABI 0" GCC_OLD_CXX11_ABI)
|
||||
string(FIND ${_GCC_CXX11_ABI} "_GLIBCXX_USE_CXX11_ABI 1" GCC_NEW_CXX11_ABI)
|
||||
if(NOT (${GCC_OLD_CXX11_ABI} EQUAL -1))
|
||||
set(GLIBCXX_USE_CXX11_ABI 0)
|
||||
endif()
|
||||
if(NOT (${GCC_NEW_CXX11_ABI} EQUAL -1))
|
||||
set(GLIBCXX_USE_CXX11_ABI 1)
|
||||
endif()
|
||||
if(Houdini_VERSION_MAJOR_MINOR VERSION_EQUAL 18.5)
|
||||
set(OPENVDB_HOUDINI_ABI 7)
|
||||
else()
|
||||
find_file(_houdini_openvdb_version_file "openvdb/version.h"
|
||||
PATHS ${HOUDINI_INCLUDE_DIR}
|
||||
NO_DEFAULT_PATH)
|
||||
if(_houdini_openvdb_version_file)
|
||||
OPENVDB_VERSION_FROM_HEADER("${_houdini_openvdb_version_file}"
|
||||
ABI OPENVDB_HOUDINI_ABI)
|
||||
endif()
|
||||
unset(_houdini_openvdb_version_file)
|
||||
if(NOT OPENVDB_HOUDINI_ABI)
|
||||
message(WARNING "Unknown version of Houdini, assuming OpenVDB ABI=${OpenVDB_MAJOR_VERSION}, "
|
||||
"but if this not correct, the CMake flag -DOPENVDB_HOUDINI_ABI=<N> can override this value.")
|
||||
set(OPENVDB_HOUDINI_ABI ${OpenVDB_MAJOR_VERSION})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Try and query the Houdini CXX11 ABI. Allow it to be provided by users to
|
||||
# override this logic should Houdini's CMake ever change
|
||||
# ------------------------------------------------------------------------
|
||||
# Configure GCC CXX11 ABI
|
||||
# ------------------------------------------------------------------------
|
||||
|
||||
if(NOT DEFINED HOUDINI_CXX11_ABI)
|
||||
get_target_property(houdini_interface_compile_options
|
||||
Houdini INTERFACE_COMPILE_OPTIONS)
|
||||
set(HOUDINI_CXX11_ABI "UNKNOWN")
|
||||
if("-D_GLIBCXX_USE_CXX11_ABI=0" IN_LIST houdini_interface_compile_options)
|
||||
set(HOUDINI_CXX11_ABI 0)
|
||||
elseif("-D_GLIBCXX_USE_CXX11_ABI=1" IN_LIST houdini_interface_compile_options)
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||
if((CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 5.1) OR
|
||||
(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 5.1))
|
||||
message(STATUS "GCC >= 5.1 detected. Configuring GCC CXX11 ABI for Houdini compatibility...")
|
||||
|
||||
execute_process(COMMAND echo "#include <string>"
|
||||
COMMAND ${CMAKE_CXX_COMPILER} "-x" "c++" "-E" "-dM" "-"
|
||||
COMMAND grep "-F" "_GLIBCXX_USE_CXX11_ABI"
|
||||
TIMEOUT 10
|
||||
RESULT_VARIABLE QUERIED_GCC_CXX11_ABI_SUCCESS
|
||||
OUTPUT_VARIABLE _GCC_CXX11_ABI)
|
||||
|
||||
set(GLIBCXX_USE_CXX11_ABI "UNKNOWN")
|
||||
|
||||
if(NOT QUERIED_GCC_CXX11_ABI_SUCCESS)
|
||||
string(FIND ${_GCC_CXX11_ABI} "_GLIBCXX_USE_CXX11_ABI 0" GCC_OLD_CXX11_ABI)
|
||||
string(FIND ${_GCC_CXX11_ABI} "_GLIBCXX_USE_CXX11_ABI 1" GCC_NEW_CXX11_ABI)
|
||||
if(NOT (${GCC_OLD_CXX11_ABI} EQUAL -1))
|
||||
set(GLIBCXX_USE_CXX11_ABI 0)
|
||||
endif()
|
||||
if(NOT (${GCC_NEW_CXX11_ABI} EQUAL -1))
|
||||
set(GLIBCXX_USE_CXX11_ABI 1)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Try and query the Houdini CXX11 ABI. Allow it to be provided by users to
|
||||
# override this logic should Houdini's CMake ever change
|
||||
|
||||
if(NOT DEFINED HOUDINI_CXX11_ABI)
|
||||
get_target_property(houdini_interface_compile_options
|
||||
Houdini INTERFACE_COMPILE_OPTIONS)
|
||||
set(HOUDINI_CXX11_ABI "UNKNOWN")
|
||||
if("-D_GLIBCXX_USE_CXX11_ABI=0" IN_LIST houdini_interface_compile_options)
|
||||
set(HOUDINI_CXX11_ABI 0)
|
||||
elseif("-D_GLIBCXX_USE_CXX11_ABI=1" IN_LIST houdini_interface_compile_options)
|
||||
set(HOUDINI_CXX11_ABI 1)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
message(STATUS " GCC CXX11 ABI : ${GLIBCXX_USE_CXX11_ABI}")
|
||||
message(STATUS " Houdini CXX11 ABI : ${HOUDINI_CXX11_ABI}")
|
||||
|
||||
if(${HOUDINI_CXX11_ABI} STREQUAL "UNKNOWN")
|
||||
message(WARNING "Unable to determine Houdini CXX11 ABI. Assuming newer ABI "
|
||||
"has been used.")
|
||||
set(HOUDINI_CXX11_ABI 1)
|
||||
endif()
|
||||
|
||||
if(${GLIBCXX_USE_CXX11_ABI} EQUAL ${HOUDINI_CXX11_ABI})
|
||||
message(STATUS " Current CXX11 ABI matches Houdini configuration "
|
||||
"(_GLIBCXX_USE_CXX11_ABI=${HOUDINI_CXX11_ABI}).")
|
||||
else()
|
||||
message(WARNING "A potential mismatch was detected between the CXX11 ABI "
|
||||
"of GCC and Houdini. The following ABI configuration will be used: "
|
||||
"-D_GLIBCXX_USE_CXX11_ABI=${HOUDINI_CXX11_ABI}. See: "
|
||||
"https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html and "
|
||||
"https://vfxplatform.com/#footnote-gcc6 for more information.")
|
||||
endif()
|
||||
|
||||
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=${HOUDINI_CXX11_ABI})
|
||||
endif()
|
||||
|
||||
message(STATUS " GNU CXX11 ABI : ${GLIBCXX_USE_CXX11_ABI}")
|
||||
message(STATUS " Houdini CXX11 ABI : ${HOUDINI_CXX11_ABI}")
|
||||
|
||||
if(${HOUDINI_CXX11_ABI} STREQUAL "UNKNOWN")
|
||||
message(WARNING "Unable to determine Houdini CXX11 ABI. Assuming newer ABI "
|
||||
"has been used.")
|
||||
set(HOUDINI_CXX11_ABI 1)
|
||||
endif()
|
||||
|
||||
if(${GLIBCXX_USE_CXX11_ABI} EQUAL ${HOUDINI_CXX11_ABI})
|
||||
message(STATUS " Current CXX11 ABI matches Houdini configuration "
|
||||
"(_GLIBCXX_USE_CXX11_ABI=${HOUDINI_CXX11_ABI}).")
|
||||
else()
|
||||
message(WARNING "A potential mismatch was detected between the CXX11 ABI "
|
||||
"of libstdc++ and Houdini. The following ABI configuration will be used: "
|
||||
"-D_GLIBCXX_USE_CXX11_ABI=${HOUDINI_CXX11_ABI}. See: "
|
||||
"https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html and "
|
||||
"https://vfxplatform.com/#footnote-gcc6 for more information.")
|
||||
endif()
|
||||
|
||||
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=${HOUDINI_CXX11_ABI})
|
||||
endif()
|
||||
|
||||
|
||||
@@ -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.15)
|
||||
|
||||
|
||||
set(_FIND_MAYA_ADDITIONAL_OPTIONS "")
|
||||
|
||||
+6
-118
@@ -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.15)
|
||||
|
||||
|
||||
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()
|
||||
|
||||
@@ -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.15)
|
||||
|
||||
set(MANIFEST "${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt")
|
||||
|
||||
|
||||
@@ -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.15)
|
||||
|
||||
###############################################################################
|
||||
|
||||
@@ -127,53 +127,8 @@ 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
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/permissive->")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/Zc:throwingNew>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/Zc:inline>")
|
||||
# Excludes APIs such as Cryptography, DDE, RPC, Shell, and Windows Sockets
|
||||
add_compile_definitions("$<$<CXX_COMPILER_ID:MSVC>:WIN32_LEAN_AND_MEAN>")
|
||||
# Disable non-secure CRT library function warnings
|
||||
@@ -184,32 +139,9 @@ add_compile_definitions("$<$<CXX_COMPILER_ID:MSVC>:_CRT_SECURE_NO_WARNINGS>")
|
||||
# https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/
|
||||
# compiler-warning-level-3-c4996?view=vs-2019#posix-function-names
|
||||
add_compile_definitions("$<$<CXX_COMPILER_ID:MSVC>:_CRT_NONSTDC_NO_WARNINGS>")
|
||||
|
||||
# If a user has explicitly requested a parallel build, configure this during CMake
|
||||
if(MSVC_MP_THREAD_COUNT AND MSVC_MP_THREAD_COUNT GREATER 1)
|
||||
# If a user has explicitly requested a parallel build, configure this during CMake
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/MP${MSVC_MP_THREAD_COUNT}>")
|
||||
|
||||
# If building with multiple threads with MSVC, delay generation of PDB files
|
||||
# until the end of compilation to speed up their generation (invoke mspdbsrv once).
|
||||
# This assumes /Zi is being used to generate PDBs (CMakes default)
|
||||
add_compile_options("$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANG_AND_ID:CXX,MSVC>>:/Zf>")
|
||||
endif()
|
||||
|
||||
if(MSVC_COMPRESS_PDB)
|
||||
# /Zi enables PDBs - CMake seems to default to creating PDBs as the defacto way
|
||||
# of handling debug symbols. As these PDBs can be very large, we attempt to compress
|
||||
# them here with various settings. This disable incremental linking and can make
|
||||
# stack traces more confusing.
|
||||
# https://devblogs.microsoft.com/cppblog/shrink-my-program-database-pdb-file/
|
||||
|
||||
# First, generate comdats to allow the linker to remove unused data
|
||||
add_compile_options("$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANG_AND_ID:CXX,MSVC>>:/Gy>")
|
||||
# Remove unreferenced packaged functions and data from comdats
|
||||
add_link_options("$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANG_AND_ID:CXX,MSVC>>:/OPT:REF>")
|
||||
# Fold duplicate comdat data (1 iteration)
|
||||
add_link_options("$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANG_AND_ID:CXX,MSVC>>:/OPT:ICF>")
|
||||
# Generally compress the generated pdbs as they are being created
|
||||
add_link_options("$<$<AND:$<CONFIG:Debug>,$<COMPILE_LANG_AND_ID:CXX,MSVC>>:/PDBCOMPRESS>")
|
||||
endif()
|
||||
|
||||
if(OPENVDB_CXX_STRICT)
|
||||
@@ -219,29 +151,17 @@ if(OPENVDB_CXX_STRICT)
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wall>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wextra>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wconversion>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wnon-virtual-dtor>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wover-aligned>")
|
||||
add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang,AppleClang>:-Wimplicit-fallthrough>")
|
||||
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>")
|
||||
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")
|
||||
@@ -289,7 +209,7 @@ if(CMAKE_BUILD_TYPE EQUAL coverage)
|
||||
endif()
|
||||
|
||||
# Note that the thread, address and memory sanitizers are incompatible with each other
|
||||
set(EXTRA_BUILD_TYPES coverage tsan asan lsan msan ubsan abicheck)
|
||||
set(EXTRA_BUILD_TYPES coverage tsan asan lsan msan ubsan)
|
||||
|
||||
# Set all build flags to empty (unless they have been provided)
|
||||
|
||||
@@ -306,18 +226,7 @@ endforeach()
|
||||
# clang and GCC. Sanitizers are currently only configured for clang and GCC.
|
||||
|
||||
# Coverage
|
||||
# --coverage uses -fprofile-arcs -ftest-coverage (compiling) and -lgcov (linking)
|
||||
# @note consider -fprofile-abs-path from gcc 10
|
||||
# @todo consider using clang with source analysis: -fprofile-instr-generate -fcoverage-mapping.
|
||||
# https://clang.llvm.org/docs/SourceBasedCodeCoverage.html
|
||||
# note that clang also works with gcov (--coverage)
|
||||
# @note Ideally we'd use no optimisations (-O0) with --coverage, but a complete
|
||||
# run of all unit tests takes upwards of a day without them. Thread usage also
|
||||
# impacts total runtime. -Og implies -O1 but without optimisations "that would
|
||||
# otherwise interfere with debugging". This still massively effects branch
|
||||
# coverage tracking compared to -O0 so we should look to improve the speed of
|
||||
# some of the unit tests and also experiment with clang.
|
||||
add_compile_options("$<$<AND:$<CONFIG:COVERAGE>,$<COMPILE_LANG_AND_ID:CXX,GNU,Clang,AppleClang>>:--coverage;-Og>")
|
||||
add_compile_options("$<$<AND:$<CONFIG:COVERAGE>,$<COMPILE_LANG_AND_ID:CXX,GNU,Clang,AppleClang>>:--coverage>")
|
||||
add_link_options("$<$<AND:$<CONFIG:COVERAGE>,$<COMPILE_LANG_AND_ID:CXX,GNU,Clang,AppleClang>>:--coverage>")
|
||||
|
||||
# ThreadSanitizer
|
||||
@@ -348,57 +257,10 @@ add_link_options("$<$<AND:$<CONFIG:MSAN>,$<COMPILE_LANG_AND_ID:CXX,Clang,AppleCl
|
||||
add_compile_options("$<$<AND:$<CONFIG:UBSAN>,$<COMPILE_LANG_AND_ID:CXX,GNU,Clang,AppleClang>>:-fsanitize=undefined>")
|
||||
add_link_options("$<$<AND:$<CONFIG:UBSAN>,$<COMPILE_LANG_AND_ID:CXX,GNU,Clang,AppleClang>>:-fsanitize=undefined>")
|
||||
|
||||
# ABI Check. This build type is expected to work with the abi-dumper/abi-compliance-checker
|
||||
# binaries which expect specific debug information. In particular, for GCC versions >= 11
|
||||
# we have to explicitly select dwarf versions < 5 as the abi-dumper doesn't support dwarf5
|
||||
# and will always incorrectly report successful ABI checks
|
||||
# https://github.com/lvc/abi-dumper/issues/33
|
||||
add_compile_options("$<$<CONFIG:ABICHECK>:-gdwarf-4;-g3;-ggdb;-Og>")
|
||||
|
||||
# CMAKE_BUILD_TYPE is ignored for multi config generators i.e. MSVS
|
||||
|
||||
get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||
if(NOT _isMultiConfig)
|
||||
message(STATUS "CMake Build Type: ${CMAKE_BUILD_TYPE}")
|
||||
endif()
|
||||
if(OPENVDB_ENABLE_ASSERTS)
|
||||
message(STATUS "OpenVDB asserts are ENABLED")
|
||||
endif()
|
||||
|
||||
# Intialize extra build type targets where possible
|
||||
|
||||
if(NOT TARGET gcov_html)
|
||||
find_program(GCOVR_PATH gcovr)
|
||||
if(NOT GCOVR_PATH AND CMAKE_BUILD_TYPE STREQUAL "coverage")
|
||||
message(WARNING "Unable to initialize gcovr target. coverage build types will still generate gcno files.")
|
||||
elseif(GCOVR_PATH)
|
||||
# init gcov commands
|
||||
set(GCOVR_HTML_FOLDER_CMD ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/gcov_html)
|
||||
set(GCOVR_HTML_CMD
|
||||
${GCOVR_PATH} --html --html-details -r ${PROJECT_SOURCE_DIR} --object-directory=${PROJECT_BINARY_DIR}
|
||||
-o gcov_html/index.html
|
||||
)
|
||||
|
||||
# Add a custom target which converts .gcda files to a html report using gcovr.
|
||||
# Note that this target does NOT run ctest or any binaries - that is left to
|
||||
# the implementor of the gcov workflow. Typically, the order of operations
|
||||
# would be:
|
||||
# - run CMake with unit tests on
|
||||
# - ctest
|
||||
# - make gcov_html
|
||||
add_custom_target(gcov_html
|
||||
COMMAND ${GCOVR_HTML_FOLDER_CMD}
|
||||
COMMAND ${GCOVR_HTML_CMD}
|
||||
BYPRODUCTS ${PROJECT_BINARY_DIR}/gcov_html/index.html # report directory
|
||||
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
|
||||
VERBATIM
|
||||
COMMENT "Running gcovr to produce HTML code coverage report."
|
||||
)
|
||||
|
||||
# Show info where to find the report
|
||||
add_custom_command(TARGET gcov_html POST_BUILD
|
||||
COMMAND ;
|
||||
COMMENT "Open ./gcov_html/index.html in your browser to view the coverage report."
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright Contributors to the OpenVDB Project
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
#
|
||||
#[=======================================================================[
|
||||
|
||||
@@ -8,78 +8,62 @@
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
|
||||
###############################################################################
|
||||
|
||||
# Configure minimum version requirements - some are treated specially and fall
|
||||
# outside of the DISABLE_DEPENDENCY_VERSION_CHECKS catch
|
||||
set(MINIMUM_CXX_STANDARD 17)
|
||||
set(MINIMUM_CXX_STANDARD 14)
|
||||
|
||||
# @note ABI always enforced so the correct deprecation messages are available.
|
||||
# OPENVDB_USE_DEPRECATED_ABI_<VERSION> should be used to circumvent this
|
||||
math(EXPR MINIMUM_OPENVDB_ABI_VERSION "${OpenVDB_MAJOR_VERSION}-2")
|
||||
math(EXPR FUTURE_OPENVDB_ABI_VERSION "${OpenVDB_MAJOR_VERSION}+1")
|
||||
|
||||
# List of deprecated but supported OpenVDB ABIs for this version of OpenVDB
|
||||
math(EXPR _PREV_ABI "${OpenVDB_MAJOR_VERSION}-1")
|
||||
set(OPENVDB_DEPRECATED_ABI_LIST ${MINIMUM_OPENVDB_ABI_VERSION} ${_PREV_ABI})
|
||||
unset(_PREV_ABI)
|
||||
set(MINIMUM_OPENVDB_ABI_VERSION 7)
|
||||
set(FUTURE_MINIMUM_OPENVDB_ABI_VERSION 9)
|
||||
set(FUTURE_OPENVDB_ABI_VERSION 10)
|
||||
|
||||
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 CY2020 of the VFX platform where available
|
||||
set(MINIMUM_GCC_VERSION 6.3.1)
|
||||
set(MINIMUM_CLANG_VERSION 3.8)
|
||||
set(MINIMUM_ICC_VERSION 17)
|
||||
set(MINIMUM_MSVC_VERSION 19.10)
|
||||
|
||||
# @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_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_BOOST_VERSION 1.82)
|
||||
set(MINIMUM_OPENEXR_VERSION 3.2)
|
||||
set(MINIMUM_IMATH_VERSION 3.2)
|
||||
set(MINIMUM_BOOST_VERSION 1.70)
|
||||
set(MINIMUM_ILMBASE_VERSION 2.4)
|
||||
set(MINIMUM_OPENEXR_VERSION 2.4)
|
||||
set(MINIMUM_ZLIB_VERSION 1.2.7)
|
||||
set(MINIMUM_TBB_VERSION 2020.3)
|
||||
set(MINIMUM_LLVM_VERSION 15.0.0)
|
||||
set(MINIMUM_BLOSC_VERSION 1.17.0)
|
||||
set(MINIMUM_GLFW_VERSION 3.3)
|
||||
set(MINIMUM_TBB_VERSION 2019.0)
|
||||
set(MINIMUM_LLVM_VERSION 7.0.0)
|
||||
set(MINIMUM_BLOSC_VERSION 1.5.0)
|
||||
|
||||
set(MINIMUM_PYTHON_VERSION 3.11)
|
||||
set(MINIMUM_PYTHON_VERSION 2.7) # @warning should be 3.7.x, but H18.5+ can still be used with 2.7.x
|
||||
set(MINIMUM_NUMPY_VERSION 1.17.0)
|
||||
|
||||
set(MINIMUM_GOOGLETEST_VERSION 1.10)
|
||||
set(MINIMUM_LOG4CPLUS_VERSION 2.0)
|
||||
set(MINIMUM_HOUDINI_VERSION 20.5)
|
||||
set(MINIMUM_GLFW_VERSION 3.1)
|
||||
set(MINIMUM_LOG4CPLUS_VERSION 1.1.2)
|
||||
set(MINIMUM_HOUDINI_VERSION 18.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
|
||||
# @note At the time of writing, any variables that are commented out don't
|
||||
# have target transitional versions.
|
||||
# VFX 21 deprecations to transition to MINIMUM_* variables in OpenVDB 10.0.0
|
||||
|
||||
# set(FUTURE_MINIMUM_GCC_VERSION 11.2.1)
|
||||
# set(FUTURE_MINIMUM_MSVC_VERSION 19.30)
|
||||
# set(FUTURE_MINIMUM_ICC_VERSION 19)
|
||||
set(FUTURE_MINIMUM_GCC_VERSION 9.3.1)
|
||||
set(FUTURE_MINIMUM_ICC_VERSION 19)
|
||||
# set(FUTURE_MINIMUM_MSVC_VERSION 19.10)
|
||||
|
||||
# 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_BLOSC_VERSION 1.17.0)
|
||||
# set(FUTURE_MINIMUM_PYTHON_VERSION 3.11)
|
||||
# set(FUTURE_MINIMUM_HOUDINI_VERSION 20.0)
|
||||
set(FUTURE_MINIMUM_LLVM_VERSION 18.0.0)
|
||||
set(FUTURE_MINIMUM_CXX_STANDARD 17)
|
||||
set(FUTURE_MINIMUM_CMAKE_VERSION 3.18)
|
||||
#set(FUTURE_MINIMUM_ILMBASE_VERSION 2.4) # Minimum is already 2.4
|
||||
#set(FUTURE_MINIMUM_OPENEXR_VERSION 2.4) # Minimum is already 2.4
|
||||
set(FUTURE_MINIMUM_BOOST_VERSION 1.73)
|
||||
set(FUTURE_MINIMUM_BLOSC_VERSION 1.17.0)
|
||||
set(FUTURE_MINIMUM_TBB_VERSION 2020.2)
|
||||
set(FUTURE_MINIMUM_PYTHON_VERSION 3.7)
|
||||
set(FUTURE_MINIMUM_NUMPY_VERSION 1.19.0)
|
||||
set(FUTURE_MINIMUM_HOUDINI_VERSION 19.0)
|
||||
set(FUTURE_MINIMUM_LLVM_VERSION 10.0.0)
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
#################################################################################
|
||||
## This file is loaded by the Leak/Address Sanitizer build for the unit tests. ##
|
||||
## It can be used to ignore various errors reported by the sanitizer. This is ##
|
||||
## especially useful with upstream issues (e.g. boost/tbb). For help defining ##
|
||||
## suppression rules, see: ##
|
||||
## https://clang.llvm.org/docs/AddressSanitizer.html ##
|
||||
## The build is configured with CMAKE_BUILD_TYPE=asan or lsan ##
|
||||
#################################################################################
|
||||
|
||||
##### Upstream #####
|
||||
|
||||
# Leaks from TBB init which occur due to tbb teardown issues
|
||||
# https://github.com/oneapi-src/oneTBB/issues/206
|
||||
# Should be fixed in oneTBB. Ignore them for now
|
||||
leak:tbb::internal::task_stream<3>::initialize*
|
||||
@@ -16,6 +16,9 @@ vptr:tbb/task.h
|
||||
|
||||
##### OpenVDB #####
|
||||
|
||||
# The sOn/sOff static bool data held on the LeaffBuff<bool> objects can be
|
||||
# initialised to arbitrary true/false values. See the note in LeafBuffer.h
|
||||
enum:openvdb/tools/Activate.h
|
||||
# Some 2s complement tests, ignore the negative shifts
|
||||
# @todo Should address these
|
||||
shift-base:TestMultiResGrid.cc
|
||||
|
||||
+25
-101
@@ -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.15)
|
||||
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,10 @@ set(DOXY_FILES
|
||||
openvdb/openvdb/io
|
||||
openvdb/openvdb/math
|
||||
openvdb/openvdb/points
|
||||
openvdb/openvdb/thread
|
||||
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 +56,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 +108,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>, \;<i>j</i>, \;<i>k</i>)"]]
|
||||
[[xyz="(<i>x</i>, \;<i>y</i>, \;<i>z</i>)"]]
|
||||
[[ijk="(<i>i</i>, <i>j</i>, <i>k</i>)"]]
|
||||
[[xyz="(<i>x</i>, <i>y</i>, <i>z</i>)"]]
|
||||
[[const="<tt>const</tt>"]]
|
||||
"\"vdbnamespace=openvdb::v${OpenVDB_MAJOR_VERSION}_${OpenVDB_MINOR_VERSION}\""
|
||||
[["hunamespace=houdini_utils"]]
|
||||
@@ -216,18 +141,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 +188,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 +203,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")
|
||||
|
||||
@@ -298,11 +215,13 @@ if(OPENVDB_DOXYGEN_AX)
|
||||
doc/ax/doc.txt
|
||||
openvdb_ax/openvdb_ax
|
||||
openvdb_ax/openvdb_ax/ast
|
||||
openvdb_ax/openvdb_ax/cmd
|
||||
openvdb_ax/openvdb_ax/codegen
|
||||
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,10 @@ if(OPENVDB_DOXYGEN_NANOVDB)
|
||||
doc/nanovdb/HelloWorld.md
|
||||
nanovdb/nanovdb
|
||||
nanovdb/nanovdb/util
|
||||
nanovdb/nanovdb/cmd/convert
|
||||
nanovdb/nanovdb/cmd/print
|
||||
nanovdb/nanovdb/cmd/validate
|
||||
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 +257,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)
|
||||
|
||||
+291
-233
@@ -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 "[] 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 `" "`.
|
||||
by quotes <b>\" \"</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 &= b<br/>a |= b<br/>a ^= b<br/>a <<= b<br/>a >>= 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 & b<br/>a | b<br/>
|
||||
a ^ b<br/>a << b<br/>a >> 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 < b<br/>a > b<br/>a <= b<br/>a >= b
|
||||
</code>
|
||||
</p></td>
|
||||
<td style="border-right-width: thick"><p> <!-- *********************** COLUMN LOGICAL *********************** -->
|
||||
`a && b`<br/>`a || b`
|
||||
<code>
|
||||
a && b<br/>a || 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/>{ a,b ... }
|
||||
</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>`&=`</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>`<<=`</b> @a `rhs` </td><td>Reference to @a `lhs`</td></tr>
|
||||
<tr><td>Bitwise shift right assignment</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`>>=`</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] = b; ... a[n-1] = 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] = b; ... a[n-1] = 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] = b[0]; ... a[n-1] = 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>`&=`</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>
|
||||
</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 Name</th><th>Operator 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>`&`</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>`<<`</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>`>>`</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 Name</th><th>Operator 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
|
||||
@@ -1148,11 +1165,10 @@ operations (if an operation is not listed, it is not supported):
|
||||
<tr style="text-align:center">
|
||||
<th>Left Operand Type</th><th>Binary Op(s)</th><th>Right Operand Type</th><th>Description</th>
|
||||
</tr>
|
||||
<tr style="text-align:center"><td rowspan="3">@ref axscalars "scalar"</td><td rowspan="1">`== != < > <= >=`</td><td>@ref axscalars "scalar"</td>
|
||||
<tr style="text-align:center"><td rowspan="3">@ref axscalars "scalar"</td><td rowspan="3">`== != < > <= >=`</td><td>@ref axscalars "scalar"</td>
|
||||
<td style="text-align:left">Returns the result of the scalar comparison.</td>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<td rowspan="2">`== !=`</td>
|
||||
<td>@ref axvecmats "vector"</td>
|
||||
<td style="text-align:left" rowspan="2">
|
||||
Performs per component comparisons (after
|
||||
@@ -1179,12 +1195,11 @@ for (int i = 1; i < 3; ++i) c &= a[i] == b;
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<td style="border-top-width: thick" rowspan="2">@ref axvecmats "vector"</td>
|
||||
<td style="border-top-width: thick; text-align:center" rowspan="1">`== != < > <= >=`</td>
|
||||
<td style="border-top-width: thick; text-align:center" rowspan="2">`== != < > <= >=`</td>
|
||||
<td style="border-top-width: thick">@ref axscalars "scalar"</td>
|
||||
<td style="border-top-width: thick;text-align:left">Same as `scalar op vector`</td>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<td rowspan="1">`== !=`</td>
|
||||
<td>@ref axvecmats "vector"</td>
|
||||
<td style="text-align:left">
|
||||
Performs binary comparison operations (after
|
||||
@@ -1205,13 +1220,11 @@ for (int i = 1; i < 3; ++i) c &= a[i] == b[i];
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<td style="border-top-width: thick" rowspan="2">@ref axvecmats "matrix"</td>
|
||||
<td style="border-top-width: thick; text-align:center" rowspan="1">`== != < > <= >=`</td>
|
||||
<td style="border-top-width: thick; text-align:center" rowspan="2">`== != < > <= >=`</td>
|
||||
<td style="border-top-width: thick">@ref axscalars "scalar"</td>
|
||||
<td style="border-top-width: thick;text-align:left">Same as `scalar op matrix`</td>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<td rowspan="1">`== !=`</td>
|
||||
<td>@ref axvecmats "matrix"</td>
|
||||
<tr style="text-align:center"><td>@ref axvecmats "matrix"</td>
|
||||
<td style="text-align:left">
|
||||
Performs binary comparison operations (after
|
||||
@ref axtypeprecedence "implicit conversion") on each pair corresponding
|
||||
@@ -1247,10 +1260,10 @@ They have the following forms:
|
||||
@par
|
||||
<table>
|
||||
<tr><th>Operator Name</th><th>Operator 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 +1296,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 +1361,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 +1405,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 +1440,20 @@ the following forms:
|
||||
<tr><th>Operator Name</th><th>Operator Syntax</th><th>Returns</th></tr>
|
||||
<tr style="text-align:left">
|
||||
<td>Dot Component Access</td>
|
||||
<td> <em>`vector`</em> <b>.</b> `component` </td>
|
||||
<td>Reference to component `component` of `vector`</td>
|
||||
<td bgcolor="#ffc4c4"> <em>`vector`</em> <b>.</b> @a `component` </td>
|
||||
<td>Reference to component @a `component` of @a `vector`</td>
|
||||
</tr>
|
||||
<tr style="text-align:left">
|
||||
<td>Container Component Access</td>
|
||||
<td> <em>`container`</em> <b>[</b> `exp` <b>]</b> </td>
|
||||
<td>Reference to component at index `exp` of `container`</td>
|
||||
<td bgcolor="#ffc4c4"> <em>`container`</em> <b>[</b> @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 Component Access</td>
|
||||
<td> <em>`matrix`</em> <b>[</b> `exp1`, <em>`exp2`</em> <b>]</b> </td>
|
||||
<td bgcolor="#ffc4c4"> <em>`matrix`</em> <b>[</b> @a `exp1`, <em>`exp2`</em> <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 * dimension + exp2]` </em></b>
|
||||
of @a `matrix` where @a `dimension` is the the size of the matrix</td>
|
||||
</tr>
|
||||
</table>
|
||||
@par
|
||||
@@ -1454,11 +1467,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 +1488,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 +1503,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 +1529,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 +1551,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 +1580,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 +1699,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> <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> <b>`?`</b> <em>`b`</em> <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> <em> `a, `</em> `b `<b>`... }`</b> </td>
|
||||
<td>Returns a temporary vector or matrix</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -1670,10 +1724,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 +1736,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 +1749,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 +1776,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> <b>`?`</b> <em>`b`</em> <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> <em>`a, b `</em><b>`... }`</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 +1829,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 +2000,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 +2021,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 +2060,8 @@ foreach(ActiveVoxel in surface)
|
||||
DensityIndexSpaceCoord = density.transformToIndex(SurfaceWorldSpaceCoord);
|
||||
ActiveVoxel = density.getValue(DensityIndexSpaceCoord);
|
||||
@endcode
|
||||
done()
|
||||
-->
|
||||
|
||||
|
||||
@subsection axexternalaccess External Parameter Access
|
||||
@@ -2048,4 +2104,6 @@ AX Roadmap as a near future feature.
|
||||
|
||||
@section axvexsupport AX VEX Support
|
||||
|
||||
</div>
|
||||
|
||||
*/
|
||||
|
||||
+12
-9
@@ -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
@@ -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>
|
||||
*/
|
||||
|
||||
@@ -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
@@ -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>
|
||||
*/
|
||||
|
||||
+34
-29
@@ -87,7 +87,7 @@ given FindModule e.g. `FindBlosc.cmake`:
|
||||
- @b Xxx_ROOT - Preferred installation prefix. The given dependency is
|
||||
expected to follow a folder structure `Xxx_ROOT/include` and `Xxx_ROOT/lib`
|
||||
exist. Note that unlike the above, this is the case matching name of the
|
||||
find package .i.e. Blosc_ROOT, TBB_ROOT etc.
|
||||
find package .i.e. Blosc_ROOT, IlmBase_ROOT, TBB_ROOT etc.
|
||||
- @b XXX_INCLUDEDIR / @b XXX_LIBRARYDIR - Preferred include and library
|
||||
directories
|
||||
- @b SYSTEM_LIBRARY_PATHS - A list of paths appended to all include and lib
|
||||
@@ -238,8 +238,12 @@ 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 | 18.0 | 6 |
|
||||
Houdini | 18.5 | 7 |
|
||||
Houdini | 19.0 | 8 |
|
||||
Maya | 2017 | Any |
|
||||
Maya | 2018 | Any |
|
||||
Maya | 2019 | Any |
|
||||
|
||||
@subsection buildBuildHou Building Against Houdini
|
||||
|
||||
@@ -254,16 +258,17 @@ OpenVDB components you wish to build.
|
||||
Package | Description | OpenVDB Components |
|
||||
-------------- | --------------------------------------------------------------- | ------------------ |
|
||||
CMake | Cross-platform family of tools designed to help build software | All |
|
||||
C++17 Compiler | Matching Houdini compiler and version | All |
|
||||
Boost | Components: iostreams | All |
|
||||
C++14 Compiler | Matching Houdini compiler and version | All |
|
||||
Boost | Components: iostreams, python, thread | 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) |
|
||||
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++14 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 +293,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
|
||||
@@ -342,23 +347,24 @@ Supported versions of maya only ship with TBB.
|
||||
Package | Description | OpenVDB Components |
|
||||
-------------- | --------------------------------------------------------------- | -------------------------------- |
|
||||
CMake | Cross-platform family of tools designed to help build software | All |
|
||||
C++17 Compiler | Matching Houdini compiler and version | All |
|
||||
Boost | Components: iostreams | All |
|
||||
C++14 Compiler | Matching Houdini compiler and version | All |
|
||||
Boost | Components: iostreams, python, thread | All |
|
||||
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) |
|
||||
IlmBase | 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) |
|
||||
NumPy | Scientific computing with Python | Optional (Python) |
|
||||
LLVM | Target-independent code generation | OpenVDB AX |
|
||||
|
||||
|
||||
* See [blosc support](@ref buildBloscSupport)
|
||||
|
||||
At a minimum, boost, a matching C++17 compiler, ZLIB, blosc and CMake will be
|
||||
At a minimum, boost, a matching C++14 compiler, ZLIB, blosc and CMake will be
|
||||
required. See the full [dependency list](@ref dependencies) for help with
|
||||
downloading and installing the above software.
|
||||
|
||||
@@ -381,19 +387,21 @@ 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
|
||||
install the Maya plugin to. Defaults to the value of `${CMAKE_INSTALL_PREFIX}/maya${Maya_VERSION}`
|
||||
- @b BOOST_ROOT =`/path/to/boost/install` # Path to boost. May not be required,
|
||||
CMake may find it automatically
|
||||
- @b IlmBase_ROOT =`/path/to/ilmbase/install` # Path to ilmbase.
|
||||
|
||||
For example on MacOS and where the build folder has been created inside the
|
||||
OpenVDB source root:
|
||||
|
||||
@code
|
||||
cmake -D BOOST_ROOT=/path/to/boost/install \
|
||||
-D IlmBase_ROOT=/path/to/ilmbase/install \
|
||||
-D Maya_ROOT=/Applications/Autodesk/maya2019/ \
|
||||
-D USE_MAYA=ON \
|
||||
../
|
||||
@@ -449,7 +457,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 +516,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.15)
|
||||
list(APPEND CMAKE_MODULE_PATH "/location/of/openvdb/install/lib/cmake/OpenVDB")
|
||||
find_package(OpenVDB REQUIRED)
|
||||
target_link_libraries(myapp OpenVDB::openvdb)
|
||||
@@ -579,7 +587,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 +609,8 @@ 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.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.
|
||||
- Boost 1.68, 1.69 require CMake 3.13 or newer.
|
||||
- Boost 1.70 requires CMake 3.14 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 +636,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 +660,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'
|
||||
|
||||
+83
-1083
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -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
|
||||
|
||||
+101
-92
@@ -9,6 +9,7 @@
|
||||
- @ref depInstallingDependencies
|
||||
- @ref depUsingAptGet
|
||||
- @ref depUsingHomebrew
|
||||
- @ref depManInstall
|
||||
<!-- - @ref depContents -->
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
@@ -34,94 +35,89 @@ Reference Platform, but for those that do, their specified versions are
|
||||
|
||||
@section depComponents OpenVDB Components
|
||||
|
||||
Component | Requirements | Optional
|
||||
----------------------- | ----------------------------------------------- | --------
|
||||
OpenVDB Core Library | CMake, C++17 compiler, TBB::tbb | Blosc, ZLib, Log4cplus, Imath::Imath (included), Boost::iostream, VCL (included)
|
||||
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 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) | -
|
||||
Component | Requirements | Optional
|
||||
----------------------- | ------------------------------------------------- | --------
|
||||
OpenVDB Core Library | CMake, C++14 compiler, TBB::tbb, Boost::iostream | Blosc, ZLib, Log4cplus, IlmBase::Half
|
||||
OpenVDB Print | Core Library dependencies | -
|
||||
OpenVDB LOD | Core Library dependencies | -
|
||||
OpenVDB Render | Core Library dependencies | OpenEXR, IlmBase, libpng
|
||||
OpenVDB View | Core Library dependencies, OpenGL, GLFW3, GLEW* | -
|
||||
OpenVDB Python | Core Library dependencies, Python, Boost::python | Boost::numpy, NumPy
|
||||
OpenVDB AX | Core Library dependencies, LLVM | Bison, Flex
|
||||
NanoVDB | - | Core Library, CUDA, TBB, Blosc, ZLib
|
||||
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.12 | Latest | Cross-platform family of tools designed to help build software | Y | Y | https://cmake.org
|
||||
GCC | 6.3.1 | 6.3.1 | C++ 14 Compiler: The GNU Compiler Collection | Y | Y | https://www.gnu.org/software/gcc
|
||||
Clang | 3.8 | Latest | C++ 14 Compiler: A C language family frontend for LLVM | Y | Y | https://clang.llvm.org
|
||||
Intel ICC | 17 | Latest | C++ 14 Compiler: Intels C++ Compiler | Y | Y | https://software.intel.com/en-us/c-compilers
|
||||
MSVC | 19.10 | Latest | C++ 14 Compiler: Microsoft Visual C++ Compiler | Y | Y | https://visualstudio.microsoft.com/vs
|
||||
IlmBase | 2.2** | 2.3 | Used half precision floating points and EXR serialization support | Y | Y | http://www.openexr.com
|
||||
OpenEXR | 2.2** | 2.3 | EXR serialization support | Y | Y | http://www.openexr.com
|
||||
TBB | 2018 | 2018 | 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.66 | 1.66 | Components: iostreams, python, numpy | Y | Y | https://www.boost.org
|
||||
LLVM | 6.0.0 | 8.0.0 | Target-independent code generation | Y | Y | https://llvm.org/
|
||||
Bison | 3.0.0 | 3.0.5 | General-purpose parser generator | Y | Y | https://www.gnu.org/software/gcc
|
||||
Flex | 2.6 | 2.6.4 | Fast lexical analyzer generator | Y | Y | https://github.com/westes/flex
|
||||
Python | 2.7 | 2.7 | The python interpreter and libraries for C++/python bindings | Y | Y | https://www.python.org
|
||||
NumPy | 1.14.0 | 1.14.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 | 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.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 versions.
|
||||
|
||||
- @b ** IlmBase/OpenEXR 2.2 is supported as Houdini 18.0 is shipped with
|
||||
VFX Reference Platform 2019, except for using older versions of these
|
||||
libraries.
|
||||
|
||||
@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 GLFW: Crash with GLFW 3.2.1 when used with EGL on Linux. OpenVDB View may
|
||||
segfault on closure. Fixed in GLFW 3.3
|
||||
|
||||
- @b Blosc: OpenVDB has historically used an old version of blosc (1.5.0) to
|
||||
serialize .vdb files. OpenVDB has moved to a new blosc version minimum of
|
||||
1.17.0. We have tested a range of blosc versions and found that the following
|
||||
versions are NOT compatible with OpenVDB caches written using blosc 1.5.0.
|
||||
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 Boost 1.66/1.67 + @b Python3 + @b NumPy: Known issue on UNIX systems
|
||||
which can cause the below python runtime error. Consider updating to Boost 1.68
|
||||
if you require both Python3 and NumPy support:
|
||||
|
||||
- @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`.
|
||||
@code{.sh}
|
||||
RuntimeError: FATAL: module compiled as little endian, but detected different endianness at runtime.
|
||||
@endcode
|
||||
|
||||
- @b Blosc: OpenVDB has historically used an old version of blosc (1.5.0) to
|
||||
serialize .vdb files. OpenVDB is moving to a new blosc version minimum of 1.17.0.
|
||||
We have tested a range of blosc versions and found that the following versions
|
||||
are NOT compatible with OpenVDB caches written using blosc 1.5.0. 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
|
||||
|
||||
@section depInstallingDependencies Installing Dependencies
|
||||
|
||||
@@ -130,22 +126,8 @@ required OpenVDB dependencies.
|
||||
|
||||
@subsection depUsingAptGet Using UNIX apt-get
|
||||
|
||||
You can use apt to automatically install required packages. Note that different
|
||||
Ubuntu distributions will have different versions available. You can use apt
|
||||
pinning to request newer versions of specific package from later distributions
|
||||
if the required version isn't available by default (see
|
||||
[man apt_preferences](https://linux.die.net/man/5/apt_preferences)). For
|
||||
example, the below settings will request TBB specifically from Ubuntu 22.04
|
||||
(Jammy).
|
||||
|
||||
@code{.sh}
|
||||
Package: libtbb-dev
|
||||
Pin: release n=jammy
|
||||
Pin-Priority: 990
|
||||
@endcode
|
||||
|
||||
Alternatively you can install any missing dependencies manually or through
|
||||
other package managers.
|
||||
@b Note:CppUnit is unavailable using apt-get. See the other package manager
|
||||
methods or the [manual installation](@ref depManInstall) options.
|
||||
|
||||
@code{.sh}
|
||||
#!/bin/bash
|
||||
@@ -156,12 +138,15 @@ 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-8-dev # LLVM
|
||||
# Python
|
||||
apt-get install libboost-python-dev # Boost::python
|
||||
apt-get install libboost-numpy-dev # Boost::numpy
|
||||
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 libilmbase-dev # IlmBase
|
||||
apt-get install libopenexr-dev # OpenEXR
|
||||
apt-get install liblog4cplus-dev # Log4cplus
|
||||
apt-get install googletest # GoogleTest
|
||||
@@ -189,17 +174,41 @@ brew install c-blosc # blosc
|
||||
# AX
|
||||
brew install llvm # LLVM
|
||||
# Python
|
||||
brew install boost-python # Boost-python
|
||||
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
|
||||
brew install ilmbase # IlmBase
|
||||
brew install openexr # OpenEXR
|
||||
brew install libpng # libpng
|
||||
# Documentation
|
||||
brew install doxygen # Doxygen
|
||||
@endcode
|
||||
|
||||
@subsection depManInstall UNIX Manual Installations
|
||||
|
||||
Some dependencies may be unavailable using the above package manager methods.
|
||||
Below are manual installation methods for these packages. Note that you will
|
||||
have to provide your chosen installation locations to the OpenVDB CMake build
|
||||
system when building OpenVDB.
|
||||
|
||||
@b CppUnit (for AX Unit Tests)
|
||||
|
||||
@code{.sh}
|
||||
#!/bin/bash
|
||||
wget http://dev-www.libreoffice.org/src/cppunit-1.13.2.tar.gz
|
||||
tar -xvzf cppunit-1.13.2.tar.gz
|
||||
cd cppunit-1.13.2
|
||||
# Install to users home directory - you may customise this location
|
||||
mkdir -p $HOME/cppunit
|
||||
./configure --prefix=$HOME/cppunit
|
||||
make
|
||||
make install
|
||||
@endcode
|
||||
|
||||
*/
|
||||
|
||||
+28
-18
@@ -22,31 +22,44 @@ primarily by
|
||||
- Mihai Aldé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’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".
|
||||
|
||||
|
||||
|
||||
@page overview OpenVDB Overview
|
||||
|
||||
@section Contents
|
||||
@@ -67,9 +80,6 @@ Contributors, please familiarize yourselves with our
|
||||
- @ref subsecNodeIter
|
||||
- @ref subsecValueAccessor
|
||||
- @ref subsecTraversal
|
||||
- @subpage transformsAndMaps "Transforms and Maps"
|
||||
|
||||
|
||||
<!-- - @ref secRegistry -->
|
||||
|
||||
|
||||
@@ -309,7 +319,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
|
||||
|
||||
+7
-1
@@ -921,7 +921,7 @@ openvdb::Vec3SGrid::Ptr grid = ...;
|
||||
|
||||
// Construct the rotation matrix.
|
||||
openvdb::math::Mat3s rot45 =
|
||||
openvdb::math::rotation<openvdb::math::Mat3s>(openvdb::math::Y_AXIS, openvdb::math::pi<double>()/4.0);
|
||||
openvdb::math::rotation<openvdb::math::Mat3s>(openvdb::math::Y_AXIS, M_PI_4);
|
||||
|
||||
// Apply the functor to all active values.
|
||||
openvdb::tools::foreach(grid->beginValueOn(), MatMul(rot45));
|
||||
@@ -1199,6 +1199,7 @@ void processTypedGrid(openvdb::GridBase::Ptr grid, OpType& op)
|
||||
else if (grid->isType<openvdb::Vec3IGrid>()) CALL_OP(openvdb::Vec3IGrid);
|
||||
else if (grid->isType<openvdb::Vec3SGrid>()) CALL_OP(openvdb::Vec3SGrid);
|
||||
else if (grid->isType<openvdb::Vec3DGrid>()) CALL_OP(openvdb::Vec3DGrid);
|
||||
else if (grid->isType<openvdb::StringGrid>()) CALL_OP(openvdb::StringGrid);
|
||||
|
||||
#undef CALL_OP
|
||||
}
|
||||
@@ -1220,6 +1221,11 @@ struct PruneOp {
|
||||
{
|
||||
grid->tree().prune(typename GridType::ValueType(tolerance));
|
||||
}
|
||||
// Overload to handle string-valued grids
|
||||
void operator()(openvdb::StringGrid::Ptr grid) const
|
||||
{
|
||||
grid->tree().prune();
|
||||
}
|
||||
};
|
||||
|
||||
// Read all grids from a file.
|
||||
|
||||
+5
-5
@@ -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 B in the <i>Transactions on Graphics</i> paper.
|
||||
|
||||
@section sMaxRes Is OpenVDB unbounded?
|
||||
|
||||
@@ -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"> $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: 1.0 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 15 KiB |
+2
-2
@@ -78,7 +78,7 @@ openvdb::math::Transform::Ptr linearTransform =
|
||||
// Rotate the transform by 90 degrees about the X axis.
|
||||
// As a result the j-index will now map into the -z physical direction,
|
||||
// and the k-index will map to the +y physical direction.
|
||||
linearTransform->preRotate(openvdb::math::pi<double>()/2.0, openvdb::math::X_AXIS);
|
||||
linearTransform->preRotate(M_PI/2, openvdb::math::X_AXIS);
|
||||
@endcode
|
||||
|
||||
@subsection sFrustumTransforms Frustum Transforms
|
||||
@@ -302,7 +302,7 @@ convention of right-multiplication of the matrix against a vector:
|
||||
openvdb::math::Mat4d transform = openvdb::math::Mat4d::identity();
|
||||
transform.preScale(openvdb::math::Vec3d(2,3,2));
|
||||
transform.postTranslate(openvdb::math::Vec3d(1,0,0));
|
||||
transform.postRotate(openvdb::math::X_AXIS, openvdb::math::pi<double>()/3.0);
|
||||
transform.postRotate(openvdb::math::X_AXIS, M_PI/3.0);
|
||||
|
||||
// Location of a point in index space
|
||||
openvdb::math::Vec3d indexSpace(1,2,3);
|
||||
|
||||
+1
-1
@@ -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
@@ -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/OpenToNanoVDB.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::openToNanoVDB(*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/DefaultCudaAllocator.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);
|
||||
}
|
||||
```
|
||||
|
||||
+34
-169
@@ -5,175 +5,40 @@
|
||||
* [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
|
||||
│ ├── CMakeLists.txt
|
||||
│ ├── convert
|
||||
│ │ └── 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
|
||||
│ ├── CMakeLists.txt
|
||||
│ ├── ex_bump_pool_buffer
|
||||
│ │ └── bump_pool_buffer.cc
|
||||
│ ├── ex_collide_level_set
|
||||
│ │ ├── common.h
|
||||
│ │ ├── main.cc
|
||||
│ │ ├── nanovdb.cu
|
||||
│ │ └── openvdb.cc
|
||||
│ ├── ex_index_grid_cuda
|
||||
│ │ ├── index_grid_cuda.cc
|
||||
│ │ └── index_grid_cuda_kernel.cu
|
||||
│ ├── ex_make_custom_nanovdb
|
||||
│ │ └── make_custom_nanovdb.cc
|
||||
│ ├── ex_make_custom_nanovdb_cuda
|
||||
│ │ ├── make_custom_nanovdb_cuda.cc
|
||||
│ │ └── make_custom_nanovdb_cuda_kernel.cu
|
||||
│ ├── ex_make_funny_nanovdb
|
||||
│ │ └── make_funny_nanovdb.cc
|
||||
│ ├── ex_make_nanovdb_sphere
|
||||
│ │ └── make_nanovdb_sphere.cc
|
||||
│ ├── ex_make_typed_grids
|
||||
│ │ └── make_typed_grids.cc
|
||||
│ ├── 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
|
||||
│ │ └── nodemanager_cuda_kernel.cu
|
||||
│ ├── ex_openvdb_to_nanovdb
|
||||
│ │ └── openvdb_to_nanovdb.cc
|
||||
│ ├── ex_openvdb_to_nanovdb_accessor
|
||||
│ │ └── openvdb_to_nanovdb_accessor.cc
|
||||
│ ├── ex_openvdb_to_nanovdb_cuda
|
||||
│ │ ├── openvdb_to_nanovdb_cuda.cc
|
||||
│ │ └── openvdb_to_nanovdb_cuda_kernel.cu
|
||||
│ ├── ex_raytrace_fog_volume
|
||||
│ │ ├── common.h
|
||||
│ │ ├── main.cc
|
||||
│ │ ├── nanovdb.cu
|
||||
│ │ └── openvdb.cc
|
||||
│ ├── ex_raytrace_level_set
|
||||
│ │ ├── common.h
|
||||
│ │ ├── main.cc
|
||||
│ │ ├── nanovdb.cu
|
||||
│ │ └── openvdb.cc
|
||||
│ ├── ex_read_nanovdb_sphere
|
||||
│ │ └── read_nanovdb_sphere.cc
|
||||
│ ├── ex_read_nanovdb_sphere_accessor
|
||||
│ │ └── read_nanovdb_sphere_accessor.cc
|
||||
│ ├── ex_read_nanovdb_sphere_accessor_cuda
|
||||
│ │ ├── read_nanovdb_sphere_accessor_cuda.cu
|
||||
│ │ └── read_nanovdb_sphere_accessor_cuda_kernel.cu
|
||||
│ ├── ex_util
|
||||
│ │ └── ComputePrimitives.h
|
||||
│ ├── ex_voxels_to_grid_cuda
|
||||
│ │ └── ex_voxels_to_grid_cuda.cu
|
||||
│ ├── ex_vox_to_nanovdb
|
||||
│ │ ├── vox_to_nanovdb.cc
|
||||
│ │ └── 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
|
||||
│ ├── TestNanoVDB.cc
|
||||
│ ├── TestNanoVDB.cu
|
||||
│ └── TestOpenVDB.cc
|
||||
└── util
|
||||
├── CpuTimer.h
|
||||
├── CreateNanoGrid.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
|
||||
├── DitherLUT.h
|
||||
├── ForEach.h
|
||||
├── GridBuilder.h
|
||||
├── GridChecksum.h
|
||||
├── GridStats.h
|
||||
├── GridValidator.h
|
||||
├── HDDA.h
|
||||
├── HostBuffer.h
|
||||
├── Invoke.h
|
||||
├── IO.h
|
||||
├── NanoToOpenVDB.h
|
||||
├── NodeManager.h
|
||||
├── OpenToNanoVDB.h
|
||||
├── PrefixSum.h
|
||||
├── Primitives.h
|
||||
├── Range.h
|
||||
├── Ray.h
|
||||
├── Reduce.h
|
||||
├── SampleFromVoxels.h
|
||||
├── Stencils.h
|
||||
├── Timer.h
|
||||
└── Util.h
|
||||
├── nanovdb
|
||||
│ ├── CNanoVDB.h
|
||||
│ ├── NanoVDB.h
|
||||
│ ├── PNanoVDB.h
|
||||
│ └── util
|
||||
│ ├── CSampleFromVoxels.h
|
||||
│ ├── CudaDeviceBuffer.h
|
||||
| ├── DitherLUT.h
|
||||
│ ├── ForEach.h
|
||||
│ ├── GridBuilder.h
|
||||
│ ├── GridChecksum.h
|
||||
│ ├── GridHandle.h
|
||||
│ ├── GridStats.h
|
||||
│ ├── GridValidator.h
|
||||
│ ├── HDDA.h
|
||||
│ ├── HostBuffer.h
|
||||
│ ├── Invoke.h
|
||||
│ ├── IO.h
|
||||
│ ├── NanoToOpenVDB.h
|
||||
│ ├── OpenToNanoVDB.h
|
||||
| ├── Primitives.h
|
||||
│ ├── Range.h
|
||||
│ ├── Ray.h
|
||||
| ├── Reduce.h
|
||||
| ├── SampleFromVoxels.h
|
||||
| └── Stencils.h
|
||||
```
|
||||
|
||||
@@ -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>.
|
||||
@@ -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.
|
||||
@@ -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])
|
||||
@@ -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
@@ -1,3 +0,0 @@
|
||||
# Transient harness outputs
|
||||
gen/
|
||||
build/
|
||||
@@ -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()
|
||||
@@ -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
|
||||
@@ -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;
|
||||
@@ -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
|
||||
@@ -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
-8
@@ -2,11 +2,7 @@
|
||||
|
||||
Welcome to the NanoVDB documentation page.
|
||||
|
||||
* @subpage NanoVDB_HowToBuild
|
||||
* @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.
|
||||
* @ref NanoVDB_HowToBuild
|
||||
* @ref NanoVDB_FAQ
|
||||
* @ref NanoVDB_SourceTree
|
||||
* @ref NanoVDB_HelloWorld
|
||||
@@ -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();
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user