Compare commits
30
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5a6714b67c | ||
|
|
c9293ed87c | ||
|
|
778e1efcb1 | ||
|
|
37c0c47bc4 | ||
|
|
2433964511 | ||
|
|
b8dd348aa5 | ||
|
|
6da1f9530a | ||
|
|
7c03e1f084 | ||
|
|
e9a1f1a3d2 | ||
|
|
f5a735a2af | ||
|
|
10da55d5c1 | ||
|
|
2901256875 | ||
|
|
a0df7e82fe | ||
|
|
c8ad233db1 | ||
|
|
687e6c405e | ||
|
|
7ba5bb1889 | ||
|
|
db301eb962 | ||
|
|
10aae7e90b | ||
|
|
5462395ae8 | ||
|
|
3fe53838b4 | ||
|
|
cd524c73ca | ||
|
|
ec28bf7d86 | ||
|
|
b8b2d78ba3 | ||
|
|
8884fd3e97 | ||
|
|
2892db60f8 | ||
|
|
ce6d2b5675 | ||
|
|
dfe40d98e8 | ||
|
|
763c09c57e | ||
|
|
154828954f | ||
|
|
3269bf764c |
@@ -110,7 +110,7 @@ jobs:
|
||||
\"
|
||||
- name: test
|
||||
# Skip Debug on commits as they take a while.
|
||||
if: github.event_name == 'schedule'|| matrix.config.build == 'Release'
|
||||
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || matrix.config.build == 'Release'
|
||||
run: |
|
||||
cd build && ctest -V
|
||||
cd - && ./ci/test_install.sh
|
||||
@@ -142,6 +142,9 @@ jobs:
|
||||
- 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
|
||||
|
||||
@@ -42,7 +42,7 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: install_doxygen
|
||||
run: ./ci/install_doxygen.sh 1_8_11
|
||||
run: ./ci/install_doxygen.sh 1_14_0
|
||||
- name: nanobind
|
||||
run: ./ci/install_nanobind.sh 2.5.0
|
||||
- name: install_latex
|
||||
|
||||
@@ -163,7 +163,7 @@ jobs:
|
||||
run: |
|
||||
./ci/build.sh -v \
|
||||
--build-type=Release \
|
||||
--components="core,hou,bin,view,render,python,test,axcore,axbin" \
|
||||
--components="core,hou,bin,view,render,test,axcore,axbin" \
|
||||
--cargs=\" \
|
||||
-DHOUDINI_ROOT=$HOME/houdini_install/hou \
|
||||
-DOPENVDB_BUILD_HOUDINI_ABITESTS=OFF \
|
||||
|
||||
@@ -256,6 +256,10 @@ jobs:
|
||||
- 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
|
||||
@@ -495,7 +499,7 @@ jobs:
|
||||
\'
|
||||
- name: test
|
||||
shell: bash
|
||||
run: cd build && ctest -V -E ".*cuda.*"
|
||||
run: cd build && ctest -V -E ".*cuda.*|.*mgpu.*"
|
||||
|
||||
#############################################################################
|
||||
################################## Blosc ####################################
|
||||
|
||||
@@ -4,10 +4,12 @@ name: Whitespace
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- 'ext/**'
|
||||
- 'pendingchanges/**'
|
||||
- 'tsc/meetings/**'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- 'ext/**'
|
||||
- 'pendingchanges/**'
|
||||
- 'tsc/meetings/**'
|
||||
|
||||
@@ -25,7 +27,7 @@ jobs:
|
||||
- name: test
|
||||
run: |
|
||||
set +e
|
||||
git grep -n -I -E '^.+[ ]+$' -- ':!tsc/meetings/*' ':!pendingchanges/*' ':!*.wlt'
|
||||
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
|
||||
@@ -36,5 +38,5 @@ jobs:
|
||||
- name: test
|
||||
run: |
|
||||
set +e
|
||||
git grep -n " " -- ':!*/whitespace.yml' ':!tsc/meetings/*' ':!*.svg' ':!*.cmd' ':!*.png' ':!pendingchanges/*' ':!*.wlt' ':!*.jpg' ':!*.gif' ':!*.mp4' ':!*.pt' ':!*.pth' ':!*.nvdb' ':!*.npz'
|
||||
git grep -n " " -- ':!*/whitespace.yml' ':!tsc/meetings/*' ':!*.svg' ':!*.cmd' ':!*.png' ':!pendingchanges/*' ':!ext/*' ':!*.wlt' ':!*.jpg' ':!*.gif' ':!*.mp4' ':!*.pt' ':!*.pth' ':!*.nvdb' ':!*.npz'
|
||||
test $? -eq 1
|
||||
|
||||
@@ -1,7 +1,150 @@
|
||||
OpenVDB Version History
|
||||
=======================
|
||||
|
||||
Version 12.1.2 - In development
|
||||
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
|
||||
|
||||
+3
-3
@@ -52,9 +52,9 @@ endif()
|
||||
|
||||
###### Version
|
||||
|
||||
set(OpenVDB_MAJOR_VERSION 12)
|
||||
set(OpenVDB_MINOR_VERSION 1)
|
||||
set(OpenVDB_PATCH_VERSION 2)
|
||||
set(OpenVDB_MAJOR_VERSION 13)
|
||||
set(OpenVDB_MINOR_VERSION 0)
|
||||
set(OpenVDB_PATCH_VERSION 1)
|
||||
set(OpenVDB_VERSION "${OpenVDB_MAJOR_VERSION}.${OpenVDB_MINOR_VERSION}.${OpenVDB_PATCH_VERSION}")
|
||||
|
||||
project(OpenVDB LANGUAGES CXX VERSION ${OpenVDB_VERSION})
|
||||
|
||||
@@ -95,8 +95,6 @@ vcpkg install zlib:x64-windows
|
||||
vcpkg install blosc:x64-windows
|
||||
vcpkg install tbb:x64-windows
|
||||
vcpkg install boost-iostreams:x64-windows
|
||||
vcpkg install boost-any:x64-windows
|
||||
vcpkg install boost-algorithm:x64-windows
|
||||
vcpkg install boost-interprocess:x64-windows
|
||||
```
|
||||
|
||||
|
||||
+1
-1
@@ -196,8 +196,8 @@ set -x
|
||||
# - always enabled the python tests with OPENVDB_BUILD_PYTHON_UNITTESTS if the python module is in use,
|
||||
# regardless of the 'test' component being enabled or not (see the OPENVDB_BUILD_PYTHON_UNITTESTS option).
|
||||
cmake \
|
||||
-DOPENVDB_USE_DEPRECATED_ABI_10=ON \
|
||||
-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 \
|
||||
|
||||
@@ -37,8 +37,4 @@ try {
|
||||
vcpkg install $vcpkgPackages
|
||||
}
|
||||
|
||||
# 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 "vcpkg install completed successfully"
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
# 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"
|
||||
+51
-19
@@ -26,7 +26,7 @@ option(OPENVDB_DOXYGEN_INTERNAL [=[
|
||||
Enable documentation of methods and classes which have been explicitly marked as internal
|
||||
]=] OFF)
|
||||
|
||||
find_package(Doxygen REQUIRED doxygen)
|
||||
find_package(Doxygen 1.0...<1.15.0 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 "
|
||||
@@ -41,12 +41,11 @@ set(DOXY_FILES
|
||||
openvdb/openvdb/io
|
||||
openvdb/openvdb/math
|
||||
openvdb/openvdb/points
|
||||
openvdb/openvdb/points/impl
|
||||
openvdb/openvdb/python/pyopenvdb.h
|
||||
openvdb/openvdb/thread
|
||||
openvdb/openvdb/tools
|
||||
openvdb/openvdb/tools/impl
|
||||
openvdb/openvdb/tree
|
||||
openvdb/openvdb/util
|
||||
ext/imath/openvdb/math
|
||||
doc/build.txt
|
||||
doc/changes.txt
|
||||
doc/codingstyle.txt
|
||||
@@ -58,28 +57,62 @@ 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)
|
||||
set(DOXYGEN_EXCLUDE_SYMBOLS
|
||||
"*internal*"
|
||||
"*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 "doc/img")
|
||||
set(DOXYGEN_IMAGE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/img")
|
||||
set(DOXYGEN_RECURSIVE NO)
|
||||
set(DOXYGEN_QUIET YES)
|
||||
set(DOXYGEN_NUM_PROC_THREADS 0) # detects from system
|
||||
|
||||
set(DOXYGEN_GENERATE_HTML YES)
|
||||
set(DOXYGEN_GENERATE_MAN NO)
|
||||
set(DOXYGEN_GENERATE_LATEX NO)
|
||||
set(DOXYGEN_GENERATE_TODOLIST NO)
|
||||
|
||||
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
|
||||
@@ -110,12 +143,13 @@ 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"]]
|
||||
@@ -148,7 +182,8 @@ set(DOXYGEN_PREDEFINED
|
||||
# even if it was not properly tagged
|
||||
[["OPENVDB_DEPRECATED=/** \deprecated */"]]
|
||||
[["OPENVDB_DEPRECATED_MESSAGE(x)=/** \deprecated x */"]]
|
||||
"OPENVDB_USE_LOG4CPLUS=")
|
||||
"OPENVDB_USE_LOG4CPLUS="
|
||||
"OPENVDB_UBSAN_SUPPRESS=")
|
||||
|
||||
set(DOXYGEN_ENABLED_SECTIONS "")
|
||||
|
||||
@@ -190,9 +225,9 @@ if(OPENVDB_DOXYGEN_HOUDINI)
|
||||
list(APPEND DOXY_FILES
|
||||
doc/houdini.txt
|
||||
openvdb_houdini/openvdb_houdini/AttributeTransferUtil.h
|
||||
openvdb_houdini/openvdb_houdini/GEO_PrimVDB.h
|
||||
openvdb_houdini/openvdb_houdini/reference/GEO_PrimVDB.h
|
||||
openvdb_houdini/openvdb_houdini/reference/GU_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
|
||||
@@ -221,8 +256,7 @@ if(OPENVDB_DOXYGEN_AX)
|
||||
openvdb_ax/openvdb_ax/compiler
|
||||
openvdb_ax/openvdb_ax/grammar
|
||||
openvdb_ax/openvdb_ax/grammar/generated
|
||||
openvdb_ax/openvdb_ax/math
|
||||
openvdb_ax/openvdb_ax/test)
|
||||
openvdb_ax/openvdb_ax/math)
|
||||
endif()
|
||||
|
||||
if(OPENVDB_DOXYGEN_NANOVDB)
|
||||
@@ -236,7 +270,6 @@ if(OPENVDB_DOXYGEN_NANOVDB)
|
||||
doc/nanovdb/HelloWorld.md
|
||||
nanovdb/nanovdb
|
||||
nanovdb/nanovdb/util
|
||||
nanovdb/nanovdb/examples/benchmark
|
||||
nanovdb/nanovdb/examples/ex_bump_pool_buffer
|
||||
nanovdb/nanovdb/examples/ex_collide_level_set
|
||||
nanovdb/nanovdb/examples/ex_make_custom_nanovdb
|
||||
@@ -255,8 +288,7 @@ 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/unittest)
|
||||
nanovdb/nanovdb/examples/ex_write_nanovdb_grids)
|
||||
endif()
|
||||
|
||||
set(DOXYGEN_VERBATIM_VARS DOXYGEN_ALIASES DOXYGEN_PREDEFINED)
|
||||
|
||||
+225
-287
@@ -1,14 +1,13 @@
|
||||
/**
|
||||
<div style="width:800px;text-align:justify;">
|
||||
|
||||
@page ax AX
|
||||
@page ax AX Language Documentation
|
||||
|
||||
@section axlanguage AX Language Documentation
|
||||
@section axlanguage Intro
|
||||
@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 @subpage axcplusplus documentation for the C++ developer
|
||||
control flow. See the @ref axcplusplus documentation for the C++ developer
|
||||
documentation.
|
||||
@note
|
||||
Some sections of this document are still to be completed. Please get in touch
|
||||
@@ -108,8 +107,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 @subpage axcplusplus
|
||||
developer documentation. Note that custom geometry support requires C++ extension.
|
||||
For details of extending AX for custom geometry, see the @ref axcplusplus
|
||||
developer documentation. Note that custom geometry support requires `C++` extension.
|
||||
|
||||
|
||||
@subsection axprogramexample A Program Example
|
||||
@@ -133,20 +132,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 @b `myattribute` and the type @b `float`. The first statement:
|
||||
accessed has the name `myattribute` and the type `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 @b `temp` to be used in
|
||||
value from the geometry and storing it in the variable `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 @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`.
|
||||
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`.
|
||||
@par
|
||||
For OpenVDB Points, this kernel is run over every point in an OpenVDB Points
|
||||
Grid. In simple pseudo code:
|
||||
@@ -155,7 +154,7 @@ foreach(point in pointgrid)
|
||||
run_ax_kernel(point)
|
||||
done()
|
||||
@endcode
|
||||
Where @b `pointgrid` is a single Point Data Grid. For OpenVDB volumes the kernel
|
||||
Where `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)
|
||||
@@ -165,8 +164,8 @@ foreach(grid in grids)
|
||||
done()
|
||||
@endcode
|
||||
@par
|
||||
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
|
||||
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
|
||||
voxel in this grid will have it's value compared in the same way as the points
|
||||
example given above.
|
||||
|
||||
@@ -282,9 +281,9 @@ missing types from OpenVDB.
|
||||
|
||||
@subsection axscalars Scalars
|
||||
@par
|
||||
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
|
||||
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
|
||||
values respectively. All scalars, excluding bools, are signed; there are no
|
||||
other unsigned scalar types in AX.
|
||||
@par Integer Overflow and Floating Point Truncation
|
||||
@@ -309,10 +308,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; @b `inf` and @b `nan`.
|
||||
Floating point values have two additional intrinsic states; `inf` and `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 @b `inf`
|
||||
and @b `nan` values are division by zero expressions:
|
||||
checks on arithmetic to catch these values. A typical example of both `inf`
|
||||
and `nan` values are division by zero expressions:
|
||||
@code
|
||||
float a = 1.0f/0.0f;
|
||||
print(a); // prints "inf"
|
||||
@@ -337,16 +336,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
|
||||
@b `bool`, @b `int16` or @b `int64` elements, so these are not supported.
|
||||
`bool`, `int16` or `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
|
||||
@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
|
||||
`float` and `double` precision elements with dimensions either `3x3` or
|
||||
`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 @b `mat3d` therefor corresponds to a @b `3x3` matrix
|
||||
(9 elements) with @b `double` precision elements.
|
||||
dimension. A matrix of type `mat3d` therefor corresponds to a `3x3` matrix
|
||||
(9 elements) with `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
|
||||
@@ -370,10 +369,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
|
||||
@b `char` type) have no frontend type, so a @b `string` type must be used for
|
||||
`char` type) have no frontend type, so a `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 <b>\" \"</b>.
|
||||
by quotes `" "`.
|
||||
|
||||
@subsection axtypeprecedence Implicit conversion / type precedence
|
||||
@par
|
||||
@@ -441,9 +440,9 @@ depending on the operand types.
|
||||
<th colspan="9"> Operators
|
||||
</th></tr>
|
||||
<tr style="text-align:center">
|
||||
<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>
|
||||
<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>
|
||||
<tr style="text-align:center">
|
||||
<td> @ref axopassignment </td>
|
||||
<td> @ref axopbinarithmetic </td>
|
||||
@@ -456,50 +455,33 @@ depending on the operand types.
|
||||
<td> @ref axopother </td></tr>
|
||||
<tr style="text-align:center">
|
||||
<td><p> <!-- *********************** COLUMN ASSIGNMENT *********************** -->
|
||||
<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>
|
||||
`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`
|
||||
</p></td>
|
||||
<td><p> <!-- *********************** COLUMN ARITH *********************** -->
|
||||
<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>
|
||||
`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>
|
||||
<td><p> <!-- *********************** COLUMN COMP *********************** -->
|
||||
<code>
|
||||
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`
|
||||
</p></td>
|
||||
<td style="border-right-width: thick"><p> <!-- *********************** COLUMN LOGICAL *********************** -->
|
||||
<code>
|
||||
a && b<br/>a || b
|
||||
</code>
|
||||
`a && b`<br/>`a || b`
|
||||
</p></td>
|
||||
<td><p> <!-- *********************** COLUMN ARITH *********************** -->
|
||||
<code>
|
||||
+a<br/>-a<br/>~a
|
||||
</code>
|
||||
`+a`<br/>`-a`<br/>`~a`
|
||||
</p></td>
|
||||
<td><p> <!-- *********************** COLUMN LOGICAL *********************** -->
|
||||
<code>
|
||||
!a
|
||||
</code>
|
||||
`!a`
|
||||
</p></td>
|
||||
<td style="border-right-width: thick"><p> <!-- *********************** COLUMN INC/DEC *********************** -->
|
||||
<code>
|
||||
++a<br/>\-\-a<br/>a++<br/>a\-\-
|
||||
</code>
|
||||
`++a`<br/>`--a`<br/>`a++`<br/>`a--`
|
||||
</p></td>
|
||||
<td><p> <!-- *********************** COLUMN OTHER *********************** -->
|
||||
<code>
|
||||
a[]<br/>a[,]<br/>a.b
|
||||
</code>
|
||||
`a[]`<br/>`a[,]`<br/>`a.b`
|
||||
</p></td>
|
||||
<td><p> <!-- *********************** COLUMN OTHER *********************** -->
|
||||
<code>
|
||||
a(...)<br/>a, b<br/>a ? b : c<br/>{ a,b ... }
|
||||
</code>
|
||||
`a(...)`<br/>`a, b`<br/>`a ? b : c`<br/>`a ?: c`<br/>`{ a,b ... }`
|
||||
</p></td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -522,34 +504,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 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>
|
||||
<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>
|
||||
</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 @b `lhs` with a copy of the @b
|
||||
`rhs`:
|
||||
Direct assignments replace the contents of the `lhs` with a copy of the `rhs`:
|
||||
@par
|
||||
<table><tr>
|
||||
<td bgcolor="#ffc4c4"> @a `lhs` <b>= </b> @a `rhs` </td>
|
||||
<td> @a lhs <b>=</b> @a rhs </td>
|
||||
</tr></table>
|
||||
@par
|
||||
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
|
||||
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
|
||||
supported for direct assignment (if an operation is not listed, it is not
|
||||
supported):
|
||||
@par
|
||||
@@ -569,15 +551,14 @@ 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.
|
||||
<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>
|
||||
`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>
|
||||
</tr>
|
||||
<tr style="text-align:center"><td>@ref axvecmats "vector"</td>
|
||||
<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.
|
||||
<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.
|
||||
<!-- A -->@code{.c}
|
||||
vec3f a = 0, b = 1;
|
||||
a = b;
|
||||
@@ -612,7 +593,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;
|
||||
@@ -645,25 +626,27 @@ 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 @b `lhs` with the result of
|
||||
a @ref axopbinarithmetic "binary arithmetic" operation of the @b `lhs` with the
|
||||
@b `rhs`:
|
||||
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`:
|
||||
@par
|
||||
<table>
|
||||
<tr><td bgcolor="#ffc4c4"> @a `lhs` @b op @a `rhs` </td></tr>
|
||||
<tr><td> @a lhs @b op @a rhs </td></tr>
|
||||
</table>
|
||||
Where @b op is one of :
|
||||
|
||||
Where @b op is one of:
|
||||
|
||||
<table><tr>
|
||||
<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>
|
||||
<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>
|
||||
</tr></table>
|
||||
@par
|
||||
The behaviour of a given compound assignment (for example `a += b`) is similar
|
||||
@@ -680,8 +663,8 @@ int a = 1;
|
||||
++a += 1; // equal to a = ++a + 1 which is equal to 3
|
||||
@endcode
|
||||
@par
|
||||
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
|
||||
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
|
||||
`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
|
||||
@@ -720,7 +703,7 @@ b = c; // b becomes 4
|
||||
a = b; // a becomes float(4)
|
||||
@endcode
|
||||
@par
|
||||
Importantly, @b `a` receives the result of any previous implicit casts to the
|
||||
Importantly, `a` receives the result of any previous implicit casts to the
|
||||
right hand side of its binary assignment.
|
||||
|
||||
|
||||
@@ -737,20 +720,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 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>
|
||||
<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>
|
||||
<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 bgcolor="#ffc4c4"> @a `lhs` <b>`|`</b> @a `rhs` </td>
|
||||
<tr><td>Bitwise OR</td><td> @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 bgcolor="#ffc4c4"> @a `lhs` <b>`^`</b> @a `rhs` </td>
|
||||
<tr><td>Bitwise XOR</td><td> @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 bgcolor="#ffc4c4"> @a `lhs` <b>`<<`</b> @a `rhs` </td>
|
||||
<tr><td>Bitwise shift left</td><td> @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 bgcolor="#ffc4c4"> @a `lhs` <b>`>>`</b> @a `rhs` </td>
|
||||
<tr><td>Bitwise shift right</td><td> @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
|
||||
@@ -759,13 +742,13 @@ Binary additive operations perform summations on the input arguments. They have
|
||||
the following forms:
|
||||
@par
|
||||
<table>
|
||||
<tr><td bgcolor="#ffc4c4"> @a `lhs` @b `+` @a `rhs` </td></tr>
|
||||
<tr><td bgcolor="#ffc4c4"> @a `lhs` @b `-` @a `rhs` </td></tr>
|
||||
<tr><td> @a lhs @b + @a rhs </td></tr>
|
||||
<tr><td> @a lhs @b - @a rhs </td></tr>
|
||||
</table>
|
||||
@par
|
||||
After @ref axtypeprecedence "implicit conversion", the result of the binary
|
||||
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 `-`
|
||||
operation with the arithmetic `+` (@ref axtokens "plus token") is the sum of
|
||||
the operands, and the result of the binary operation with the arithmetic `-`
|
||||
(@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):
|
||||
@@ -870,19 +853,19 @@ c - b; // valid vec - scalar
|
||||
The binary multiplicative operands have the following forms:
|
||||
@par
|
||||
<table>
|
||||
<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>
|
||||
<tr><td> @a lhs `*` @a rhs </td></tr>
|
||||
<tr><td> @a lhs `/` @a rhs </td></tr>
|
||||
<tr><td> @a lhs `%` @a rhs </td></tr>
|
||||
</table>
|
||||
@par
|
||||
After @ref axtypeprecedence "implicit conversion", the result of the binary
|
||||
operation:
|
||||
- with the arithmetic @b `*` (@ref axtokens "asterisk token") is:
|
||||
- with the arithmetic `*` (@ref axtokens "asterisk token") is:
|
||||
- the product of the operands
|
||||
- @b OR performs matrix multiplication for vector and matrix types.
|
||||
- with the arithmetic @b `/` (@ref axtokens "forward slash token") is the first
|
||||
- with the arithmetic `/` (@ref axtokens "forward slash token") is the first
|
||||
operand divided by the second operand.
|
||||
- with the arithmetic @b `%` (@ref axtokens "percentage token") is the
|
||||
- with the arithmetic `%` (@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.
|
||||
@@ -894,7 +877,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 @b `*` has important behaviour for vectors and
|
||||
The multiplicative operation `*` has important behaviour for vectors and
|
||||
matrix types.
|
||||
@par
|
||||
The following combination of AX type categories are supported for multiplicative
|
||||
@@ -907,7 +890,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></td>
|
||||
<tr style="text-align:center"><td>@ref axvecmats "vector"</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
|
||||
@@ -1096,27 +1079,27 @@ Floating point multiplication is communicative (`a * b = b * a`) but is not
|
||||
Binary bitwise operations have the following forms:
|
||||
@par
|
||||
<table>
|
||||
<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>
|
||||
<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>
|
||||
</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>
|
||||
@@ -1144,17 +1127,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 bgcolor="#ffc4c4"> @a `lhs` <b>`==`</b> @a `rhs` </td>
|
||||
<tr><td>Equal to</td><td> @a lhs <b>`==`</b> @a rhs </td>
|
||||
<td>Returns `true` if both operands are equal</td></tr>
|
||||
<tr><td>Not equal to</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`!=`</b> @a `rhs` </td>
|
||||
<tr><td>Not equal to</td><td> @a lhs <b>`!=`</b> @a rhs </td>
|
||||
<td>Returns `true` if operands are not equal</td></tr>
|
||||
<tr><td>Less than</td><td bgcolor="#ffc4c4"> @a `lhs` <b>`<`</b> @a `rhs` </td>
|
||||
<tr><td>Less than</td><td> @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 bgcolor="#ffc4c4"> @a `lhs` <b>`>`</b> @a `rhs` </td>
|
||||
<tr><td>Greater than</td><td> @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 bgcolor="#ffc4c4"> @a `lhs` <b>`<=`</b> @a `rhs` </td>
|
||||
<tr><td>Less than or equal to</td><td> @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 bgcolor="#ffc4c4"> @a `lhs` <b>`>=`</b> @a `rhs` </td>
|
||||
<tr><td>Greater than or equal to</td><td> @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
|
||||
@@ -1264,10 +1247,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 bgcolor="#ffc4c4"> @a `lhs` <b>`&&`</b> @a `rhs` </td>
|
||||
<tr><td>AND</td><td> @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 bgcolor="#ffc4c4"> @a `lhs` <b>`||`</b> @a `rhs` </td>
|
||||
<tr><td>Inclusive OR</td><td> @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>
|
||||
@@ -1300,14 +1283,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 bgcolor="#ffc4c4"> <b>`+`</b>@a `a` </td>
|
||||
<td>Returns the value of its operand, @b `a`</td>
|
||||
<tr><td>Unary plus</td><td> `+a` </td>
|
||||
<td>Returns the value of its operand, `a`</td>
|
||||
</tr>
|
||||
<tr><td>Unary minus</td><td bgcolor="#ffc4c4"> <b>`-`</b>@a `a` </td>
|
||||
<td>Returns the negative representation of @b `a`</td>
|
||||
<tr><td>Unary minus</td><td> `-a` </td>
|
||||
<td>Returns the negative representation of `a`</td>
|
||||
</tr>
|
||||
<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
|
||||
<tr><td>Bitwise NOT</td><td> `~a` </td>
|
||||
<td>Returns the bitwise NOT (one's complement) value of `a`. This operator
|
||||
is only valid on integral element types.</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -1365,7 +1348,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 bgcolor="#ffc4c4"> <b>`!`</b>@a `a` </td>
|
||||
<tr><td>Logical NOT</td><td> `!a` </td>
|
||||
<td>Returns true if the operand is false. Otherwise, returns false.</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -1409,10 +1392,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 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><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>
|
||||
</table>
|
||||
@par
|
||||
@@ -1444,20 +1427,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 bgcolor="#ffc4c4"> <em>`vector`</em> <b>.</b> @a `component` </td>
|
||||
<td>Reference to component @a `component` of @a `vector`</td>
|
||||
<td> <em>`vector`</em> <b>.</b> `component` </td>
|
||||
<td>Reference to component `component` of `vector`</td>
|
||||
</tr>
|
||||
<tr style="text-align:left">
|
||||
<td>Container Component Access</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>
|
||||
<td> <em>`container`</em> <b>[</b> `exp` <b>]</b> </td>
|
||||
<td>Reference to component at index `exp` of `container`</td>
|
||||
</tr>
|
||||
<tr style="text-align:left">
|
||||
<td>Matrix Component Access</td>
|
||||
<td bgcolor="#ffc4c4"> <em>`matrix`</em> <b>[</b> @a `exp1`, <em>`exp2`</em> <b>]</b> </td>
|
||||
<td> <em>`matrix`</em> <b>[</b> `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 @a `matrix` where @a `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 `matrix` where `dimension` is the the size of the matrix</td>
|
||||
</tr>
|
||||
</table>
|
||||
@par
|
||||
@@ -1471,11 +1454,11 @@ container.
|
||||
The dot operator <b>.</b> is only valid for vector types. It has the form:
|
||||
@par
|
||||
<table><tr>
|
||||
<td bgcolor="#ffc4c4"> @a `vector` <b>.</b> @a `component` </td>
|
||||
<td> `vector` <b>.</b> `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 @b `vec2` types, only the
|
||||
access for the first three elements of any vector (for `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.
|
||||
@@ -1492,12 +1475,12 @@ a_{0}\quad a_{1}\quad a_{2}
|
||||
@f]
|
||||
| Component | Access Index | Result |
|
||||
|:-----------:|:--------------:|:-------------:|
|
||||
| @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$ |
|
||||
| `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$ |
|
||||
</center>
|
||||
@par
|
||||
This operator can provide more immediately readability when working with
|
||||
@@ -1507,12 +1490,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 bgcolor="#ffc4c4"> @a `container` <b>[</b><em>`exp`</em><b>]</b> </td>
|
||||
<td> `container` <b>[</b><em>`exp`</em><b>]</b> </td>
|
||||
</tr></table>
|
||||
@par
|
||||
@a `exp` is expected to evaluate to a value which is castable to an integer
|
||||
`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 @a `container`. <b>No bounds checking is performed</b>.
|
||||
the valid size of the `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
|
||||
@@ -1533,16 +1516,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 bgcolor="#ffc4c4"> @a `matrix` <b>[</b><em>`exp1`</em>, <em>`exp2`</em><b>]</b> </td>
|
||||
<td> `matrix` <b>[</b><em>`exp1`</em>, <em>`exp2`</em><b>]</b> </td>
|
||||
</tr></table>
|
||||
@par
|
||||
@a `exp1` and @a `exp2` are expected to evaluate to a value which is castable to
|
||||
`exp1` and `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 @a `matrix` dimensions. <b>No bounds checking
|
||||
falls within the valid size of the `matrix` dimensions. <b>No bounds checking
|
||||
is performed</b>. In general it is more readable to use this operator when
|
||||
accessing specific elements, where @b `exp1` is the row index and @b `exp2` is
|
||||
accessing specific elements, where `exp1` is the row index and `exp2` is
|
||||
the column index. The tables below show the different access patterns for
|
||||
@b `3x3` and @b `4x4` matrices.
|
||||
`3x3` and `4x4` matrices.
|
||||
@par
|
||||
<!-- A -->@code{.c}
|
||||
mat3f a;
|
||||
@@ -1555,22 +1538,26 @@ 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>
|
||||
@@ -1584,112 +1571,62 @@ a_{30}\quad a_{31}\quad a_{32}\quad a_{33}\\
|
||||
<th>Result</th>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<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>
|
||||
<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>
|
||||
</tr> <!-- ******************** MAT4 DATA ONLY ******************** -->
|
||||
<tr style="text-align:center">
|
||||
<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>
|
||||
<td style="border:right;" colspan="4" rowspan="7"></td>
|
||||
<td>`A[9]`</td><td>`A[2,1]`</td><td>@f$ a_{21} @f$</td>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<td><code>A[10]</code></td>
|
||||
<td><code>A[2,2]</code></td>
|
||||
<td>@f$ a_{22} @f$</td>
|
||||
<td>`A[10]`</td><td>`A[2,2]`</td><td>@f$ a_{22} @f$</td>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<td><code>A[11]</code></td>
|
||||
<td><code>A[2,3]</code></td>
|
||||
<td>@f$ a_{23} @f$</td>
|
||||
<td>`A[11]`</td><td>`A[2,3]`</td><td>@f$ a_{23} @f$</td>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<td><code>A[12]</code></td>
|
||||
<td><code>A[3,0]</code></td>
|
||||
<td>@f$ a_{30} @f$</td>
|
||||
<td>`A[12]`</td><td>`A[3,0]`</td><td>@f$ a_{30} @f$</td>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<td><code>A[13]</code></td>
|
||||
<td><code>A[3,1]</code></td>
|
||||
<td>@f$ a_{31} @f$</td>
|
||||
<td>`A[13]`</td><td>`A[3,1]`</td><td>@f$ a_{31} @f$</td>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<td><code>A[14]</code></td>
|
||||
<td><code>A[3,2]</code></td>
|
||||
<td>@f$ a_{32} @f$</td>
|
||||
<td>`A[14]`</td><td>`A[3,2]`</td><td>@f$ a_{32} @f$</td>
|
||||
</tr>
|
||||
<tr style="text-align:center">
|
||||
<td><code>A[15]</code></td>
|
||||
<td><code>A[3,3]</code></td>
|
||||
<td>@f$ a_{33} @f$</td>
|
||||
<td>`A[15]`</td><td>`A[3,3]`</td><td>@f$ a_{33} @f$</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -1703,22 +1640,27 @@ 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 bgcolor="#ffc4c4"> <em>`a`</em><b>`(...)`</b></td>
|
||||
<td> `a(...)` </td>
|
||||
<td>Returns the result of a function call or inbuilt explicit cast</td>
|
||||
</tr>
|
||||
<tr style="text-align:left">
|
||||
<td>Comma</td>
|
||||
<td bgcolor="#ffc4c4"> <em>`a`</em><b>,</b> <em>`b`</em></td>
|
||||
<td>Returns the value of @b `b` after chained evaluation</td>
|
||||
<td> `a, b, ...` </td>
|
||||
<td>Returns the value of the last expression after chained evaluation</td>
|
||||
</tr>
|
||||
<tr style="text-align:left">
|
||||
<td>Ternary Conditional</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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Vector/Matrix Initializer</td>
|
||||
<td bgcolor="#ffc4c4"> <b>`{`</b> <em> `a, `</em> `b `<b>`... }`</b> </td>
|
||||
<td>`{ a, b, ... }`</td>
|
||||
<td>Returns a temporary vector or matrix</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -1728,10 +1670,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 bgcolor="#ffc4c4"> <em> `func(a, b, c, ...)` </em></td>
|
||||
<td> `func(a, b, c, ...)` </td>
|
||||
</tr></table>
|
||||
@par
|
||||
Where @b `func` is a function name @b or a valid explicit cast typename. Explicit
|
||||
Where `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);
|
||||
@@ -1740,7 +1682,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. Whe multiple arguments are
|
||||
multiple or empty arguments for function calls. When 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
|
||||
@@ -1753,10 +1695,10 @@ functions.
|
||||
The Comma operator has the form:
|
||||
@par
|
||||
<table><tr>
|
||||
<td bgcolor="#ffc4c4"><em>`a`</em><b>`,` </b><em>`b`</em></td>
|
||||
<td>`a, b, ...`</td>
|
||||
</tr></table>
|
||||
@par
|
||||
Where @b `a` and @b `b` are expressions. Chained expressions evaluate each
|
||||
Where `a` and `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
|
||||
@@ -1780,32 +1722,33 @@ 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 bgcolor="#ffc4c4"><em>`a`</em> <b>`?`</b> <em>`b`</em> <b>`:`</b><em>`c`</em></td>
|
||||
<td>`a ? b : c`</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
|
||||
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
|
||||
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
|
||||
`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.
|
||||
@b `vec3f`), external attributes or parameters (e.g. @b `vec3f\@attrib`) or as
|
||||
`vec3f`), external attributes or parameters (e.g. `vec3f@attrib`) or as
|
||||
temporary values using the vector/matrix initializer syntax. This operator has
|
||||
the form:
|
||||
@par
|
||||
<table><tr>
|
||||
<td bgcolor="#ffc4c4"> <b>`{`</b> <em>`a, b `</em><b>`... }`</b> </td>
|
||||
<td> `{ a, b, ... }`</td>
|
||||
</tr></table>
|
||||
@par
|
||||
Where @b `a` and @b `b` are expressions returning a scalar value. When this
|
||||
Where `a` and `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
|
||||
@@ -1833,7 +1776,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
|
||||
@b `mat3d`, before being implicitly cast to a @b `mat3f` due to the assignment.
|
||||
`mat3d`, before being implicitly cast to a `mat3f` due to the assignment.
|
||||
|
||||
|
||||
@subsection axopprecedence Operator Precedence
|
||||
@@ -2004,10 +1947,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 @b `true` and @b `false`</td></tr>
|
||||
<tr><td>`bool`</td><td>Tokens `true` and `false`</td></tr>
|
||||
<tr><td>`int32`</td><td>No suffix, automatically infered from integral literals</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>`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>`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>
|
||||
@@ -2025,7 +1968,6 @@ 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.
|
||||
@@ -2064,8 +2006,6 @@ foreach(ActiveVoxel in surface)
|
||||
DensityIndexSpaceCoord = density.transformToIndex(SurfaceWorldSpaceCoord);
|
||||
ActiveVoxel = density.getValue(DensityIndexSpaceCoord);
|
||||
@endcode
|
||||
done()
|
||||
-->
|
||||
|
||||
|
||||
@subsection axexternalaccess External Parameter Access
|
||||
@@ -2108,6 +2048,4 @@ AX Roadmap as a near future feature.
|
||||
|
||||
@section axvexsupport AX VEX Support
|
||||
|
||||
</div>
|
||||
|
||||
*/
|
||||
|
||||
+9
-12
@@ -1,9 +1,8 @@
|
||||
/**
|
||||
<div style="width:800px;text-align:justify;">
|
||||
|
||||
@page axcplusplus OpenVDB AX
|
||||
@page axcplusplus AX C++ Documentation
|
||||
|
||||
@section axcdocs AX C++ Documentation
|
||||
@section axcdocs Intro
|
||||
@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
|
||||
@@ -27,7 +26,6 @@ API doxygen comments or contact us for more information.
|
||||
- @ref vdbaxcompiler
|
||||
- @ref vdbaxbinary
|
||||
- @ref vdbaxtoaxtypes
|
||||
- @ref vdbaxextend
|
||||
|
||||
<hr>
|
||||
|
||||
@@ -118,7 +116,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 openvdb::ax::ast::parse() method
|
||||
- The @vdblink::ax::ast::parse ax::ast::parse()@endlink method
|
||||
- The @vdblink::ax::ast::Visitor AST Visitor@endlink
|
||||
- AST scanners and tools
|
||||
@par
|
||||
@@ -128,7 +126,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
|
||||
@@ -139,7 +137,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 (see @ref vdbaxextend).
|
||||
own AST analysis or modifications.
|
||||
|
||||
@subsubsection vdbaxastscanners Scanners
|
||||
@par
|
||||
@@ -285,11 +283,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, @b \@ (the "at" symbol), is designed to
|
||||
allocated by AX itself. The first token, `@` (the "at" symbol), is designed to
|
||||
provide read/write access to geometry attributes. The second token is the dollar
|
||||
character @b $. This allows <b>read only</b> access to custom data that can be
|
||||
character `$`. 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
|
||||
@b \@attribute syntax, the value of this data can change without the need for AX
|
||||
`@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.
|
||||
@@ -487,10 +485,9 @@ 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>
|
||||
*/
|
||||
|
||||
+14
-16
@@ -1,5 +1,4 @@
|
||||
/**
|
||||
<div style="width:800px;text-align:justify;">
|
||||
|
||||
@page axexamples AX Code Examples
|
||||
|
||||
@@ -30,12 +29,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: @b `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: `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 @b vec3f float attribute @b velocity and a @b vec3f float attribute @b colour.
|
||||
a `vec3f` float attribute @b velocity and a `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.
|
||||
@@ -68,8 +67,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 and @ref axdeletepoint to randomly delete
|
||||
roughly half of the points in the input 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.
|
||||
@par
|
||||
<!-- P -->@code{.c}
|
||||
float threshold = 0.5f;
|
||||
@@ -83,7 +82,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 will receive a
|
||||
each point in the VDB points grid such that @ref axrand "rand()" will receive a
|
||||
different seed value per point producing a good distribution of random values.
|
||||
|
||||
@subsection axexamplepointdrag Applying Drag
|
||||
@@ -114,7 +113,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 @b `v\@P`. Whenever position is written to in this way, the AX
|
||||
the points `v@P`. Whenever position is written to in this way, the AX
|
||||
`PointExecutable` will move (re-bucket) points in PointDataGrids.
|
||||
|
||||
@subsection axexamplepointcurlnoise Curl Noise
|
||||
@@ -198,12 +197,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 function to constrain the @b density attribute
|
||||
between zero and one.
|
||||
This snippet uses @ref axclamp "clamp()" function to constrain the @b density
|
||||
attribute between zero and one.
|
||||
@par
|
||||
<!-- V -->@code{.c}
|
||||
float@density = clamp(float@density, 0.f, 1.f);
|
||||
@@ -234,10 +233,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 @b `\@surface_a` is written to. This means that the final blended result,
|
||||
only `@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.
|
||||
@@ -263,5 +262,4 @@ mask = clamp(mask, 0.0f, 1.0f);
|
||||
@surface_a = a + (b-a) * mask;
|
||||
@endcode
|
||||
|
||||
</div>
|
||||
*/
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
/**
|
||||
<div style="width:800px;text-align:justify;">
|
||||
|
||||
@page axfunctionlist AX Supported Functions
|
||||
|
||||
@@ -721,7 +720,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
|
||||
@@ -881,6 +880,4 @@ int64(int64 dividend; int64 divisor);
|
||||
int32(int32 dividend; int32 divisor);
|
||||
@endcode
|
||||
|
||||
|
||||
</div>
|
||||
*/
|
||||
|
||||
+1
-2
@@ -1,5 +1,4 @@
|
||||
/**
|
||||
<div style="width:800px;text-align:justify;">
|
||||
|
||||
@page openvdbax OpenVDB AX
|
||||
|
||||
@@ -41,7 +40,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.
|
||||
- @subpage build "Building OpenVDB" and @subpage dependencies "OpenVDB Dependencies" for information on building OpenVDB and <b>OpenVDB AX</b>.
|
||||
- @ref build "Building OpenVDB" and @ref dependencies "OpenVDB Dependencies" for information on building OpenVDB and <b>OpenVDB AX</b>.
|
||||
|
||||
</div>
|
||||
*/
|
||||
|
||||
+10
-11
@@ -288,7 +288,7 @@ Required:
|
||||
|
||||
Optional:
|
||||
|
||||
- @b [CMAKE_INSTALL_PREFIX](https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html)
|
||||
- [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
|
||||
@@ -381,7 +381,7 @@ Required:
|
||||
|
||||
Optional:
|
||||
|
||||
- @b [CMAKE_INSTALL_PREFIX](https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html)
|
||||
- [CMAKE_INSTALL_PREFIX](https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html)
|
||||
=`/path/to/install/dir` # The location you wish to install OpenVDB to. See
|
||||
the link for default values.
|
||||
- @b OPENVDB_MAYA_INSTALL_PREFIX =`/path/to/install/dir` # The location to
|
||||
@@ -449,7 +449,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:
|
||||
|
||||
- @b [CMAKE_INSTALL_PREFIX](https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html)
|
||||
- [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
|
||||
@@ -579,8 +579,7 @@ 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
|
||||
|
||||
@@ -632,9 +631,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.
|
||||
@@ -656,9 +655,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'
|
||||
|
||||
+168
-7
@@ -2,9 +2,170 @@
|
||||
|
||||
@page changes Release Notes
|
||||
|
||||
@htmlonly <a name="v12_1_2_changes"></a>@endhtmlonly
|
||||
@htmlonly <a name="v13_0_1_changes"></a>@endhtmlonly
|
||||
@par
|
||||
<B>Version 12.1.2</B> - <I>In development</I>
|
||||
<B>Version 13.0.1</B> - <I>In Development</I>
|
||||
|
||||
@htmlonly <a name="v13_0_0_changes"></a>@endhtmlonly
|
||||
@par
|
||||
<B>Version 13.0.0</B> - <I>November 3, 2025</I>
|
||||
|
||||
@par
|
||||
<BLOCKQUOTE>
|
||||
This version introduces ABI changes relative to older major releases, so to
|
||||
preserve ABI compatibility it might be necessary to define the macro
|
||||
<TT>OPENVDB_ABI_VERSION_NUMBER=</TT><I>N</I>, where, for example,
|
||||
<I>N</I> is 11 for Houdini 20.5 and 12 for Houdini 21.0.
|
||||
</BLOCKQUOTE>
|
||||
|
||||
@par
|
||||
<BLOCKQUOTE>
|
||||
Support for reading <TT>.vdb</TT> files written prior to VDB 1.0 has been
|
||||
removed. To read older <TT>.vdb</TT> 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+.
|
||||
</BLOCKQUOTE>
|
||||
|
||||
@par
|
||||
Highlights:
|
||||
- OpenVDB now includes in-memory support for Half Grids and the file format
|
||||
has been extended to add I/O serialization for half grids. More work is
|
||||
planned on adapting algorithms when using Half Grids for better performance
|
||||
and improved precision.
|
||||
- NanoVDB is no longer limited to static applications, such as rendering, but
|
||||
can increasingly be applied to problems that involve dynamic topology, such
|
||||
as level set tracking, grid building, morphology operations and merging of
|
||||
grids. This is due to the fact that we keep adding more and more tools to
|
||||
NanoVDB that facilitates tree modification. However, unlike OpenVDB, these
|
||||
operations generate new NanoVDB grids (as oppose to in-palace modifications
|
||||
in OpenVDB), yet are typically much faster since they are performed on the
|
||||
GPU. Many of these exciting new features are the foundation of fVDB.
|
||||
|
||||
@par
|
||||
OpenVDB:
|
||||
- New features:
|
||||
- Added native registration of HalfGrid type.
|
||||
- Added customization of the output transformation attribute for
|
||||
@vdblink::points::pca points::pca@endlink. Can be output as a quaternion
|
||||
or as a combined affine transform with the scale/stretch ommitted.
|
||||
- Added support for input quaternions attributes and affine transformations
|
||||
(that include scale) in
|
||||
@vdblink::points::rasterizeSdf points::rasterizeSdf@endlink for
|
||||
ellipsoidal rasterizations.
|
||||
|
||||
- API Changes:
|
||||
- Added @vdblink::tree::LeafBuffer::storage() LeafBuffer::storage()@endlink
|
||||
for direct const access to the raw data buffer when using the bool LeafNode.
|
||||
- Removed Grid::evalMinMax(), use
|
||||
@vdblink::tools::minMax tools::minMax@endlink for superior threaded
|
||||
performance.
|
||||
- Removed points::rasterize() that took a custom filter and interrupter.
|
||||
- Removed LeafNodeBool TopologyCopy constructor in favor of using explicit
|
||||
mask/buffer constructors.
|
||||
- Removed @vdblink::tree::ValueAccessor ValueAccessor@endlink NodeT0,
|
||||
NodeT1, NodeT2 aliases, use NodeTypeAtLevel instead.
|
||||
- Add @vdblink::tree::InternalNode::setValueMaskUnsafe() InternalNode::setValueMaskUnsafe()@endlink
|
||||
to write a value mask directly.
|
||||
- LegacyFrustum and RootNodeMask have been removed. These classes were
|
||||
only used for reading old .vdb files, which is no longer supported.
|
||||
- @vdblink::io::writeCompressedValues() io::writeCompressedValues()@endlink
|
||||
now takes a const ValueT* source buffer for improved const-correctness.
|
||||
|
||||
- Bug Fixes:
|
||||
- Fix a bug in the
|
||||
@vdblink::tools::LevelSetRayIntersector LevelSetRayIntersector@endlink class
|
||||
where two of the methods were incorrectly adjusting the time even when an
|
||||
intersection was not found.
|
||||
- Fixed an assertion in @vdblink::math::Quat math::Quat@endlink where a
|
||||
vector length check was using too small a tolerance.
|
||||
- Fixed a bug in the unit tests where detecting if assertions were enabled
|
||||
was using @c NDEBUG rather than OpenVDB assertions.
|
||||
|
||||
- Build:
|
||||
- Removed the unnecessary @c USE_NUMPY build option for the OpenVDB Python
|
||||
module. All functions which take numpy arrays are now always generated
|
||||
(numpy is not required at compile time for this support).
|
||||
- Bumped minimum supported CMake version to 3.24, and new future minimum to
|
||||
4.0.0.
|
||||
- Bumped minimum supported OpenEXR and Imath versions to 3.2, and new
|
||||
future minimum to 3.3.
|
||||
- Bumped minimum supported Boost version to 1.82, and new future minimum to
|
||||
1.85.
|
||||
- Bumped minimum supported Python version to 3.11
|
||||
- Bumped minimum supported Log4cplus version to 2.0
|
||||
- Bumped minimum supported Houdini version to 20.5
|
||||
- Bumped minimum supported GLFW version to 3.3
|
||||
- Bumped future minimum for TBB to 2021 (oneapi).
|
||||
- Bumped future minimum for nanobind to 2.5.0.
|
||||
|
||||
@par
|
||||
OpenVDB AX:
|
||||
- New:
|
||||
- Added support for LLVM 21.
|
||||
|
||||
@par
|
||||
NanoVDB:
|
||||
- Highlights:
|
||||
- NanoVDB is no longer limited to static applications, such as rendering,
|
||||
but can increasingly be applied to problems that involve dynamic topology,
|
||||
such as level set tracking, grid building, morphology operations and
|
||||
merging of grids. This is due to the fact that we keep adding more and
|
||||
more tools to NanoVDB that facilitates tree modification. However, unlike
|
||||
OpenVDB, these operations generate new NanoVDB grids (as oppose to
|
||||
in-palace modifications in OpenVDB), yet are typically much faster since
|
||||
they are performed on the GPU. Many of these exciting new features are the
|
||||
foundation of fVDB.
|
||||
|
||||
- New features:
|
||||
- Added <TT>nanovdb/tools/cuda/DilateGrid.cuh</TT>, which performs topology
|
||||
dilation on the GPU.
|
||||
- Added <TT>nanovdb/tools/cuda/MergeGrids.cuh</TT>, which merges the topology
|
||||
of two grids on the GPU.
|
||||
- Added <TT>nanovdb/tools/cuda/CoarsenGrid.cuh</TT>, which performs topological
|
||||
coarsening of grids on the GPU.
|
||||
- Added <TT>nanovdb/tools/cuda/RefineGrid.cuh</TT>, which performs topological
|
||||
refinement of grids on the GPU.
|
||||
- Added <TT>nanovdb/tools/cuda/PruneGrid.cuh</TT>, which prunes the topology of
|
||||
a grid using a sidecar mask on the GPU.
|
||||
- Added <TT>nanovdb/util/cuda/Injection.cuh</TT>, which facilitates sidecar
|
||||
data copying - on the GPU - in the overlap of two grids with different
|
||||
topology.
|
||||
- Added Mat classes and other math types to NanoVDB.
|
||||
- Major rewrite of nanovdb::NanoToOpenVDB, which now allows
|
||||
nanovdb::IndexGrids and blind (or sidecar) data to be converted into
|
||||
an openvdb grid.
|
||||
- Added support for LevelSet, FogVolume, and Staggered grid semantics.
|
||||
Added toGridClass and toSemantic to map Grid Blind data semantic to
|
||||
Grid class and vice versa.
|
||||
|
||||
- Improvements:
|
||||
- Improvements to mGPU grid building and introduction of a separate test
|
||||
executable for mGPU tests
|
||||
- Added stand-alone function nanovdb::writeUncompressedGrid that allows
|
||||
nanovdb::IndexGrids and blind (or sidecar) data to be written directly
|
||||
to a stream.
|
||||
- @c nanovdb_print now (optionally) prints the blind data count per grid.
|
||||
- Extended nanovdb::GridBlindDataSemantic with nanovdb::GridClass types
|
||||
to support conversion between IndexGrid and regular grids.
|
||||
- Improvements and bugfixes to PNanoVDB.
|
||||
|
||||
- API Changes:
|
||||
- Removed nanovdb::ValueIndexMask and nanovdb::ValueOnIndexMask since
|
||||
they are no longer used by fVDB (or elsewhere).
|
||||
- NanoVDB version is now 32.9.0, so the ABI of the grid is preserved
|
||||
but not the API. However, the API changes are very minor!
|
||||
|
||||
- Bug Fixes:
|
||||
- Several fixes for compiler warnings.
|
||||
- Fixed error in <TT>nanovdb/io/IO.h</TT> related to missing throws.
|
||||
|
||||
@par
|
||||
Houdini:
|
||||
- Remove support for openvdb_houdini::Interrupter, use
|
||||
openvdb_houdini::HoudiniInterrupter instead.
|
||||
- Remove input-stealing via duplicateSourceStealable(), SideFX have since
|
||||
introduced verbification and compiled SOPs to provide zero-copy node
|
||||
evaluation.
|
||||
|
||||
|
||||
@htmlonly <a name="v12_1_1_changes"></a>@endhtmlonly
|
||||
@@ -20,7 +181,7 @@ OpenVDB AX:
|
||||
@par
|
||||
Houdini:
|
||||
- Fixed a compilation issue with the OpenVDB Activate SOP with Houdini 21
|
||||
[Reported by @callen128]
|
||||
[Reported by \@callen128]
|
||||
|
||||
|
||||
@htmlonly <a name="v12_1_0_changes"></a>@endhtmlonly
|
||||
@@ -190,7 +351,7 @@ NanoVDB:
|
||||
- Fixed a call to a non-existent method in GridBuild.h
|
||||
|
||||
|
||||
@htmlonly <a name="v1_changes"></a>@endhtmlonly
|
||||
@htmlonly <a name="v12_0_0_changes"></a>@endhtmlonly
|
||||
@par
|
||||
<B>Version 12.0.0</B> - <I>October 31, 2024</I>
|
||||
|
||||
@@ -579,10 +740,10 @@ OpenVDB:
|
||||
- Fixed a bug with LeafManager which wouldn't correctly
|
||||
initialize its LeafNode array for single level Tree configurations
|
||||
i.e. RootNode<LeafNode> (bug introduced in 7.2.0).
|
||||
[Reported by @lanwatch]
|
||||
[Reported by \@lanwatch]
|
||||
- Fixed a bug with LeafNodeBool Topology constructor with designated
|
||||
on/off values which wouldn't apply them correctly.
|
||||
[Reported by @hozhaoea]
|
||||
[Reported by \@hozhaoea]
|
||||
|
||||
@par
|
||||
OpenVDB AX:
|
||||
@@ -2641,7 +2802,7 @@ Improvements:
|
||||
util::PagedArray@endlink.
|
||||
- Added an @c install_lib build target to the Makefile.
|
||||
<I>[Contributed by Double Negative]</I>
|
||||
- Added @subpage points "documentation" and Cookbook
|
||||
- Added @ref points "documentation" and Cookbook
|
||||
@ref openvdbPointsHelloWorld "examples" for OpenVDB Points.
|
||||
<I>[Contributed by Double Negative]</I>
|
||||
- Registration of OpenVDB Points grid and attribute types is now
|
||||
|
||||
@@ -79,7 +79,7 @@ GLFW | 3.3 | Latest | Simple API for OpenGL development
|
||||
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
|
||||
Doxygen | 1.8.8 | <= 1.14.0 | 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.
|
||||
@@ -100,15 +100,13 @@ Doxygen | 1.8.8 | 1.8.11 | Documentation generation from C++
|
||||
Additionally these versions of blosc may generally not be compatible with OpenVDB
|
||||
itself. Avoid using these versions and upgrade to the new minimum of 1.17.0 where
|
||||
possible.
|
||||
|
||||
- All versions from 1.11.0 through to, but excluding, 1.14.0.
|
||||
- Versions 1.16.0 and 1.16.1.
|
||||
|
||||
- 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
|
||||
- https://www.blosc.org/posts/new-forward-compat-policy/
|
||||
- https://github.com/Blosc/c-blosc/issues/260
|
||||
- https://github.com/Blosc/c-blosc/issues/261
|
||||
|
||||
- @b nanobind: Nanobind requires a fast-hash-map implementation library called
|
||||
tsl-robin-map. If you're installing nanobind through homebrew, this library
|
||||
|
||||
+18
-29
@@ -22,44 +22,30 @@ primarily by
|
||||
- Mihai Aldén
|
||||
- David Hill
|
||||
|
||||
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.
|
||||
|
||||
@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"
|
||||
@if OPENVDB_AX
|
||||
See @subpage openvdbax "OpenVDB AX" for the AX documentation.
|
||||
- @subpage openvdbax "OpenVDB AX"
|
||||
@endif
|
||||
|
||||
@if OPENVDB_HOUDINI
|
||||
See the @subpage houdini "Houdini Cookbook" for help on implementing Houdini nodes.
|
||||
- @subpage houdini "Houdini Cookbook"
|
||||
@endif
|
||||
|
||||
@if NANOVDB
|
||||
See @subpage NanoVDB_MainPage "NanoVDB" for the NanoVDB documentation.
|
||||
- @subpage NanoVDB_MainPage "NanoVDB"
|
||||
@endif
|
||||
- <a href="../code_coverage/index.html">Code Coverage</a>
|
||||
|
||||
Contributors, please familiarize yourselves with our
|
||||
@subpage codingStyle "coding standards".
|
||||
|
||||
<a href="../code_coverage/index.html">Code Coverage</a>
|
||||
|
||||
|
||||
@page overview OpenVDB Overview
|
||||
|
||||
@@ -81,6 +67,9 @@ Contributors, please familiarize yourselves with our
|
||||
- @ref subsecNodeIter
|
||||
- @ref subsecValueAccessor
|
||||
- @ref subsecTraversal
|
||||
- @subpage transformsAndMaps "Transforms and Maps"
|
||||
|
||||
|
||||
<!-- - @ref secRegistry -->
|
||||
|
||||
|
||||
@@ -320,7 +309,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::Grid::signedFloodFill() signed flood fill@endlink to reconstruct
|
||||
@vdblink::tools::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
|
||||
|
||||
+1
-1
@@ -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 @subpage codeExamples and
|
||||
For more details, please consult the @ref codeExamples and
|
||||
Appendix B in the <i>Transactions on Graphics</i> paper.
|
||||
|
||||
@section sMaxRes Is OpenVDB unbounded?
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
<!-- 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.
|
After Width: | Height: | Size: 15 KiB |
@@ -0,0 +1,26 @@
|
||||
|
||||
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();
|
||||
}
|
||||
@@ -21,7 +21,6 @@
|
||||
- @ref secPtIndexFilters
|
||||
- @ref secPtSpaceAndTrans
|
||||
|
||||
|
||||
@section secPtOverview Introduction
|
||||
@anchor openvdbPointsOverview
|
||||
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
|
||||
@page python Using OpenVDB in Python
|
||||
@page python OpenVDB Python
|
||||
|
||||
This section describes the OpenVDB Python module and includes Python code
|
||||
snippets and some complete programs that illustrate how to perform common tasks.
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
See [LICENSE](LICENSE) for the main open source license of original
|
||||
code written for the OpenVDB project.
|
||||
|
||||
The remainder of this file reproduces the open source licensing details
|
||||
of other projects that have been imported, incorporated into, or derived
|
||||
into parts of OpenVDB.
|
||||
|
||||
In no particular order:
|
||||
|
||||
-------------------------------------------------------------------------
|
||||
|
||||
BSD 3-Clause License
|
||||
SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
* Imath, Copyright (c) Contributors to the Imath Project.
|
||||
https://github.com/AcademySoftwareFoundation/Imath
|
||||
|
||||
OpenVDB includes a copy of Half.h from the Imath project. This copy can
|
||||
be disabled in favour of using Half.h from the Imath project - but one
|
||||
must be provided either way.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
- Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
- Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
- Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
-------------------------------------------------------------------------
|
||||
|
||||
MIT License
|
||||
|
||||
* doxygen-awesome Copyright (c) 2021 - 2023 jothepro
|
||||
https://github.com/jothepro/doxygen-awesome-css
|
||||
|
||||
OpenVDB uses doxygen-awesome for stylized html output with doxygen and
|
||||
comes bundled with copies of the css provided by doxygen-awesome. Usage
|
||||
of this css can be disabled.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
-------------------------------------------------------------------------
|
||||
|
||||
Public domain
|
||||
|
||||
* The simplex noise implementation included in OpenVDB AX is Copyright (c)
|
||||
Arthur Tombs. It bears the following notice:
|
||||
|
||||
This is a derivative work based on OpenSimplex by Kurt Spencer:
|
||||
https://gist.github.com/KdotJPG/b1270127455a94ac5d19
|
||||
|
||||
Anyone is free to make use of this software in whatever way they want.
|
||||
Attribution is appreciated, but not required.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
-------------------------------------------------------------------------
|
||||
|
||||
If we have left anything out, it is unintentional. Please let us know.
|
||||
@@ -0,0 +1,138 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/**
|
||||
|
||||
Doxygen Awesome
|
||||
https://github.com/jothepro/doxygen-awesome-css
|
||||
|
||||
Copyright (c) 2021 - 2025 jothepro
|
||||
|
||||
*/
|
||||
|
||||
class DoxygenAwesomeDarkModeToggle extends HTMLElement {
|
||||
// SVG icons from https://fonts.google.com/icons
|
||||
// Licensed under the Apache 2.0 license:
|
||||
// https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
static lightModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FCBF00"><rect fill="none" height="24" width="24"/><circle cx="12" cy="12" opacity=".3" r="3"/><path d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"/></svg>`
|
||||
static darkModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FE9700"><rect fill="none" height="24" width="24"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27 C17.45,17.19,14.93,19,12,19c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z" opacity=".3"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/></svg>`
|
||||
static title = "Toggle Light/Dark Mode"
|
||||
|
||||
static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode"
|
||||
static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode"
|
||||
|
||||
static _staticConstructor = function() {
|
||||
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.userPreference)
|
||||
// Update the color scheme when the browsers preference changes
|
||||
// without user interaction on the website.
|
||||
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
|
||||
DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged()
|
||||
})
|
||||
// Update the color scheme when the tab is made visible again.
|
||||
// It is possible that the appearance was changed in another tab
|
||||
// while this tab was in the background.
|
||||
document.addEventListener("visibilitychange", visibilityState => {
|
||||
if (document.visibilityState === 'visible') {
|
||||
DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged()
|
||||
}
|
||||
});
|
||||
}()
|
||||
|
||||
static init() {
|
||||
$(function() {
|
||||
$(document).ready(function() {
|
||||
const toggleButton = document.createElement('doxygen-awesome-dark-mode-toggle')
|
||||
toggleButton.title = DoxygenAwesomeDarkModeToggle.title
|
||||
toggleButton.updateIcon()
|
||||
|
||||
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
|
||||
toggleButton.updateIcon()
|
||||
})
|
||||
document.addEventListener("visibilitychange", visibilityState => {
|
||||
if (document.visibilityState === 'visible') {
|
||||
toggleButton.updateIcon()
|
||||
}
|
||||
});
|
||||
|
||||
$(document).ready(function(){
|
||||
document.getElementById("MSearchBox").parentNode.appendChild(toggleButton)
|
||||
})
|
||||
$(window).resize(function(){
|
||||
document.getElementById("MSearchBox").parentNode.appendChild(toggleButton)
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this.onclick=this.toggleDarkMode
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns `true` for dark-mode, `false` for light-mode system preference
|
||||
*/
|
||||
static get systemPreference() {
|
||||
return window.matchMedia('(prefers-color-scheme: dark)').matches
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns `true` for dark-mode, `false` for light-mode user preference
|
||||
*/
|
||||
static get userPreference() {
|
||||
return (!DoxygenAwesomeDarkModeToggle.systemPreference && localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)) ||
|
||||
(DoxygenAwesomeDarkModeToggle.systemPreference && !localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey))
|
||||
}
|
||||
|
||||
static set userPreference(userPreference) {
|
||||
DoxygenAwesomeDarkModeToggle.darkModeEnabled = userPreference
|
||||
if(!userPreference) {
|
||||
if(DoxygenAwesomeDarkModeToggle.systemPreference) {
|
||||
localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey, true)
|
||||
} else {
|
||||
localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)
|
||||
}
|
||||
} else {
|
||||
if(!DoxygenAwesomeDarkModeToggle.systemPreference) {
|
||||
localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey, true)
|
||||
} else {
|
||||
localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey)
|
||||
}
|
||||
}
|
||||
DoxygenAwesomeDarkModeToggle.onUserPreferenceChanged()
|
||||
}
|
||||
|
||||
static enableDarkMode(enable) {
|
||||
if(enable) {
|
||||
DoxygenAwesomeDarkModeToggle.darkModeEnabled = true
|
||||
document.documentElement.classList.add("dark-mode")
|
||||
document.documentElement.classList.remove("light-mode")
|
||||
} else {
|
||||
DoxygenAwesomeDarkModeToggle.darkModeEnabled = false
|
||||
document.documentElement.classList.remove("dark-mode")
|
||||
document.documentElement.classList.add("light-mode")
|
||||
}
|
||||
}
|
||||
|
||||
static onSystemPreferenceChanged() {
|
||||
DoxygenAwesomeDarkModeToggle.darkModeEnabled = DoxygenAwesomeDarkModeToggle.userPreference
|
||||
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled)
|
||||
}
|
||||
|
||||
static onUserPreferenceChanged() {
|
||||
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled)
|
||||
}
|
||||
|
||||
toggleDarkMode() {
|
||||
DoxygenAwesomeDarkModeToggle.userPreference = !DoxygenAwesomeDarkModeToggle.userPreference
|
||||
this.updateIcon()
|
||||
}
|
||||
|
||||
updateIcon() {
|
||||
if(DoxygenAwesomeDarkModeToggle.darkModeEnabled) {
|
||||
this.innerHTML = DoxygenAwesomeDarkModeToggle.darkModeIcon
|
||||
} else {
|
||||
this.innerHTML = DoxygenAwesomeDarkModeToggle.lightModeIcon
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define("doxygen-awesome-dark-mode-toggle", DoxygenAwesomeDarkModeToggle);
|
||||
@@ -0,0 +1,66 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/**
|
||||
|
||||
Doxygen Awesome
|
||||
https://github.com/jothepro/doxygen-awesome-css
|
||||
|
||||
Copyright (c) 2022 - 2025 jothepro
|
||||
|
||||
*/
|
||||
|
||||
class DoxygenAwesomeFragmentCopyButton extends HTMLElement {
|
||||
constructor() {
|
||||
super();
|
||||
this.onclick=this.copyContent
|
||||
}
|
||||
static title = "Copy to clipboard"
|
||||
static copyIcon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M23.04,10.322c0,-2.582 -2.096,-4.678 -4.678,-4.678l-6.918,-0c-2.582,-0 -4.678,2.096 -4.678,4.678c0,-0 0,8.04 0,8.04c0,2.582 2.096,4.678 4.678,4.678c0,-0 6.918,-0 6.918,-0c2.582,-0 4.678,-2.096 4.678,-4.678c0,-0 0,-8.04 0,-8.04Zm-2.438,-0l-0,8.04c-0,1.236 -1.004,2.24 -2.24,2.24l-6.918,-0c-1.236,-0 -2.239,-1.004 -2.239,-2.24l-0,-8.04c-0,-1.236 1.003,-2.24 2.239,-2.24c0,0 6.918,0 6.918,0c1.236,0 2.24,1.004 2.24,2.24Z"/><path d="M5.327,16.748c-0,0.358 -0.291,0.648 -0.649,0.648c0,0 0,0 0,0c-2.582,0 -4.678,-2.096 -4.678,-4.678c0,0 0,-8.04 0,-8.04c0,-2.582 2.096,-4.678 4.678,-4.678l6.918,0c2.168,0 3.994,1.478 4.523,3.481c0.038,0.149 0.005,0.306 -0.09,0.428c-0.094,0.121 -0.239,0.191 -0.392,0.191c-0.451,0.005 -1.057,0.005 -1.457,0.005c-0.238,0 -0.455,-0.14 -0.553,-0.357c-0.348,-0.773 -1.128,-1.31 -2.031,-1.31c-0,0 -6.918,0 -6.918,0c-1.236,0 -2.24,1.004 -2.24,2.24l0,8.04c0,1.236 1.004,2.24 2.24,2.24l0,-0c0.358,-0 0.649,0.29 0.649,0.648c-0,0.353 -0,0.789 -0,1.142Z" style="fill-opacity:0.6;"/></svg>`
|
||||
static successIcon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M8.084,16.111c-0.09,0.09 -0.212,0.141 -0.34,0.141c-0.127,-0 -0.249,-0.051 -0.339,-0.141c-0.746,-0.746 -2.538,-2.538 -3.525,-3.525c-0.375,-0.375 -0.983,-0.375 -1.357,0c-0.178,0.178 -0.369,0.369 -0.547,0.547c-0.375,0.375 -0.375,0.982 -0,1.357c1.135,1.135 3.422,3.422 4.75,4.751c0.27,0.27 0.637,0.421 1.018,0.421c0.382,0 0.749,-0.151 1.019,-0.421c2.731,-2.732 10.166,-10.167 12.454,-12.455c0.375,-0.375 0.375,-0.982 -0,-1.357c-0.178,-0.178 -0.369,-0.369 -0.547,-0.547c-0.375,-0.375 -0.982,-0.375 -1.357,0c-2.273,2.273 -9.567,9.567 -11.229,11.229Z"/></svg>`
|
||||
static successDuration = 980
|
||||
static init() {
|
||||
$(function() {
|
||||
$(document).ready(function() {
|
||||
if(navigator.clipboard) {
|
||||
const fragments = document.getElementsByClassName("fragment")
|
||||
for(const fragment of fragments) {
|
||||
const fragmentWrapper = document.createElement("div")
|
||||
fragmentWrapper.className = "doxygen-awesome-fragment-wrapper"
|
||||
const fragmentCopyButton = document.createElement("doxygen-awesome-fragment-copy-button")
|
||||
fragmentCopyButton.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon
|
||||
fragmentCopyButton.title = DoxygenAwesomeFragmentCopyButton.title
|
||||
|
||||
fragment.parentNode.replaceChild(fragmentWrapper, fragment)
|
||||
fragmentWrapper.appendChild(fragment)
|
||||
fragmentWrapper.appendChild(fragmentCopyButton)
|
||||
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
copyContent() {
|
||||
const content = this.previousSibling.cloneNode(true)
|
||||
// filter out line number from file listings
|
||||
content.querySelectorAll(".lineno, .ttc").forEach((node) => {
|
||||
node.remove()
|
||||
})
|
||||
let textContent = content.textContent
|
||||
// remove trailing newlines that appear in file listings
|
||||
let numberOfTrailingNewlines = 0
|
||||
while(textContent.charAt(textContent.length - (numberOfTrailingNewlines + 1)) == '\n') {
|
||||
numberOfTrailingNewlines++;
|
||||
}
|
||||
textContent = textContent.substring(0, textContent.length - numberOfTrailingNewlines)
|
||||
navigator.clipboard.writeText(textContent);
|
||||
this.classList.add("success")
|
||||
this.innerHTML = DoxygenAwesomeFragmentCopyButton.successIcon
|
||||
window.setTimeout(() => {
|
||||
this.classList.remove("success")
|
||||
this.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon
|
||||
}, DoxygenAwesomeFragmentCopyButton.successDuration);
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define("doxygen-awesome-fragment-copy-button", DoxygenAwesomeFragmentCopyButton)
|
||||
@@ -0,0 +1,32 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/**
|
||||
|
||||
Doxygen Awesome
|
||||
https://github.com/jothepro/doxygen-awesome-css
|
||||
|
||||
Copyright (c) 2022 - 2025 jothepro
|
||||
|
||||
*/
|
||||
|
||||
class DoxygenAwesomeParagraphLink {
|
||||
// Icon from https://fonts.google.com/icons
|
||||
// Licensed under the Apache 2.0 license:
|
||||
// https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
static icon = `<svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M17 7h-4v2h4c1.65 0 3 1.35 3 3s-1.35 3-3 3h-4v2h4c2.76 0 5-2.24 5-5s-2.24-5-5-5zm-6 8H7c-1.65 0-3-1.35-3-3s1.35-3 3-3h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-2zm-3-4h8v2H8z"/></svg>`
|
||||
static title = "Permanent Link"
|
||||
static init() {
|
||||
$(function() {
|
||||
$(document).ready(function() {
|
||||
document.querySelectorAll(".contents a.anchor[id], .contents .groupheader > a[id]").forEach((node) => {
|
||||
let anchorlink = document.createElement("a")
|
||||
anchorlink.setAttribute("href", `#${node.getAttribute("id")}`)
|
||||
anchorlink.setAttribute("title", DoxygenAwesomeParagraphLink.title)
|
||||
anchorlink.classList.add("anchorlink")
|
||||
node.classList.add("anchor")
|
||||
anchorlink.innerHTML = DoxygenAwesomeParagraphLink.icon
|
||||
node.parentElement.appendChild(anchorlink)
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/**
|
||||
|
||||
Doxygen Awesome
|
||||
https://github.com/jothepro/doxygen-awesome-css
|
||||
|
||||
Copyright (c) 2021 - 2025 jothepro
|
||||
|
||||
*/
|
||||
|
||||
@media screen and (min-width: 768px) {
|
||||
|
||||
#MSearchBox {
|
||||
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - var(--searchbar-height) - 1px);
|
||||
}
|
||||
|
||||
#MSearchField {
|
||||
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 66px - var(--searchbar-height));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/**
|
||||
|
||||
Doxygen Awesome
|
||||
https://github.com/jothepro/doxygen-awesome-css
|
||||
|
||||
Copyright (c) 2021 - 2025 jothepro
|
||||
|
||||
*/
|
||||
|
||||
html {
|
||||
/* side nav width. MUST be = `TREEVIEW_WIDTH`.
|
||||
* Make sure it is wide enough to contain the page title (logo + title + version)
|
||||
*/
|
||||
--side-nav-fixed-width: 335px;
|
||||
--menu-display: none;
|
||||
|
||||
--top-height: 120px;
|
||||
--toc-sticky-top: -25px;
|
||||
--toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 25px);
|
||||
}
|
||||
|
||||
#projectname {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
|
||||
@media screen and (min-width: 768px) {
|
||||
html {
|
||||
--searchbar-background: var(--page-background-color);
|
||||
}
|
||||
|
||||
#side-nav {
|
||||
min-width: var(--side-nav-fixed-width);
|
||||
max-width: var(--side-nav-fixed-width);
|
||||
top: var(--top-height);
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
#nav-tree, #side-nav {
|
||||
height: calc(100vh - var(--top-height)) !important;
|
||||
}
|
||||
|
||||
#top {
|
||||
display: block;
|
||||
border-bottom: none;
|
||||
height: var(--top-height);
|
||||
margin-bottom: calc(0px - var(--top-height));
|
||||
max-width: var(--side-nav-fixed-width);
|
||||
overflow: hidden;
|
||||
background: var(--side-nav-background);
|
||||
}
|
||||
|
||||
#main-nav {
|
||||
float: left;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
.ui-resizable-handle {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.ui-resizable-e {
|
||||
width: 0;
|
||||
}
|
||||
|
||||
#nav-path {
|
||||
position: fixed;
|
||||
right: 0;
|
||||
left: calc(var(--side-nav-fixed-width) + 1px);
|
||||
bottom: 0;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
#doc-content {
|
||||
height: calc(100vh - 31px) !important;
|
||||
padding-bottom: calc(3 * var(--spacing-large));
|
||||
padding-top: calc(var(--top-height) - 80px);
|
||||
box-sizing: border-box;
|
||||
margin-left: var(--side-nav-fixed-width) !important;
|
||||
}
|
||||
|
||||
#MSearchBox {
|
||||
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)));
|
||||
}
|
||||
|
||||
#MSearchField {
|
||||
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 65px);
|
||||
}
|
||||
|
||||
#MSearchResultsWindow {
|
||||
left: var(--spacing-medium) !important;
|
||||
right: auto;
|
||||
}
|
||||
|
||||
#nav-sync {
|
||||
bottom: 4px;
|
||||
right: auto;
|
||||
left: 300px;
|
||||
width: 35px;
|
||||
top: auto !important;
|
||||
user-select: none;
|
||||
position: fixed
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -339,10 +339,12 @@ NanoToOpenVDB::process(trait::OpenNodeT<NanoBuildT, LEVEL> *dstNode,
|
||||
dstTable[n].setValue(*trait::mapPtr(&srcData->mTable[n].value));
|
||||
}
|
||||
}
|
||||
// Extract type alias before lambda for MSVC compatibility
|
||||
using DstChildNodeType = typename DstNodeT::ChildNodeType;
|
||||
auto kernel = [&](const auto& r) {
|
||||
for (auto i = r.begin(); i != r.end(); ++i) {
|
||||
auto &p = childNodes[i];
|
||||
auto* dstChild = new typename DstNodeT::ChildNodeType();// un-initialized
|
||||
auto* dstChild = new DstChildNodeType();// un-initialized
|
||||
this->template process<LEVEL-1, NanoBuildT>(dstChild, p.second);
|
||||
dstTable[p.first].setChild( dstChild );
|
||||
}
|
||||
@@ -380,10 +382,12 @@ NanoToOpenVDB::process(trait::OpenNodeT<NanoValueT, LEVEL> *dstNode,
|
||||
dstTable[n].setValue(*trait::mapPtr(sideCar + srcData->mTable[n].value));
|
||||
}
|
||||
}
|
||||
// Extract type alias before lambda for MSVC compatibility
|
||||
using DstChildNodeType = typename DstNodeT::ChildNodeType;
|
||||
auto kernel = [&](const auto& r) {
|
||||
for (auto i = r.begin(); i != r.end(); ++i) {
|
||||
auto &p = childNodes[i];
|
||||
auto *dstChild = new typename DstNodeT::ChildNodeType();// un-initialized
|
||||
auto *dstChild = new DstChildNodeType();// un-initialized
|
||||
this->template process<LEVEL-1, NanoIndexT, NanoValueT>(dstChild, p.second, sideCar);
|
||||
dstTable[p.first].setChild( dstChild );
|
||||
}
|
||||
|
||||
@@ -35,7 +35,8 @@ file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/data")
|
||||
|
||||
if (MSVC)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
|
||||
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler /bigobj")
|
||||
# /Zc:preprocessor fixes aligned_alloc issues with CCCL on MSVC
|
||||
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler \"/bigobj /Zc:preprocessor\"")
|
||||
endif()
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
@@ -370,7 +370,6 @@ set(OPENVDB_LIBRARY_SOURCE_FILES
|
||||
io/Queue.cc
|
||||
io/Stream.cc
|
||||
io/TempFile.cc
|
||||
math/Half.cc
|
||||
math/Maps.cc
|
||||
math/Proximity.cc
|
||||
math/QuantizedUnitVec.cc
|
||||
@@ -419,7 +418,6 @@ set(OPENVDB_LIBRARY_MATH_INCLUDE_FILES
|
||||
math/Coord.h
|
||||
math/DDA.h
|
||||
math/FiniteDifference.h
|
||||
math/Half.h
|
||||
math/HalfDecl.h
|
||||
math/Maps.h
|
||||
math/Mat.h
|
||||
@@ -579,6 +577,11 @@ set(OPENVDB_LIBRARY_THREAD_INCLUDE_FILES
|
||||
thread/Threading.h
|
||||
)
|
||||
|
||||
list(APPEND OPENVDB_LIBRARY_MATH_INCLUDE_FILES
|
||||
${CMAKE_SOURCE_DIR}/ext/imath/openvdb/math/Half.h)
|
||||
list(APPEND OPENVDB_LIBRARY_SOURCE_FILES
|
||||
${CMAKE_SOURCE_DIR}/ext/imath/openvdb/math/Half.cc)
|
||||
|
||||
##########################################################################
|
||||
|
||||
# Configure auto-generation of explicit template definition translation units
|
||||
@@ -677,6 +680,10 @@ if(OPENVDB_CORE_STATIC)
|
||||
PRIVATE .
|
||||
)
|
||||
|
||||
if(NOT USE_IMATH_HALF)
|
||||
target_include_directories(openvdb_static PUBLIC ${CMAKE_SOURCE_DIR}/ext/imath)
|
||||
endif()
|
||||
|
||||
target_compile_definitions(openvdb_static
|
||||
PUBLIC ${OPENVDB_CORE_PUBLIC_DEFINES} -DOPENVDB_STATICLIB
|
||||
PRIVATE ${OPENVDB_CORE_PRIVATE_DEFINES}
|
||||
@@ -710,6 +717,10 @@ if(OPENVDB_CORE_SHARED)
|
||||
PRIVATE .
|
||||
)
|
||||
|
||||
if(NOT USE_IMATH_HALF)
|
||||
target_include_directories(openvdb_shared PUBLIC ${CMAKE_SOURCE_DIR}/ext/imath)
|
||||
endif()
|
||||
|
||||
target_compile_definitions(openvdb_shared
|
||||
PUBLIC ${OPENVDB_CORE_PUBLIC_DEFINES} -DOPENVDB_DLL
|
||||
PRIVATE ${OPENVDB_CORE_PRIVATE_DEFINES}
|
||||
|
||||
@@ -554,8 +554,6 @@ RetT TSEvalFirstPredImpl(
|
||||
|
||||
/// @endcond
|
||||
|
||||
|
||||
/// @brief
|
||||
template<size_t Start, size_t End, typename OpT>
|
||||
OPENVDB_TYPELIST_FORCE_INLINE auto foreachIndex(OpT op)
|
||||
{
|
||||
|
||||
@@ -378,6 +378,8 @@ template<typename T, typename SubT> struct ConvertElementType<math::Mat3<T>, Sub
|
||||
template<typename T, typename SubT> struct ConvertElementType<math::Mat4<T>, SubT> { using Type = math::Mat4<SubT>; };
|
||||
/// @}
|
||||
|
||||
/// @cond OPENVDB_DOCS_INTERNAL
|
||||
|
||||
namespace types_internal
|
||||
{
|
||||
template <size_t Bits, bool Signed> struct int_t;
|
||||
@@ -396,6 +398,8 @@ template <> struct flt_t<32ul> { using type = float; };
|
||||
template <> struct flt_t<64ul> { using type = double; };
|
||||
}
|
||||
|
||||
/// @endcond
|
||||
|
||||
/// @brief Promotion classes which provide an interface for elevating and
|
||||
/// demoting a scalar or VDB type to a higher or lower precision. Integer
|
||||
/// types preserve their sign. Types promotion are only valid between
|
||||
|
||||
@@ -112,7 +112,7 @@ public:
|
||||
/// unit vector
|
||||
Quat(const Vec3<T> &axis, T angle)
|
||||
{
|
||||
OPENVDB_ASSERT(isApproxEqual(axis.length(), T(1)));
|
||||
OPENVDB_ASSERT(isApproxEqual(axis.length(), T(1), T(1.0e-7)));
|
||||
|
||||
T s = T(sin(angle*T(0.5)));
|
||||
|
||||
|
||||
+12
-12
@@ -14,21 +14,21 @@
|
||||
#include <blosc.h>
|
||||
#endif
|
||||
|
||||
#if OPENVDB_ABI_VERSION_NUMBER <= 9
|
||||
#error ABI <= 9 is no longer supported
|
||||
#if OPENVDB_ABI_VERSION_NUMBER <= 10
|
||||
#error ABI <= 10 is no longer supported
|
||||
#endif
|
||||
|
||||
// If using an OPENVDB_ABI_VERSION_NUMBER that has been deprecated, issue an
|
||||
// error directive. This can be optionally suppressed by defining:
|
||||
// OPENVDB_USE_DEPRECATED_ABI_<VERSION>=ON.
|
||||
#ifndef OPENVDB_USE_DEPRECATED_ABI_10
|
||||
#if OPENVDB_ABI_VERSION_NUMBER == 10
|
||||
#error ABI = 10 is deprecated, CMake option OPENVDB_USE_DEPRECATED_ABI_10 suppresses this error
|
||||
#endif
|
||||
#endif
|
||||
#ifndef OPENVDB_USE_DEPRECATED_ABI_11
|
||||
#if OPENVDB_ABI_VERSION_NUMBER == 11
|
||||
PRAGMA(message("NOTE: ABI = 11 is deprecated, define OPENVDB_USE_DEPRECATED_ABI_11 "
|
||||
#error ABI = 11 is deprecated, CMake option OPENVDB_USE_DEPRECATED_ABI_11 suppresses this error
|
||||
#endif
|
||||
#endif
|
||||
#ifndef OPENVDB_USE_DEPRECATED_ABI_12
|
||||
#if OPENVDB_ABI_VERSION_NUMBER == 12
|
||||
PRAGMA(message("NOTE: ABI = 12 is deprecated, define OPENVDB_USE_DEPRECATED_ABI_12 "
|
||||
"to suppress this message"))
|
||||
#endif
|
||||
#endif
|
||||
@@ -36,10 +36,10 @@
|
||||
// If using a future OPENVDB_ABI_VERSION_NUMBER, issue an error directive.
|
||||
// This can be optionally suppressed by defining:
|
||||
// OPENVDB_USE_FUTURE_ABI_<VERSION>=ON.
|
||||
#ifndef OPENVDB_USE_FUTURE_ABI_13
|
||||
#if OPENVDB_ABI_VERSION_NUMBER == 13
|
||||
#error ABI = 13 is still in active development and has not been finalized, \
|
||||
CMake option OPENVDB_USE_FUTURE_ABI_13 suppresses this error
|
||||
#ifndef OPENVDB_USE_FUTURE_ABI_14
|
||||
#if OPENVDB_ABI_VERSION_NUMBER == 14
|
||||
#error ABI = 14 is still in active development and has not been finalized, \
|
||||
CMake option OPENVDB_USE_FUTURE_ABI_14 suppresses this error
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
@@ -87,7 +87,7 @@ using Vec3dGrid = Vec3DGrid;
|
||||
using Vec3fGrid = Vec3SGrid;
|
||||
using VectorGrid = Vec3fGrid;
|
||||
|
||||
/// @name Lists of native Grid Types
|
||||
/** @name Lists of native Grid Types */
|
||||
/// @{
|
||||
/// The floating point Grid types which OpenVDB will register by default.
|
||||
using RealGridTypes = TypeList<FloatGrid, DoubleGrid>;
|
||||
@@ -112,10 +112,12 @@ using GridTypes =
|
||||
Append<BoolGrid, MaskGrid>;
|
||||
/// @}
|
||||
|
||||
|
||||
/// @cond OPENVDB_DOCS_INTERNAL
|
||||
namespace internal {
|
||||
template <typename T> using ToTreeType = typename T::TreeType;
|
||||
}
|
||||
/// @endcond
|
||||
|
||||
/// @name Lists of native Tree Types
|
||||
/// @{
|
||||
using RealTreeTypes = RealGridTypes::Transform<internal::ToTreeType>;
|
||||
@@ -126,7 +128,7 @@ using TreeTypes = GridTypes::Transform<internal::ToTreeType>;
|
||||
/// @}
|
||||
|
||||
|
||||
/// @name Lists of native TypedAttributeArray Types (for PointDataGrids)
|
||||
/** @name Lists of native TypedAttributeArray Types (for PointDataGrids) */
|
||||
/// @{
|
||||
/// The floating point attribute array types which OpenVDB will register by default.
|
||||
using RealAttributeTypes = TypeList<
|
||||
|
||||
@@ -24,6 +24,8 @@ OPENVDB_USE_VERSION_NAMESPACE
|
||||
namespace OPENVDB_VERSION_NAME {
|
||||
namespace points {
|
||||
|
||||
/// @cond OPENVDB_DOCS_INTERNAL
|
||||
|
||||
namespace point_attribute_internal {
|
||||
|
||||
template <typename ValueType>
|
||||
@@ -34,6 +36,7 @@ struct Default
|
||||
|
||||
} // namespace point_attribute_internal
|
||||
|
||||
/// @endcond
|
||||
|
||||
/// @brief Appends a new attribute to the VDB tree
|
||||
/// (this method does not require a templated AttributeType)
|
||||
|
||||
@@ -136,6 +136,7 @@ private:
|
||||
bool mInvert = false;
|
||||
}; // struct FrustumRasterizerMask
|
||||
|
||||
/// @cond OPENVDB_DOCS_INTERNAL
|
||||
|
||||
namespace point_rasterize_internal {
|
||||
|
||||
@@ -144,6 +145,7 @@ class GridToRasterize;
|
||||
|
||||
} // namespace point_rasterize_internal
|
||||
|
||||
/// @endcond
|
||||
|
||||
/// @brief Efficient rasterization of one or more VDB Points grids into a linear
|
||||
/// or frustum volume with the option to bake in camera or geometry motion blur.
|
||||
|
||||
@@ -91,7 +91,7 @@ namespace OPENVDB_VERSION_NAME {
|
||||
namespace points {
|
||||
|
||||
/// @brief Perform point rasterzation to produce a signed distance field.
|
||||
/// @param point the point data grid to rasterize
|
||||
/// @param points the point data grid to rasterize
|
||||
/// @param settings one of the available transfer setting schemes found below
|
||||
/// in this file.
|
||||
/// @return A vector of grids. The signed distance field is guaranteed to be
|
||||
|
||||
@@ -410,6 +410,8 @@ private:
|
||||
NodeMaskT* mMask;
|
||||
};
|
||||
|
||||
/// @cond OPENVDB_DOCS_INTERNAL
|
||||
|
||||
namespace transfer_internal
|
||||
{
|
||||
template<typename T, typename F, size_t... Is>
|
||||
@@ -438,6 +440,8 @@ void foreach(void** buffers, const F& func, std::integer_sequence<size_t, Is...>
|
||||
}
|
||||
}
|
||||
|
||||
/// @endcond
|
||||
|
||||
template <typename ...TreeTypes>
|
||||
VolumeTransfer<TreeTypes...>::VolumeTransfer(TreeTypes*... trees)
|
||||
: mTreeArray({ trees... })
|
||||
@@ -481,6 +485,8 @@ inline void VolumeTransfer<TreeTypes...>::foreach(const FunctorT& functor)
|
||||
std::make_integer_sequence<size_t, Size>());
|
||||
}
|
||||
|
||||
/// @cond OPENVDB_DOCS_INTERNAL
|
||||
|
||||
namespace transfer_internal
|
||||
{
|
||||
|
||||
@@ -692,6 +698,8 @@ private:
|
||||
|
||||
} // namespace transfer_internal
|
||||
|
||||
/// @endcond
|
||||
|
||||
///////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -291,7 +291,6 @@ inline typename GridT::Ptr convertPointsToScalar(
|
||||
|
||||
} // namespace point_mask_internal
|
||||
|
||||
/// @endcond
|
||||
|
||||
////////////////////////////////////////
|
||||
|
||||
@@ -347,6 +346,7 @@ convertPointsToMask(
|
||||
nonConstPoints, transform, filter, deformer, threaded);
|
||||
}
|
||||
|
||||
/// @endcond
|
||||
|
||||
////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -16,9 +16,12 @@ OPENVDB_USE_VERSION_NAMESPACE
|
||||
namespace OPENVDB_VERSION_NAME {
|
||||
namespace points {
|
||||
|
||||
/// @cond OPENVDB_DOCS_INTERNAL
|
||||
|
||||
// define leaf index in use as 32-bit
|
||||
namespace point_move_internal { using LeafIndex = Index32; }
|
||||
|
||||
/// @endcond
|
||||
|
||||
/// @brief A Deformer that caches the resulting positions from evaluating another Deformer
|
||||
template <typename T>
|
||||
@@ -82,6 +85,7 @@ private:
|
||||
|
||||
////////////////////////////////////////
|
||||
|
||||
/// @cond OPENVDB_DOCS_INTERNAL
|
||||
|
||||
namespace point_move_internal {
|
||||
|
||||
@@ -448,6 +452,7 @@ private:
|
||||
|
||||
} // namespace point_move_internal
|
||||
|
||||
/// @endcond
|
||||
|
||||
////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -20,6 +20,8 @@ OPENVDB_USE_VERSION_NAMESPACE
|
||||
namespace OPENVDB_VERSION_NAME {
|
||||
namespace points {
|
||||
|
||||
/// @cond OPENVDB_DOCS_INTERNAL
|
||||
|
||||
namespace rasterize_sdf_internal
|
||||
{
|
||||
|
||||
@@ -817,6 +819,8 @@ OPENVDB_NO_DEPRECATION_WARNING_END
|
||||
|
||||
} // namespace rasterize_sdf_internal
|
||||
|
||||
/// @endcond
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,8 @@ OPENVDB_USE_VERSION_NAMESPACE
|
||||
namespace OPENVDB_VERSION_NAME {
|
||||
namespace points {
|
||||
|
||||
/// @cond OPENVDB_DOCS_INTERNAL
|
||||
|
||||
namespace pca_internal {
|
||||
|
||||
#ifdef OPENVDB_PROFILE_PCA
|
||||
@@ -542,6 +544,7 @@ decomposeSymmetricMatrix(const math::Mat3<Scalar>& mat,
|
||||
|
||||
} // namespace pca_internal
|
||||
|
||||
/// @endcond
|
||||
|
||||
template <typename PointDataGridT>
|
||||
inline void
|
||||
|
||||
@@ -156,7 +156,7 @@ createLevelSetTubeComplex(const std::vector<math::Vec3<ScalarType>>& vertices,
|
||||
/// @param radii Radii specification for all tubes in world units.
|
||||
/// @param voxelSize Voxel size in world units.
|
||||
/// @param halfWidth Half the width of the narrow band, in voxel units.
|
||||
/// @param TubeRadiiPolicy Policies: per-segment, per-vertex, or automatic (default).
|
||||
/// @param radii_policy Policies: per-segment, per-vertex, or automatic (default).
|
||||
/// @param interrupter Interrupter adhering to the util::NullInterrupter interface.
|
||||
///
|
||||
/// @note @c GridType::ValueType must be a floating-point scalar.
|
||||
|
||||
@@ -167,7 +167,7 @@ meshToVolume(
|
||||
int flags = 0,
|
||||
typename GridType::template ValueConverter<Int32>::Type * polygonIndexGrid = nullptr,
|
||||
InteriorTest interiorTest = nullptr,
|
||||
InteriorTestStrategy interiorTestStrategy = EVAL_EVERY_VOXEL);
|
||||
InteriorTestStrategy interiorTestStrat = EVAL_EVERY_VOXEL);
|
||||
|
||||
|
||||
////////////////////////////////////////
|
||||
|
||||
@@ -42,7 +42,7 @@ OPENVDB_USE_VERSION_NAMESPACE
|
||||
namespace OPENVDB_VERSION_NAME {
|
||||
namespace tools {
|
||||
|
||||
/// Iterate over a grid and at each step call @c op(iter).
|
||||
/// @brief Iterate over a grid and at each step call @c op(iter).
|
||||
/// @param iter an iterator over a grid or its tree (@c Grid::ValueOnCIter,
|
||||
/// @c Tree::NodeIter, etc.)
|
||||
/// @param op a functor of the form <tt>void op(const IterT&)</tt>, where @c IterT is
|
||||
@@ -94,7 +94,7 @@ inline void foreach(const IterT& iter, const XformOp& op,
|
||||
bool threaded = true, bool shareOp = true);
|
||||
|
||||
|
||||
/// Iterate over a grid and at each step call <tt>op(iter, accessor)</tt> to
|
||||
/// @brief Iterate over a grid and at each step call <tt>op(iter, accessor)</tt> to
|
||||
/// populate (via the accessor) the given output grid, whose @c ValueType
|
||||
/// need not be the same as the input grid's.
|
||||
/// @param inIter a non-<tt>const</tt> or (preferably) @c const iterator over an
|
||||
|
||||
@@ -269,7 +269,7 @@ protected:
|
||||
/// @param step The step size for setting the XY range data, defaults to 1.
|
||||
/// @note Function to be implemented by derived classes to set XY range data.
|
||||
/// This function is called at most 4 times within @c iterate().
|
||||
void setXYRangeData(const Index&) {}
|
||||
void setXYRangeData([[maybe_unused]] const Index& step) {}
|
||||
|
||||
/// @brief Checks if the tile of a given dimension can possibly fit within the region.
|
||||
///
|
||||
@@ -281,13 +281,13 @@ protected:
|
||||
/// can't fit then @c iterate will not try to populate the level set with background
|
||||
/// tiles of this dimension.
|
||||
/// @return true if the tile can possibly fit; otherwise false.
|
||||
inline bool tileCanFit(const Index&) const { return true; }
|
||||
inline bool tileCanFit([[maybe_unused]] const Index& dim) const { return true; }
|
||||
|
||||
// distance in index space
|
||||
/// @brief Computes the signed distance from a point to the convex region in index space.
|
||||
///
|
||||
/// @param p The point in 3D space for which to compute the signed distance.
|
||||
inline ValueT signedDistance(const Vec3T&) const { return ValueT(0); }
|
||||
inline ValueT signedDistance([[maybe_unused]] const Vec3T& p) const { return ValueT(0); }
|
||||
|
||||
/// @brief Computes the signed distance for tiles in index space,
|
||||
/// considering the center of the tile.
|
||||
|
||||
@@ -93,7 +93,7 @@ public:
|
||||
///
|
||||
/// @param pt1 first endpoint of the capsule in world units
|
||||
/// @param pt2 second endpoint of the capsule in world units
|
||||
/// @param radius radius of the capsule in world units
|
||||
/// @param r radius of the capsule in world units
|
||||
template<typename ScalarType>
|
||||
void
|
||||
operator()(const math::Vec3<ScalarType>& pt1,
|
||||
@@ -1043,7 +1043,7 @@ public:
|
||||
/// @param segments segment indices in the tube complex
|
||||
/// @param radius radius of all tubes in world units
|
||||
/// @param voxelSize voxel size in world units
|
||||
/// @param background background value in voxel units
|
||||
/// @param halfWidth half-width value in voxel units
|
||||
/// @param interrupter pointer to optional interrupter. Use template
|
||||
/// argument util::NullInterrupter if no interruption is desired.
|
||||
TubeComplexVoxelizer(const std::vector<Vec3T>& vertices, const std::vector<Vec2I>& segments,
|
||||
|
||||
@@ -419,7 +419,7 @@ public:
|
||||
/// it should not be converted to a non-const pointer!
|
||||
const bool& getLastValue() const { if (mValueMask.isOn(SIZE-1)) return Buffer::sOn; else return Buffer::sOff; }
|
||||
|
||||
/// Return @c true if all of this node's voxels have the same active state
|
||||
/// @brief Return @c true if all of this node's voxels have the same active state
|
||||
/// and are equal to within the given tolerance, and return the value in
|
||||
/// @a constValue and the active state in @a state.
|
||||
bool isConstant(bool& constValue, bool& state, bool tolerance = 0) const;
|
||||
@@ -771,6 +771,7 @@ private:
|
||||
|
||||
////////////////////////////////////////
|
||||
|
||||
/// @cond OPENVDB_DOCS_INTERNAL
|
||||
|
||||
template<Index Log2Dim>
|
||||
inline
|
||||
@@ -1069,7 +1070,6 @@ LeafNode<bool, Log2Dim>::operator!=(const LeafNode& other) const
|
||||
|
||||
////////////////////////////////////////
|
||||
|
||||
|
||||
template<Index Log2Dim>
|
||||
inline bool
|
||||
LeafNode<bool, Log2Dim>::isConstant(bool& constValue, bool& state, bool tolerance) const
|
||||
@@ -1596,6 +1596,8 @@ LeafNode<bool, Log2Dim>::combine2(const LeafNode& b0, const OtherNodeT& b1, Comb
|
||||
}
|
||||
}
|
||||
|
||||
/// @endcond
|
||||
|
||||
|
||||
} // namespace tree
|
||||
} // namespace OPENVDB_VERSION_NAME
|
||||
|
||||
@@ -774,6 +774,7 @@ private:
|
||||
|
||||
////////////////////////////////////////
|
||||
|
||||
/// @cond OPENVDB_DOCS_INTERNAL
|
||||
|
||||
template<Index Log2Dim>
|
||||
inline
|
||||
@@ -1522,6 +1523,7 @@ LeafNode<ValueMask, Log2Dim>::combine2(const LeafNode& b0, const OtherNodeT& b1,
|
||||
}
|
||||
}
|
||||
|
||||
/// @endcond
|
||||
|
||||
} // namespace tree
|
||||
} // namespace OPENVDB_VERSION_NAME
|
||||
|
||||
@@ -1316,7 +1316,6 @@ public:
|
||||
|
||||
/// @brief Split constructor used by tbb (should rarely be called directly)
|
||||
/// @param other IteratorRange to be split
|
||||
/// @param tbb::split Dummy class used to create a unique signature for this constructor
|
||||
IteratorRange(IteratorRange& other, tbb::split):
|
||||
mIter(other.mIter),
|
||||
mGrainSize(other.mGrainSize),
|
||||
|
||||
@@ -314,7 +314,8 @@ TEST_F(TestAttributeArray, testAttributeArray)
|
||||
EXPECT_EQ(4.6, attr2.get(9));
|
||||
}
|
||||
|
||||
#ifdef NDEBUG
|
||||
// the following tests are not run when asserts are enabled
|
||||
#ifndef OPENVDB_ENABLE_ASSERTS
|
||||
{ // test setUnsafe and getUnsafe on uniform arrays
|
||||
AttributeArrayD::Ptr attr(new AttributeArrayD(50));
|
||||
|
||||
|
||||
@@ -383,8 +383,8 @@ TEST_F(TestPointDataLeaf, testOffsets)
|
||||
|
||||
TEST_F(TestPointDataLeaf, testSetValue)
|
||||
{
|
||||
// the following tests are not run when in debug mode due to assertions firing
|
||||
#ifdef NDEBUG
|
||||
// the following tests are not run when asserts are enabled
|
||||
#ifndef OPENVDB_ENABLE_ASSERTS
|
||||
LeafType leaf(openvdb::Coord(0, 0, 0));
|
||||
|
||||
openvdb::Coord xyz(0, 0, 0);
|
||||
|
||||
@@ -1794,9 +1794,10 @@ struct HaltOnSecondInterrupt : public util::NullInterrupter
|
||||
inline bool wasInterrupted(int percent = -1) override
|
||||
{
|
||||
(void)percent;
|
||||
if (mInterrupt) return true;
|
||||
mInterrupt = true;
|
||||
return false;
|
||||
bool expected = false;
|
||||
// Atomically: if mInterrupt is false, set it to true and return false
|
||||
// if mInterrupt is true, return true
|
||||
return !mInterrupt.compare_exchange_strong(expected, true);
|
||||
}
|
||||
std::atomic<bool> mInterrupt{false};
|
||||
};
|
||||
|
||||
@@ -175,10 +175,10 @@
|
||||
// This can be suppressed by defining OPENVDB_USE_FUTURE_ABI_<VERSION>=ON.
|
||||
// Note that, whilst the VDB CMake does not allow this option to be hit,
|
||||
// it exists to propagate this message to downstream targets
|
||||
#if OPENVDB_ABI_VERSION_NUMBER == 13
|
||||
#ifndef OPENVDB_USE_FUTURE_ABI_13
|
||||
PRAGMA(message("NOTE: ABI = 13 is still in active development and has not been finalized, "
|
||||
"define OPENVDB_USE_FUTURE_ABI_13 to suppress this message"))
|
||||
#if OPENVDB_ABI_VERSION_NUMBER == 14
|
||||
#ifndef OPENVDB_USE_FUTURE_ABI_14
|
||||
PRAGMA(message("NOTE: ABI = 14 is still in active development and has not been finalized, "
|
||||
"define OPENVDB_USE_FUTURE_ABI_14 to suppress this message"))
|
||||
#endif
|
||||
#else
|
||||
#error expected OPENVDB_ABI_VERSION_NUMBER <= OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER
|
||||
@@ -189,18 +189,18 @@
|
||||
// directive. This can be suppressed by defining OPENVDB_USE_DEPRECATED_ABI_<VERSION>.
|
||||
// Note that, whilst the VDB CMake does not allow this option to be hit,
|
||||
// it exists to propagate this message to downstream targets
|
||||
#ifndef OPENVDB_USE_DEPRECATED_ABI_10
|
||||
#if OPENVDB_ABI_VERSION_NUMBER == 10
|
||||
PRAGMA(message("NOTE: ABI = 10 is deprecated, define OPENVDB_USE_DEPRECATED_ABI_10 "
|
||||
"to suppress this message"))
|
||||
#endif
|
||||
#endif
|
||||
#ifndef OPENVDB_USE_DEPRECATED_ABI_11
|
||||
#if OPENVDB_ABI_VERSION_NUMBER == 11
|
||||
PRAGMA(message("NOTE: ABI = 11 is deprecated, define OPENVDB_USE_DEPRECATED_ABI_11 "
|
||||
"to suppress this message"))
|
||||
#endif
|
||||
#endif
|
||||
#ifndef OPENVDB_USE_DEPRECATED_ABI_12
|
||||
#if OPENVDB_ABI_VERSION_NUMBER == 12
|
||||
PRAGMA(message("NOTE: ABI = 12 is deprecated, define OPENVDB_USE_DEPRECATED_ABI_12 "
|
||||
"to suppress this message"))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/// By default, the @b OPENVDB_REQUIRE_VERSION_NAME macro is undefined, and
|
||||
/// symbols from the version namespace are promoted to the top-level namespace
|
||||
@@ -245,7 +245,7 @@ const uint32_t OPENVDB_ABI_VERSION = OPENVDB_ABI_VERSION_NUMBER;
|
||||
/// @brief The current version number of the VDB file format
|
||||
/// @details This can be used to enable various backwards compatibility switches
|
||||
/// or to reject files that cannot be read.
|
||||
const uint32_t OPENVDB_FILE_VERSION = 224;
|
||||
const uint32_t OPENVDB_FILE_VERSION = 225;
|
||||
|
||||
/// Notable file format version numbers
|
||||
enum {
|
||||
@@ -262,7 +262,8 @@ enum {
|
||||
OPENVDB_FILE_VERSION_NODE_MASK_COMPRESSION = 222,
|
||||
OPENVDB_FILE_VERSION_BLOSC_COMPRESSION = 223,
|
||||
OPENVDB_FILE_VERSION_POINT_INDEX_GRID = 223,
|
||||
OPENVDB_FILE_VERSION_MULTIPASS_IO = 224
|
||||
OPENVDB_FILE_VERSION_MULTIPASS_IO = 224,
|
||||
OPENVDB_FILE_VERSION_HALF_GRID = 225
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -20,9 +20,11 @@
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
/// @cond OPENVDB_DOCS_INTERNAL
|
||||
namespace llvm {
|
||||
class LLVMContext;
|
||||
}
|
||||
/// @endcond
|
||||
|
||||
namespace openvdb {
|
||||
OPENVDB_USE_VERSION_NAMESPACE
|
||||
|
||||
@@ -382,7 +382,7 @@ struct Arguments
|
||||
{
|
||||
Arguments() = default;
|
||||
|
||||
/// @biref Create a set of arguments from native arguments. The function
|
||||
/// @brief Create a set of arguments from native arguments. The function
|
||||
/// framework typically works on generic arguments types.
|
||||
explicit Arguments(const NativeArguments& args) {
|
||||
mArgs.reserve(args.size());
|
||||
@@ -1409,7 +1409,7 @@ struct OPENVDB_AX_API FunctionGroup
|
||||
/// @brief Verify the function signatures in this group.
|
||||
bool HasUniqueTypeSignatures(llvm::LLVMContext& C) const;
|
||||
|
||||
/// @brief Given a vector of llvm types, automatically returns the best
|
||||
/// @brief Given a vector of args, automatically returns the best
|
||||
/// possible function declaration from the stored function list. The
|
||||
/// 'best' declaration is determined by the provided types
|
||||
/// compatibility to each functions signature.
|
||||
@@ -1425,9 +1425,8 @@ struct OPENVDB_AX_API FunctionGroup
|
||||
/// virtual function, which is optional in LLVM 15 but required from
|
||||
/// LLVM 16.
|
||||
///
|
||||
/// @param types A vector of types representing the function argument types
|
||||
/// @param C The llvm context
|
||||
/// @param type If provided, type is set to the type of match that occurred
|
||||
/// @param args Args representing the function argument types
|
||||
/// @param C The llvm context
|
||||
std::pair<const Function*, Function::SignatureMatch>
|
||||
match(const ArgInfoVector& args, llvm::LLVMContext& C) const;
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
|
||||
struct TestPointExecutableAcc;
|
||||
|
||||
/// @cond OPENVDB_DOCS_INTERNAL
|
||||
namespace llvm {
|
||||
class ExecutionEngine;
|
||||
class LLVMContext;
|
||||
@@ -33,6 +34,8 @@ namespace orc {
|
||||
class LLJIT;
|
||||
}
|
||||
}
|
||||
/// @endcond
|
||||
|
||||
|
||||
namespace openvdb {
|
||||
OPENVDB_USE_VERSION_NAMESPACE
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
struct TestVolumeExecutableAcc;
|
||||
|
||||
/// @cond OPENVDB_DOCS_INTERNAL
|
||||
namespace llvm {
|
||||
class ExecutionEngine;
|
||||
class LLVMContext;
|
||||
@@ -32,6 +33,7 @@ namespace orc {
|
||||
class LLJIT;
|
||||
}
|
||||
}
|
||||
/// @endcond
|
||||
|
||||
namespace openvdb {
|
||||
OPENVDB_USE_VERSION_NAMESPACE
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
// Copyright Contributors to the OpenVDB Project
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/// @cond OPENVDB_DOCS_INTERNAL
|
||||
|
||||
/// @file math/OpenSimplexNoise.cc
|
||||
|
||||
#include "OpenSimplexNoise.h"
|
||||
@@ -713,3 +715,5 @@ template OPENVDB_AX_API double OSNoise::extrapolate(const OSNoise::inttype xsb,
|
||||
template OPENVDB_AX_API double OSNoise::eval(const double x, const double y, const double z) const;
|
||||
|
||||
} // namespace OSN
|
||||
|
||||
/// @endcond
|
||||
|
||||
@@ -73,6 +73,8 @@ void curlnoise(double (*out)[3], double x, double y, double z)
|
||||
}
|
||||
}
|
||||
|
||||
/// @cond OPENVDB_DOCS_INTERNAL
|
||||
|
||||
namespace OSN
|
||||
{
|
||||
|
||||
@@ -145,6 +147,8 @@ private:
|
||||
int mPermGradIndex [256];
|
||||
};
|
||||
|
||||
/// @endcond
|
||||
|
||||
}
|
||||
|
||||
#endif // OPENVDB_AX_MATH_OPEN_SIMPLEX_NOISE_HAS_BEEN_INCLUDED
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
OpenVDB AX:
|
||||
New:
|
||||
- Added support for LLVM 21.
|
||||
@@ -1,3 +0,0 @@
|
||||
API changes:
|
||||
- Add LeafBuffer<bool, Log2Dim>::storage() for direct const access to the
|
||||
raw data buffer when using the bool LeafNode.
|
||||
@@ -1,13 +0,0 @@
|
||||
API changes:
|
||||
- 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.
|
||||
|
||||
Houdini:
|
||||
Improvements:
|
||||
- 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.
|
||||
@@ -0,0 +1,7 @@
|
||||
OpenVDB:
|
||||
New features:
|
||||
- Incorporated doxygen-awesome to OpenVDB's doxygen builds to modernise and improve the html output.
|
||||
|
||||
Improvements:
|
||||
- Added a new root ext/ folder to house imported third-party tools, along with a THIRD-PARTY.md
|
||||
document detailing all imported licenses.
|
||||
@@ -1,2 +0,0 @@
|
||||
API changes:
|
||||
- Add InternalNode::setValueMaskUnsafe() to write a value mask directly.
|
||||
@@ -1,34 +0,0 @@
|
||||
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.
|
||||
@@ -1,7 +0,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+.
|
||||
|
||||
API changes:
|
||||
- LegacyFrustum and RootNodeMask have been removed. These classes were only
|
||||
used for reading old .vdb files, which is no longer supported.
|
||||
@@ -1,7 +0,0 @@
|
||||
OpenVDB:
|
||||
New features:
|
||||
- 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.
|
||||
@@ -1,5 +0,0 @@
|
||||
OpenVDB:
|
||||
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).
|
||||
@@ -1,3 +0,0 @@
|
||||
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.
|
||||
@@ -1,11 +0,0 @@
|
||||
OpenVDB:
|
||||
Build:
|
||||
- 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.
|
||||
@@ -1,3 +0,0 @@
|
||||
API Changes:
|
||||
- io::writeCompressedValues() now takes a const ValueT* source buffer for
|
||||
improved const-correctness.
|
||||
Reference in New Issue
Block a user